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++交流群

最新文章

  1. git clone Linux 源码并切换TAG
  2. buildroot--uboot&amp;kernel&amp;rootfs全编译工具
  3. XPath 简介
  4. angular-笔记
  5. 转:ADO.NET连接字符串
  6. MVC中Action的执行过程
  7. ecshop /includes/modules/payment/alipay.php SQL Injection Vul
  8. 4.2.1 网络请求之HTTP
  9. JSP 使用
  10. HDU3586 Information Disturbing(树形DP)
  11. oracle中的dual表详解
  12. Xcode-01ARC / Block
  13. Bootstrap_Javascript_弹出框
  14. [.NET | 發佈] 如何指定固定的目錄給程式調用的外部DLL?
  15. 第三课3、ROS的launch文件
  16. Weex系列一、构建Weex工程
  17. 关于压缩jar包时提示*.*没有这个文件或目录的问题以及解决办法:
  18. JShell脚本工具
  19. 2018-2019-2 20175317 实验一《Java开发环境的熟悉》实验报告
  20. 《maven in action》部分知识点总结

热门文章

  1. 如何实现Ant design表单组件封装?
  2. 兼容主流浏览器的渐变颜色背景gradient的写法
  3. bzoj1475:方格取数
  4. 测试 | 单元测试工具 | JUnit
  5. JMeter提取和重用作为变量 - 具有更多提取器
  6. python 基础(十五) socket编程
  7. laravel配合swoole使用总结
  8. bzoj2818: Gcd懵逼乌斯反演
  9. bzoj 4318 || 洛谷P1654 OSU!
  10. Solr的SolrCloud与Master-slave主从模式对比