c++控制台贪吃蛇

尝试用c++写一个控制台的贪吃蛇,代码水平有限,最终实现效果不佳。

大致框架

1.地图的存储:使用一个二维整形数组存储地图情况。
2.地图的显示:根据数组内容打印显示地图,其中1=墙 0=空 2=蛇头 3=蛇身 4=果子。
3.蛇的存储:使用队列存储蛇体,每次移动根据方向队列一进一出,若吃到果子则只进不出,蛇身长度加一。
4.输入:使用wasd对应上下左右。注:若输入方向与原方向相同或相反则输入无效。

具体代码实现

1.地图与方向初始化

int map[12][12],dir=115,dirbe=115;
            for (int i = 0; i < 12; i++)
                for (int j = 0; j < 12; j++)
                {
   
                    map[i][j] = 0;
                }
            for (int i = 1; i < 11; i++)
            {
   
                map[1][i] = 1;
                map[10][i] = 1;
                map[i][1] = 1;
                map[i][10] = 1;
            }//初始地图和方向

2.蛇体初始化

snake *dzy=new snake;
dzy->head = dzy->tail = new snakenode;
dzy->head->x = dzy->head->y = 5;
dzy->head->next = NULL;//初始蛇身

蛇体定义如下:

class snakenode
{
   
public:
    int x;
    int y;
    snakenode* next;
};//存储蛇身结点对应的xy坐标以及下一个结点的指针

class snake
{
   
public:
    snakenode* head;
    snakenode* tail;
    void tailin(int a, int b)
    {
   
        snakenode* newnode = new snakenode;
        newnode->x = a;
        newnode->y = b;
        newnode->next = NULL;
        tail->next = newnode;
        tail= newnode;
    }//队列尾入
    void headout()
    {
   
        snakenode* p = head;
        head = head->next;
        free(p);
    }//队列头出
};//蛇的头尾位置以及入与出的函数

3.地图打印
只需根据地图数组内容打印即可

void printmap(int a[12][12])
{
   
    for (int i = 0; i < 12; i++)
    {
   
        for (int j = 0; j < 12; j++)
            if (a[i][j] == 0)
                cout << "  ";
            else if (a[i][j] == 1)
                cout << "■";
            else if (a[i][j] == 2)
                cout << "●";
            else if (a[i][j] == 3)
                cout << "○";
            else if (a[i][j] == 4)
                cout << "♂";
        cout << '\n';
    }
}

4.键盘输入

//键盘输入方向模块a97 w119 d100  s115 
if (_kbhit())
{
   
      dirbe = dir;
      dir = _getch();
      if (dir - dirbe == 3 || dir - dirbe == 4 || dir - dirbe == -3 || dir - dirbe == -4)
          dir = dirbe;//用于判断输入方向与原方向是否相同或相反
}

5.生成果子

//生成果子模块
        
while (frt == 0)
{
   
      frtx = rand() % 9 + 2;
      frty = rand() % 9 + 2;
      if (map[frtx][frty] == 0)
      {
   
            map[frtx][frty] = 4;
            frt = 1;//若随机位置为空则生成果子并置果子存在符为1
      }
}//使用随机数生成果子位置

6.更新蛇体模块
根据方向以及蛇头下一步位置的类型来决定如何更新蛇体

//更新蛇体模块
                switch (dir)
                {
   
                case 119:if (map[dzy->tail->x - 1][dzy->tail->y] == 0)
                    {
   
                        dzy->tailin(dzy->tail->x - 1, dzy->tail->y);
                        dzy->headout();
                    }
                        else if (map[dzy->tail->x - 1][dzy->tail->y] == 1 || map[dzy->tail->x - 1][dzy->tail->y] == 3)
                {
   
                    if(dzy->tail->x - 1!=dzy->head->x|| dzy->tail->y!=dzy->head->y)
                    gameend = 1;
                    else {
   
                        dzy->tailin(dzy->tail->x - 1, dzy->tail->y);
                        dzy->headout();
                        }
                    //break;
                }

                    else if (map
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值