【C语言项目】贪吃蛇游戏(下)
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++交流群

【C语言项目】贪吃蛇游戏(下)的更多相关文章
- C语言实现贪吃蛇游戏
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/times.h> ...
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- 【C语言项目】贪吃蛇游戏(上)
目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) 3.5 欢迎界面函 ...
- 贪吃蛇游戏(printf输出C语言版本)
这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 贪吃蛇游戏——C语言双向链表实现
采用了双向链表结点来模拟蛇身结点: 通过C语言光标控制函数来打印地图.蛇身和食物: /************************** *************************** 贪吃 ...
- Linux平台下贪吃蛇游戏的运行
1.参考资料说明: 这是一个在Linux系统下实现的简单的贪吃蛇游戏,同学找帮忙,我就直接在Red Hat中调试了一下,参考的是百度文库中"maosuhan"仁兄的文章,结合自己的 ...
- Love2D游戏引擎制作贪吃蛇游戏
代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查 ...
- 基于React的贪吃蛇游戏的设计与实现
代码地址如下:http://www.demodashi.com/demo/11818.html 贪吃蛇小游戏(第二版) 一年半前层用react写过贪吃蛇小游戏https://github.com/ca ...
随机推荐
- 坑暗花明:又遇 .NET Core 中 System.Data.SqlClient 查询缓慢的问题
之前发布过一篇博文 下单快发货慢:一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问题,当时遇到的问题是从 SQL Server 2008 R2 中查询获取 100 条记录竟然耗时 ...
- hihocoder #1335 : Email Merge(map+sort)
传送门 题意 分析 每次插入人名与邮箱的时候,做一次并查集,然后做一次sort即可 trick 3 a 1 first@hihocoder.com b 1 second@hihocoder.com c ...
- [Xcode 实际操作]二、视图与手势-(2)UIView视图的层次关系
目录:[Swift]Xcode实际操作 本文将演示创建三个视图对象,其中第二个视图是第三个视图的父视图. 现在开始编写代码,实现这项功能 import UIKit class ViewControll ...
- JIRA中的标记语言的语法参考
前言 看到网上有的文章说JIRA是使用Textile这门标记语言,有些语法和Wikitext和Markdown相像.JIRA在2017年进行了一次大更新,某些语法可能和以前不大一样,这里纪录一下常用的 ...
- 如何使用Tomcat自带的日志实现tomcat-juli.jar
前言 Tomcat自带的日志实现是tomcat-juli.jar,它是对默认的JDK日志java.util.logging进行一定的封装,和标准JDK日志支持相同的配置,但是和log4j等常用的日志框 ...
- PostgreSQL - 查询表结构和索引信息
前言 PostgreSQL的表一般都是建立在public这个schema下的,假如现在有个数据表t_student,可以用以下几种方式来查询表结构和索引信息. 使用\d元命令查看表字段信息和索引信息 ...
- 《Python网络爬虫相关基础概念》
爬虫介绍 引入 之前在授课过程中,好多同学都问过我这样的一个问题:为什么要学习爬虫,学习爬虫能够为我们以后的发展带来那些好处?其实学习爬虫的原因和为我们以后发展带来的好处都是显而易见的,无论是从实际的 ...
- 080 Remove Duplicates from Sorted Array II 从排序阵列中删除重复 II
“删除重复项目” 的进阶:如果重复最多被允许两次,又该怎么办呢?例如:给定排序数列 nums = [1,1,1,2,2,3]你的函数应该返回长度为 5,nums 的前五个元素是 1, 1, 2, 2 ...
- Solr查询中涉及到的Cache使用及相关的实现【转】
转自:http://www.cnblogs.com/phinecos/archive/2012/05/24/2517018.html 本文将介绍Solr查询中涉及到的Cache使用及相关的实现.Sol ...
- 安装linux时的分区问题,需要了解目录树及挂载知识
Linux是目录树架构,如何结合目录树架构与磁盘内的数据→挂载. Linux先有目录,后有磁盘分区.数据(文件)依存于目录. 目录为挂载点,磁盘分区的数据放置在该目录下,进入该目录,就可以读取该分区. ...