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语言项目】贪吃蛇游戏(下)的更多相关文章

  1. C语言实现贪吃蛇游戏

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/times.h> ...

  2. 小项目特供 贪吃蛇游戏(基于C语言)

    C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...

  3. 【C语言项目】贪吃蛇游戏(上)

    目录 00. 目录 01. 开发背景 02. 功能介绍 03. 欢迎界面设计 3.1 常用终端控制函数 3.2 设置文本颜色函数 3.3 设置光标位置函数 3.4 绘制字符画(蛇) 3.5 欢迎界面函 ...

  4. 贪吃蛇游戏(printf输出C语言版本)

    这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...

  5. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  6. 贪吃蛇游戏——C语言双向链表实现

    采用了双向链表结点来模拟蛇身结点: 通过C语言光标控制函数来打印地图.蛇身和食物: /************************** *************************** 贪吃 ...

  7. Linux平台下贪吃蛇游戏的运行

    1.参考资料说明: 这是一个在Linux系统下实现的简单的贪吃蛇游戏,同学找帮忙,我就直接在Red Hat中调试了一下,参考的是百度文库中"maosuhan"仁兄的文章,结合自己的 ...

  8. Love2D游戏引擎制作贪吃蛇游戏

    代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查 ...

  9. 基于React的贪吃蛇游戏的设计与实现

    代码地址如下:http://www.demodashi.com/demo/11818.html 贪吃蛇小游戏(第二版) 一年半前层用react写过贪吃蛇小游戏https://github.com/ca ...

随机推荐

  1. 51nod1247(gcd)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1247 题意:中文题诶- 思路:(a, b)可以直接到达(a+b ...

  2. 搭建 CDH 版本hive

    搭建一个完整的cdh 的版本,由于涉及的产品和步骤太多,在客户那里部署环境时,很容易出现意外,所以如果只是需要部署一个测试环境来进行验证,我们没有必要完完整整的部署整个cdh.   下面是通过命令行的 ...

  3. kafka剖析(转)

    Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ...

  4. Jmeter-提取Json数据进行关联

      1:Json后置处理器提取结果作为下一个sampler的传入参数 1.1:[线程组]->[简单控制器]->[HTTP sampler]->[Beanshell后置取样器]-> ...

  5. 2017"百度之星"程序设计大赛 - 初赛(A)今夕何夕

    Problem Description 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨. 为了排遣郁结,它决定思考一个数学问题:接下来最 ...

  6. C#项目中的bin目录和obj目录的区别

    C#项目中的bin目录和obj目录的区别 1.关于bin目录和obj目录 Bin目录用来保存项目生成后程序集,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin/Re ...

  7. CATIA 使用技巧--转换出轻巧的tif格式文件

    问题描述: 我们在与客户和供应商打交道的过程中经常需要TIF格式2D图纸文件,而默认的CATIA设置保存出来TIF文件非常大,不利于保存和传送.对于该问题,我们可以通过修改CATIA的默认设置选项,将 ...

  8. springMVC-上传图片

    SpringMVC文件上传与下载 上传图片 配置多媒体文件解析器 配置虚拟目录 在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加: <Context doc ...

  9. springMVC-数据传递

    1.    使用Model.ModelAndView传递数据 注意事项: 1.    redirect的数据传递 Model与ModelAndView的传递效果是一样的,且传递是数据不能是引用类型. ...

  10. python学习day11

    目录 SqlAlchemy 外键 SqlAlechemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象 ...