目录
00. 目录
07. 游戏逻辑
7.5 按下ESC键结束游戏
在moveKeyControl函数中添加如下代码片段
//按下F2减速 if (GetAsyncKeyState(VK_F2)) { speedDown(); } //按下ESC键 结束游戏 if (GetAsyncKeyState(VK_ESCAPE)) { endStatus = 3; break; }
7.6 判断是否撞到墙
参考代码:
//判断是否撞墙int isHitWall(void){ if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26) { return 1; }}
在snake.c文件moveKeyControl函数中添加如下代码
Sleep(sleepTime); moveSnake(); //判断是否撞墙 if (isHitWall()) { endStatus = 1; break; }
7.7 判断是否咬到自己
判断是否咬到自己
//判断是否咬到自己int isBitSelf(void){ snake_t *tmp = NULL; tmp = head->next; while (NULL != tmp) { if (tmp->x == head->x && tmp->y == head->y) { return 1; } tmp = tmp->next; } return 0;}
在snake.c文件moveKeyControl函数中添加如下代码
//判断是否撞墙 if (isHitWall()) { endStatus = 1; break; } //判断是否咬到自己 if (isBitSelf()) { endStatus = 2; break; }
08. 游戏失败界面设计
8.1 游戏失败界面边框设计
游戏边框失败界面分析
参考源代码
//游戏失败界面边框void failGameUi(void){ int i; system("cls"); //显示游戏失败提示 setColor(12); gotoXY(44, 3); printf("游 戏 失 败!!!"); setColor(11); gotoXY(17, 5); //绘制上边框 printf("+----------------------------------------------------------------+"); //绘制下边框 gotoXY(17, 20); printf("+----------------------------------------------------------------+"); //绘制左右边框 for (i = 6; i < 20; i++) { gotoXY(17, i); printf("|"); gotoXY(82, i); printf("|"); }}
在moveKeyControl函数中按下ESC选项中添加如下代码
//按下ESC键 结束游戏 if (GetAsyncKeyState(VK_ESCAPE)) { endStatus = 3; failGameUi(); break; }
8.2 撞墙失败界面
显示效果如下:
界面分析
参考代码:
//结束游戏int endGame(void){ int n; int highScore; //显示游戏失败边框 failGameUi(); setColor(12); //根据不同的状态显示不同的失败提示 switch (endStatus) { //撞到墙 case 1: gotoXY(38, 9); printf("您撞到墙了,游戏结束!!!"); break; //咬到自己 case 2: break; //用户按下ESC退出 case 3: break; default: ; } //显示您的得分 gotoXY(43, 12); setColor(13); printf("您的得分: %d", score); //从文件中读取最高分 highScore = readFile(); if (score > highScore) { setColor(10); gotoXY(38, 16); printf("恭喜你, 你已经创记录了,"); //写文件 //writeFile(score); } else { setColor(10); gotoXY(38, 16); printf("加油哦,离最高分还差%d分", highScore - score); } return 0;}
8.3 咬到蛇身失败界面
显示效果如下:
在endGame函数中修改代码如下
//结束游戏int endGame(void){ int n; int highScore; //显示游戏失败边框 failGameUi(); setColor(12); gotoXY(38, 9); //根据不同的状态显示不同的失败提示 switch (endStatus) { //撞到墙 case 1: printf("您撞到墙了,游戏结束!!!"); break; //咬到自己 case 2: printf("您咬到蛇身了,游戏结束!"); break; //用户按下ESC退出 case 3: break; default: ; } //显示您的得分 gotoXY(43, 12); setColor(13); printf("您的得分: %d", score); //从文件中读取最高分 highScore = readFile(); if (score > highScore) { setColor(10); gotoXY(38, 16); printf("恭喜你, 你已经创记录了,"); //写文件 //writeFile(score); } else { setColor(10); gotoXY(38, 16); printf("加油哦,离最高分还差%d分", highScore - score); } return 0;}
8.4 ESC结束游戏界面
显示效果:
在endGame函数中修改代码如下
//结束游戏int endGame(void){ int n; int highScore; //显示游戏失败边框 failGameUi(); setColor(12); gotoXY(38, 9); //根据不同的状态显示不同的失败提示 switch (endStatus) { //撞到墙 case 1: printf("您撞到墙了,游戏结束!!!"); break; //咬到自己 case 2: printf("您咬到蛇身了,游戏结束!"); break; //用户按下ESC退出 case 3: printf("您已经结束了游戏,游戏结束"); break; default: ; } //显示您的得分 gotoXY(43, 12); setColor(13); printf("您的得分: %d", score); //从文件中读取最高分 highScore = readFile(); if (score > highScore) { setColor(10); gotoXY(38, 16); printf("恭喜你, 你已经创记录了,"); //写文件 //writeFile(score); } else { setColor(10); gotoXY(38, 16); printf("加油哦,离最高分还差%d分", highScore - score); } return 0;}
8.5 界面添加选择
显示效果如下:
界面分析
代码实现
//结束游戏int endGame(void){ int n; int highScore; while (1) { //显示游戏失败边框 failGameUi(); setColor(12); gotoXY(38, 9); //根据不同的状态显示不同的失败提示 switch (endStatus) { //撞到墙 case 1: printf("您撞到墙了,游戏结束!!!"); break; //咬到自己 case 2: printf("您咬到蛇身了,游戏结束!"); break; //用户按下ESC退出 case 3: printf("您已经结束了游戏,游戏结束"); break; default: ; } //显示您的得分 gotoXY(43, 12); setColor(13); printf("您的得分: %d", score); //从文件中读取最高分 highScore = readFile(); if (score > highScore) { setColor(10); gotoXY(38, 16); printf("恭喜你, 你已经创记录了,"); //写文件 //writeFile(score); } else { setColor(10); gotoXY(38, 16); printf("加油哦,离最高分还差%d分", highScore - score); } //输出用户选择信息 gotoXY(25, 23); setColor(12); printf("在玩一局请输入: 1"); gotoXY(52, 23); printf("直接退出请输入:2"); gotoXY(46, 25); setColor(11); printf("请选择:"); scanf("%d", &n); getchar(); if (1 == n) { score = 0; sleepTime = 350; add = 1; break; } else if (2 == n) { exit(0); } else { gotoXY(30, 27); setColor(12); printf("您的输入有误, 请重新输入, 按下任意键继续"); getchar(); } } return 0;}
8.6 写文件实现
//写文件int writeFile(int score){ FILE *fp = NULL; fp = fopen("save.txt", "w+"); fprintf(fp, "%d", score); fclose(fp); return 0;}
在endGame函数中,如果破纪录了就写文件
if (score > highScore) { setColor(10); gotoXY(38, 16); printf("恭喜你, 你已经创记录了,"); //写文件 writeFile(score); }
09. 一起来找茬
//销毁蛇int destroySnake(void){ snake_t *tmp = NULL; snake_t *save = NULL; tmp = head; while (NULL != tmp) { save = tmp->next; free(tmp); tmp = save; } head = NULL; return 0;}
10. 项目扩展
设置关卡
蛇移动速度
保存每一个用户的得分信息
排名榜
11. 项目总结
基础知识: C语言 数据结构中简单单向链表
大学生C/C++交流群