关于贪吃蛆

Maggot

选题

基于贪吃蛇的一个控制台小游戏

设计内容

长尾蛆我是写了三个版本的

Github地址

1.0

​ 只是为了验证我逻辑的正确性

最后证明是错的

2.0

​ 改变了重刷闪烁现象

3.0

​ 加入了introduce

​ 加入了几个不同的难度等级

​ 还有速度随机变化的魔改版

​ 有一个记分栏(以活着时间和吃掉的食物为记分标准);

​ 添加了排行榜,可以输出本地用户前三名(默认是Maozu);

​ 隐藏了光标使屏幕完全不闪烁;

​ 打成两个文件使main函数不那么冗长

设计思路

创建一个二维数组将代表边框,蛆,和食物分别赋值

按照特定的值对应的字符将其打印出来

每隔一定的时间(不同难度时间不同,魔改版时间随机)

判断是否有键盘输入

if (kbhit())

如果有输入为wasd则将几何化的数组上左下右位置的元素

判断元素是代表的值是否为墙壁或是身体

如若不是

将其赋值为蛆的头(即蛆的长度)

蛆的身体全部减一(这样顺手也消灭了尾部)

(整只蛆的赋值以此减一,如4321,其中头为4)

如果没有输入,则按原方向移动

如若是

显示已死亡

【您已经很优秀了】

遇到困难

  • 将头设置为特定值,尾设置为特定值运动时头去特定位置如果吃到食物尾不动,吃不到食物尾就消失,但是这个想法有一个致命的缺点是,尾消失之后就再也不会再有了,而蛆还会一直运动,持续增长

    • 解决方案
    1. 彻底改变成为链表,蛆的每一段身体使之为节点,指向null的为尾部
    2. 创建二维结构体数组,使其中包含上一节蛆的位置,删除尾的同时使尾的上一节赋值为尾的特征值
    3. 将蛆的长度存起来,使其逐次递减,蛆的头改变位置而身体依次减一(空旷地方特征值为0)
  • 用了全角符号●和■因为其长宽比例与其他字符不同而导致很多无法预料的后果,比如从身体中间长出一个头,扭动如蛆虫(长尾蛆名字的来源),冲散食物等现象

    • 解决方案
      1. 将所有字符转化为全角字符 . 将蛆的身体转化为普通字符
  • system("cls");反复重刷导致屏幕闪烁现象

    • 解决方案

      gotoxy(0, 0);
      void gotoxy(int x,int y) {
          HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
          COORD pos;
          pos.X = x;
          pos.Y = y;
          SetConsoleCursorPosition(handle,pos);
      }
      

      使光标移到起始位置重新打印

  • 生成食物的时候由于调用随机数使食物生成在蛆的身上

    • 解决方案

      判断生成元素几何位置是否合法,非法时重新调用随机数,直到合法为止

参考文献