俄罗斯方蟹 = Crab(蟹)+ Tetris(俄罗斯方块),是一个用C语言实现的俄罗斯方块游戏,只能在终端横着走。

GitHub: https://github.com/wsgggws/Crabtris

游戏截图

Crabtris

设计说明

  1. 该蟹身长 22 坐标点,宽 10 坐标点。
  2. 方块向右前进,可上下移动与旋转。
  3. 没有开始选项。
  4. 没有暂停选择。
  5. 结束只能Ctrl+c。
  6. 能消列,但不计分数,只看能玩多久
  7. 蟹如人生呀,戏T!

实现说明

  1. 用一个二维数组表示俄罗斯地图,可视的只有22,另外3行隐藏,以便随机产生新的方块。

    (0,0)--------------->x(WIDTH)
    |
    | .
    |
    |y(HIGHT)
    
  2. 地图元素有哪些组成。

    1. 固定的方块
    2. 移动的方块
    3. 加锚点的空气
    4. 边界
  3. 方块用4个坐标点表示,可以列出有7种方块。不同的元素输出不同的字符。

  4. 如何出现动画? 每秒都从终端的坐标点(0,0)开始输出,每秒输出的内容不一样,就形成了动画。这需要使用到termios 库。

  5. 如何监听键盘输入 需要设置终端以非阻塞读取输入,根据输入重新生成地图,即改变二维数组里每个元素的值。并重新从(0,0)输出。

  6. 每秒向右移动如何实现

    1. 每个坐标点的X坐标加一操作,赋值给一个临时方块保存。
    2. 地图里旧的坐标点都设置为空气,地图里临时保存方块的坐标设置为移动方块。
    3. 向上下左右移动类似。但都需要在移动前检查移动位置的有效性(是否超越了地图,新位置是否已经有固定了的方块。
  7. 向上平移效果 在向上下平衡时,需要设置加一个缓冲等待时间(默认是每次等待一秒刷新地图的),以实现平移效果,而不是平移加向右的别扭效果。

  8. 如何清行 在每次移动的方块变成固定的方块后,尝试清行,即检查每一列是否都为固定的方块。如发现可消的列,前面所有的列往后移动,并继续从该列开始检查,可只检查4次,毕竟一次操作最多只能消除4列,当然,为了函数简便,我检查了所有列。

  9. 如何计分 不计分,游戏开始时有个开始时间,当游戏结束时,两时间相减,即为你能玩的时间,也可以说是你浪费的时间。

  10. 如何结束游戏 不会检查固定的列是否到达了顶点,它会一直产生新的方块,永无止境。按ctrl+c通过信号强制结束程序。

  11. 游戏结束之后做什么 从游戏本身来说,它需要恢复原生的 terminal 运行环境。对于玩者来说:“这算什么蟹T游戏”