1.程序分析
相信大家都知道贪吃蛇这款游戏,它是一款经典的手机游戏。通过控制蛇头方向吃食物,使得蛇变长,从而获得积分,既简单又耐玩。通过上下左右键控制蛇的方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,就能过关,然后继续玩下一关。
1.1 模块设计
在本游戏中,从键盘输入来获取移动方向和蛇的移动的关系
1.2 模块描述蛇的初始化
蛇的初始化实际就是二维数组的初始化,该二维数组存储两个值,里面包含该蛇身体的坐标信息,它出现的初始位置是横纵坐标的中间位置。
蛇的移动
蛇的移动是通改变二维数组坐标位置来实现的,例如当蛇向右前进一个单位,则将尾每一个身体位置的坐标更改,同时改变蛇头、蛇身以及蛇尾的方向。这样整体来看来蛇就前进了一个单位。
蛇的增长
当蛇吃了正常食物后,蛇的长度会增加,增加蛇的长度就是在食物的位置增加一个二维数组并且将这个位置变为蛇头。
蛇的死亡
当蛇撞上障碍物、自身或者通关时,蛇会死亡,蛇死亡就是二维数组的销毁。
食物的产生
食物出现的位置产生都是随机的,这些因素由通过随机函数获取的随机数决定。食物的位置不能出现在障碍物和边界上。
控制键盘输入
通过获取键盘输入的W/w(上)、 S/s(下)、 A/a(左)、 D/d(右)来改变蛇模块中移动方向,从而影响蛇的移动方向。
2.项目实现 2.1 创建源文件和头文件
2.2代码实现
2.2.1 贪吃蛇.h部分
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include #include #include #include #include #define WIDE 60 //宽度 #define HIGH 20 //高度 //0.蛇的结构体 struct Body { int X; int Y; }; //1.定义蛇对象 struct Snack { struct Body body[WIDE * HIGH]; int size; }snake; //2.定义食物对象 struct Food { int X; int Y; }food; //3.分数 int score = 0; //4.声明化蛇函数 void InitSnake(); //5.声明食物函数 void InitFood(); //6.用户输入awsd按键时对应的坐标 int kx = 0; int ky = 0; //7.蛇的尾部坐标 int lastX = 0; int lastY = 0; //8.间歇时间 int sleeptime = 300;
2.2.2 贪吃蛇.c部分
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include #include #include #include #include #include #include #include "贪吃蛇.h" //9.打印分数 void ShowScore() { //3.移走光标 COORD coord; coord.X = 0; coord.Y = HIGH + 2; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); printf("Game Over!n"); printf("成绩为:%dn", score); } //8.画墙 void InitWall() { for (size_t i = 0; i <= HIGH; i++) { for (size_t j = 0; j <= WIDE; j++) { if (j == WIDE) { printf("|"); } else if (i == HIGH) { printf("_"); } else { printf(" "); } } printf("n"); } } //4.定义初始化蛇函数 void InitSnake() { snake.size = 2; snake.body[0].X = WIDE / 2; //蛇头初始化 snake.body[0].Y = HIGH / 2; snake.body[1].X = WIDE / 2 - 1; //蛇身初始化 snake.body[1].Y = HIGH / 2; } //5.食物的初始化 void InitFood() { food.X = rand() % WIDE; //0-59 food.Y = rand() % HIGH; //0-59 } //6.初始化界面控件 void InitUI() { //1.画蛇 COORD coord; for (size_t i = 0; i < snake.size; i++) { coord.X = snake.body[i].X; coord.Y = snake.body[i].Y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); if (i == 0) { putchar('@'); } else { putchar('*'); } } //去除蛇尾 coord.X = lastX; coord.Y = lastY; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); putchar(' '); //2.画食物 coord.X = food.X; coord.Y = food.Y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); putchar('#'); } //7.启动游戏 void PlayGame() { char key = 'd'; //1.判断蛇撞墙 while (snake.body[0].X >= 0 && snake.body[0].X < WIDE && snake.body[0].Y >= 0 && snake.body[0].Y < HIGH) { InitUI(); //更新蛇 //2.接受用户按键输入 if (_kbhit()) { key = _getch(); } switch (key) { case 'w':kx = 0; ky = -1; break; case 's':kx = 0; ky = +1; break; case 'd':kx = +1; ky = 0; break; case 'a':kx = -1; ky = 0; break; default: break; } //3.蛇撞身体 for (size_t i = 1; i < snake.size; i++) { if (snake.body[0].X == snake.body[i].X && snake.body[0].Y == snake.body[i].Y) { return; //游戏结束 } } //4.蛇撞食物 if (snake.body[0].X == food.X && snake.body[0].Y == food.Y) { InitFood(); //食物消失 snake.size++; //身体增长 score = score + 10; //加分 sleeptime = sleeptime - 10; //加速 } //5.1存储蛇尾坐标 lastX = snake.body[snake.size - 1].X; lastY = snake.body[snake.size - 1].Y; //5.蛇移动 for (size_t i = snake.size - 1; i > 0; i--) { snake.body[i].X = snake.body[i - 1].X; snake.body[i].Y = snake.body[i - 1].Y; } snake.body[0].X = snake.body[0].X + kx; snake.body[0].Y = snake.body[0].Y + ky; Sleep(sleeptime); } return;//游戏结束 } int main() { CONSOLE_CURSOR_INFO cci; cci.dwSize = sizeof(cci); cci.bVisible = FALSE; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); srand(time(NULL)); //播种随机种子 InitSnake(); //初始化蛇 InitWall(); //画墙 InitFood(); //初始化食物 InitUI(); //画食物和蛇 //3.移走光标 COORD coord; coord.X = WIDE + 2; coord.Y = HIGH; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); printf("方向键:W、S、A、Dn"); PlayGame(); //启动游戏 ShowScore(); //打印份数 system("pause"); return 0; }



