前言
本次练习用于巩固C语言数据结构中的链表,实现贪吃蛇的基本功能。
整体思路
- 打印边框
- 生成食物与蛇身移动
- 控制方向
- 结束游戏
while (1)
{
Handle_key(); //按键处理
Frame_Buff(data); //画边框
Eat_Food(); //吃食物
Sleep(100);
Map_Set_Buff(data); //缓冲区画蛇的位置
Sleep(100);
//---------------------- 越界、碰撞退出-------------------
if (head->next->Frame_X >= 20 || head->next->Frame_Y >= 50 || head->next->Frame_X < 1 || head->next->Frame_Y < 1 || Snake_Collision())
break;
}
return 0;
}
一、画边框
利用一个打印函数生成边框:
void Frame(char a[][LENGTH]) //画边框
{
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COLUMN; j++)
{
if (a[i][j] == '*') //防止食物被覆盖
continue;
if (i == 0 || i == ROW - 1)
{
a[i][j] = '*';
}
else
a[i][j] = ' ';
}
}
for (j = 0; j < COLUMN; j++)
{
for (i = 1; i < ROW - 1; i++)
{
if (a[i][j] == '*')
continue;
if (j == 0 || j == COLUMN - 1)
{
a[i][j] = '*';
}
else
a[i][j] = ' ';
}
}
}
边框形状的选择可以按自己喜欢的来
二、画蛇并使其移动
1、清屏与休眠
通常我们都会使用system(“cls”) 函数清屏,但由于清屏速度过快会导致闪屏,看起来不舒服,因此采取了双缓冲控制台防闪屏技术,可以打开下面链接进行学习。
https://blog.csdn.net/weixinhum/article/details/72179593
2、蛇身移动
我使用的是链表来存储蛇身。首先是头节点移动,在X、Y上加一(根据蛇移动的方向,之后就是前一个节点的值赋值给后一个节点,最后一个节点留下来内容就清空。为了存储上一节点的蛇的信息,我用了一个数组存储,记住上一个节点的坐标。
//将当前节点的内容赋值给数组
ago_data_x[i] = p->Frame_X; //储存上一个节点的值
ago_data_y[i] = p->Frame_Y;
//将上一个节点的赋值给当前节点
p->Frame_X = ago_data_x[i - 1];
p->Frame_Y = ago_data_y[i - 1];
data[p->Frame_X][p->Frame_Y] = '*';
p = p->next;
这样一来就可以让蛇移动起来了。
三、控制蛇并生成食物
1、键盘输入
到这里了,我们要开始控制蛇了,这个时候我们需要使用到获取输入的函数_kbhit() ,还有和它一起的函数 _getch()负责监听。
char c;
if(_kbhit())
c = _getch();
2、生成食物
使用rand()函数,以及与其配套使用产生随机数种子srand((int)time(NULL))。
void Creat_Food()
{
food_x = rand() % ROW + 1;
food_y = rand() % COLUMN + 1;
data[food_x][food_y] = '*';
}
四、改变方向
蛇身我采用的是链表存储,插入节点的方法我使用的是头插法。我把要移动的方向存储在头节点中,因此只要访问头节点就可以知道蛇是往哪个方向移动的。
//MOVE:获取键盘输入后返回的值
//p->path:移动方向
p = head->next;
if (MOVE == 1) //向上
{
if (p->path != 2) //避免相反可以移动
{
p->path = 1;
}
}
五、结束语
好了,就写到这里了。其实一步一步去完成还是挺简单的,遇到不懂可以评论以及查找资料。另外,还有很多东西可以扩展,比如界面、加速行驶、以及增加难度…还是那句话,纸上得来终觉浅,绝知此事要躬行。