尝试用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