贪吃蛇论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机科学与技术学院
学年设计说明书(论文)
作者:呼斯勒都仍
学号:************
院系:计算机科学与技术学院(软件外包)
专业:计算机科学与技术
题目:基于C语言的贪吃蛇游戏开发与设计
目录前言
第一章概述
1.1中国手机游戏产业现状
1.2中国手机游戏的未来展第二章开发工具的简介
2.1可行性分析
2.2 功能性分析
第三章 3.1概要设计
3.1功能介绍
3.2概要设计图
第四章详细设计
第五章
前言
C语言是目前世界上流行、使用最广泛的高级程序设计语言。
C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。
常用的编译软件有Microsoft Visual C++,Borland C++,Watcom
C++ ,Borland C++, Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++, Lccwin32 C Compiler 3.1,Microsoft C,High C,等等......
C语言的发展历史
C语言的发展颇为有趣。
它的原型ALGOL 60语言。
1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言。
1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,于是产生了BCPL语言。
1970年,美国贝尔实验室的Ken Thompson将BCPL进行了修改,并为它起了一个有趣的名字“B语言”。
意思是将CPL语言煮干,提炼出它的精华。
并且他用B语言写了第一个UNIX操作系统
而在1973年,B语言也给人“煮”了一下,美国贝尔实验室的D.M.RITCHIE 在B语言的基础上最终设计出了一种新的语言,他取了BGPL的第二个字母作为这种语言的名字,这就是C语言。
为了使UNIX操作系统推广,1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。
1978年Brian W.Kernighian和Dennis M.Ritchie出版了名著《The C Programming Language》,从而使C语言成为目前世界上流行最广泛的高级程序设计语言。
1988年,随着微型计算机的日益普及, 出现了许多C语言版本。
由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。
为了改变这种情况,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准, 成为现行的C语言
标准 3.C语言的主要特点。
C语言发展迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能。
许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ都是由C 语言编写的。
用C语言加上一些汇编语言子程序, 就更能显示C语言的优势了,象PC- DOS 、WORDSTAR等就是用这种方法编写的。
第一章概述
这些年中国的手机行业在硝烟与战火中度过,拍照手机、音乐手机等各领风骚。
然而,人们玩得最多的手机游戏却在市场上显得平淡无奇,谁又曾想到在这看似平常的手机游戏中却蕴藏着巨大的商机?近年来,中国的手机游戏市场已具雏形,并朝着健康有序的方向发展。
本文通过对中国目前的手机游戏现存的一些问题和发展方向进行了分析,为如何促进我国手机游戏发展提出了一些看法和建议。
如今,用手机看新闻、发邮件、拍照、聊天已不再新鲜,用手机玩游戏已经成为时下比较流行的一种消遣方式。
手机游戏的发展离不开手机终端的普及和数据服务的推广。
近几年来,随着手机游戏技术自身的日益成熟,手机游戏的巨大商机开始展现在人们面前。
现在传统游戏产业的商家已经开始从家用机游戏、PC游戏等传统的游戏领域逐渐向手机游戏领域扩张,并尝试与手机游戏开发商以及服务提供商进行更加紧密地合作,这一切都证明手机游戏市场已成为目前移动领域最具有活力的市场。
因此,让我们来关注一下未来手机游戏的发展动态吧!
1.1中国手机游戏产业的现状
在中国,手机游戏产业的发展比较缓慢,随着手机自身性能的发展到一个手机游戏的普及,经历了较长的时间,大概分为三个阶段。
第一个阶段是手机游戏的孕育期。
以第一款手机游戏在诺基亚手机上诞生的时候,最早的给手机用户提供消遣,带来快乐,从而也拓展了手机的功能。
从那时候开始手机不再只限于单一的通信。
该阶段的以普通屏为基础,游戏简单,易操作。
第二阶段是手机游戏的快速发展期。
随着彩屏手机的快速发展,移动终端性能的不断提高与完善,使WAP游戏和单机版JAVA成为该阶段的主流。
此阶段的特点是随着手机软
硬件功能的加强和游戏内容的多样化,手机游戏的可视性、娱乐性和交互性进一步得到提高。
第三阶段是手机游戏的成熟期。
随着3G产业的快速开展,大型联网游戏将成为手机游戏的主流。
经过一些市场调查,从用户在手机游戏的类型选择上来看,一半以上的用户选择了益智类游戏。
由于益智类游戏简单、易上手,操作时间短,能够使手机用户在较短的时间内去消遣,让用户在繁忙的时候得到放松。
从各种手机游戏下载情况来看,选择动作类游戏和角色扮演类游戏的玩家也是比较多的,大概有三分之一的用户选择了它们。
其它如冒险游戏、射击游戏、策略游戏、棋牌游戏等也较受到手机用户的欢迎。
近2年来,在PC网络游戏快速发展的同时,大型手机网络游戏也随即而来,更多的种类给玩家带来了更多的选择。
与此同时,手机玩家群体也在不断的发生变化,他们更加接受的是随时、随地、随身的移动休闲和娱乐方式。
对于今后手机游戏玩家的发展而言,由于电子游戏、PC单机游戏、网络游戏等其他平台的游戏在近几年时间里培养了一批忠实的职业玩家,所以这一批玩家将有可能成为手机游戏用户的支柱。
1.2中国手机游戏的产业链
手机游戏作为一个完整的产业链,覆盖多方合作的力量,主要包括手机制造商、游戏开发商、服务提供商和移动运营商等。
为了促进手机游戏行业良性的发展,保持中国移动通信产业的持久稳定,这些商家必须进行不断的合作。
近年来,手机制造商开始与机芯、操作系统企业展开合作,为手机游戏创造更好的软硬件平台。
由于手机游戏有巨大商业潜力,包括盛大、腾讯等公司也纷纷进军这块领域,他们依靠在网络游戏领域内积累的人才、资金和技术优势来争夺该市场。
而服务提供商主要是门户网站等专业增值服务公司,通过代理来实现收益。
移动运营商在该产业链条中处于主导地位,他们通过控制手机制造商、游戏开发商、服务提供商三方的力量来实现收益。
虽然手机游戏行业目前在中国是个新兴业务,但随着手机游戏服务供应商的推广,特别受到年轻人的追捧。
根据有关调查显示中国手机游戏用户的数量在2005年年底达到200万,这将是个庞大的玩家群体,从而使手机游戏将成为移动运营商增值业务和SP收入的重要来源。
尽管国内手机游戏产业链中的各方都欲抢占先机。
可是,产品、终端、资费及服务等这些问题却已成为制约其发展的重要障碍。
终端的普及度不够高,游戏的同质化和低质量问题也正困扰着国内手机游戏市场,虽然过高的资费一直被看作阻碍手机游戏市场发展的最大障碍,但最为关键的问题是不规范的服务使众多玩家丧失
信心。
所以,在巨大的市场面前,中国手机游戏的产业链还须进一步完善。
中国手机游戏的未来展望
根据相关行业的调查,2005年,手机游戏产业有了突破性的发展。
2004年中国手机游戏市场规模超过8亿元人民币,2005年我国手机游戏市场规模达到了14.41亿元,2008将有可能上升到58.62亿元。
由于受PC网络游戏的影响,中国的手机网络游戏市场也将更加发展,更多游戏将被引进。
据调查显示:单机游戏生命周期相对短,而用户对手机网络游戏的热情度相对较高。
一款好的“百宝箱”单机游戏前段时间还比较兴起,过后即开始衰退。
但手机网络游戏则不一样,一款优秀的网络游戏,不但能吸引大量的玩家,而且其生命力和持久力也是难以估量的。
中国的手机游戏市场也会发展到更大的规模。
勿须质疑,在巨大的经济诱惑面前,PC互联网游戏流行期过后,很多投资商将更多的倾向于由互联网、手机共同打造的SP市场。
从“百宝箱”中接近90%的游戏基本上都是国产的来看,WAP站点开始成为投资商最关注的热点。
随着手机游戏市场的逐渐成熟,手机游戏产业必将出现大量的资源整合。
在未来,参与到手机游戏行业的游戏开发商将越来越多,国内手机游戏厂商将面临前所未有的竞争,手机游戏的质量和可玩性也将进一步得到提高。
在游戏市场的运转之下,服务提供商和游戏运营商也将会探索出了适合其发展的商业模式。
虽然手机游戏在目前的技术环境下还无法达到PC游戏的魅力,但随着越来越多智能手机、高端手机的出现,手机游戏将成为人们生活娱乐中不可缺少的一部分。
因此,手机游戏行业正朝着健康有序的方向发展,相信不久的将来手机游戏将成为一种商业文化。
最近几年来,网络特别是无线通信网络在国内的普及速度很快,同时也带动了网络游戏的快速发展。
同样地,智能手机的普及,使得手机游戏市场空前发展。
国内外巨大的手机使用量,也让商家看到了新的商机,手机游戏市场的利润将会十分的丰厚。
面对潜力巨大的手机游戏市场,各大游戏开发商、运营商、服务商以及手机终端厂商等都开始准备应对措施,以便抢占更多的手机市场份额,许多手机厂商开始不断地提升手机的游戏性能,同时采用开放式的手机操作系统,方便用户能够享受到不同的游戏业务。
而国内游戏开发商也都纷纷跻身手机游戏开发行列,许多著名的用户网站,也纷纷涉及手机游戏领域,相继开辟了各自的手机游戏相关栏目,其他一些游戏网站也都加快了手机游戏开发的脚步。
现阶段国
内的手机游戏还局限于小型的单机游戏和简单的卡牌类游戏,而国外现在已经开始致力于开发能够依靠GPRS定位,或者用户佩戴辅助器械的大型手机游戏。
毕业设计依托上述内容为技术和应用背景,在windows操作系统下采用Visual C++ 6.0开发工具来开发,主要内容如下:
1)熟悉Visual C++ 6.0开发工具,
2)熟练C语言的编程方法
3)熟悉贪吃蛇游戏的应实现的功能
第二章需求分析
2.1可行性分析
2.1.1 技术可行性
本系统的设计要求是一个能在Windows操作系统下运行且界面美观运行稳定且将来可能用于嵌入式移植的系统。
综合考虑选择C语言技术来实现本系统。
C语言是一门成熟的高级语言,可用于开发各种系统,也可用于开发游戏系统。
同时C语言也拥有相当多的技术人员,可以说在技术方面开发此系统不会有什么问题。
2.1.2 经济可行性
随着手机和电脑的普及,这样的小游戏也将随着普及,因此其需求也将不断地上升,而且由于技术的成熟与为数众多的开发人员使得此系统的开发并不困难,再者此系统运行的平台Windows操作系统是免费的,所以开发此系统的成本并不会很高。
因此此系统具有相当的经济利益,到时候我们也可以静观其成。
2.1.3 操作可行性
本系统是一个简单的游戏系统,对于这样一个系统,其操作只需要使用简单的几个按键就可以实现了,因此本系统的操作简单易记,可以说一看就会的,系
统在操作上是不会存在问题的,本系统需要在Windows操作系统下运行,而用户也可以在其受益匪浅。
2.2 功能性分析
游戏是人们生活中不可或缺的一部分,在人的成长过程中,游戏时常陪伴在我们的身边,它在我们的生活中占据的地位是不可言喻的。
不论是一个玩具,还是一个能和伙伴一起开心的小游戏,都是能给我们留下美好的回忆。
因此,无论是什么样的游戏,只要它能迎合人们内心的某种需求,它的市场就会很好。
2.2.1简单性
贪吃蛇是一个简单的小游戏,但是它的作用却是很大的。
首先它能使我们身心得到很好的放松,使我们从繁重的生活中解脱出来,而只有我们的身心得到了娱乐,我们才能更好地投入到新的工作当中,现在许多人,包括已经有工作的工作者和未进入社会的学生,都面临着很大的压力,应运而生地,贪吃蛇提供了我们随时随地享受娱乐的机会。
这款游戏之所以叫贪吃蛇,其真正用意并不是告诉我们要贪心,它所传递的精神是人们只有不断努力地向前才能得到自己想要的,食物就像现在社会存在的机会,而我们只有找好自己的目标才能成功。
尽管现在市面上存在的游戏版本很多,可是贪吃蛇的市场还是很大的。
原因就在与它能引人入深,爱不释手。
随着游戏速度的逐渐加快,其刺激性也更强。
可以说该游戏的优势不仅在于它的简单易行,而且在于它很快顺利的运行。
对于那些在外忙忙碌碌的人们,想让他们花费大量的时间在大型游戏上显然是不可能的,但是小游戏却刚好能够迎合他们的需求。
但是它的缺点也主要在它的简单性,游戏本身太过于简单,无法满足大型游戏主的需求,但是这样的小游戏主要对象是针对那些需要有些小东西来调剂生活的人们,给他们的生活带来些精彩。
2.2.2 趣味性
人们可能持有这样的怀疑:这样一款小小的游戏,其可玩性应该高不到哪里去吧!事实上对于大型游戏的玩家这样一款游戏自然是无法满足的。
可是我们却
无法否认其趣味性。
在经过一天繁忙的工作之后,我们难得有一个间隙能喘口气,自然不能浪费,在不能玩大型游戏的情况下,人们自然而然的就会想到贪吃蛇这样的小游戏,不仅不会占用大量的时间,而且还能够让身心得到充分的休息。
言归正传,贪吃蛇的趣味究竟在哪里呢?人们开始游戏时从起先的容易,到后来速度的不断加快,其可玩性也在不断地增加。
第三章概要设计
贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记2分,接着又出现食物,等待蛇来吃,如果蛇在移动中身体交叉蛇头撞倒自己身体游戏结束。
3.2概要设计图
通过对贪吃蛇的需求分析,我们用C语言实现该程序
图4-1 概要设计图
3.2.1画面设计
(1)主要是对边框、食物、蛇的设计,起用了一些链表和库函数;
(2)画面的启动的问题,紧接着就是是画面的绘制
(3)食物和蛇放在游戏的具体过程中,因为食物是随机的,而蛇是移动的。
3.2.2游戏过程
主要是对食物和蛇的设置。
在这个环节过程中有几个重要的算法,是程序能否成功地运行的关键。
其主要有蛇是如何移动身体的;蛇怎样才能吃到食物;随着游戏得分增加,游戏的等级也增加,同时蛇的爬行速度也加快了;怎样判断蛇的死亡等。
3.2.3游戏结束
蛇如何死亡
蛇死亡后即意味着游戏的结束
3.2.4添加功能
(1)在游戏的开头添加“WELCOM TO GAME”的语句,并添加“
按任意键继续”以提示用户;
(2)添加背景音乐“筷子兄弟——小苹果”,可以在玩游戏的
过程中,边玩游戏边听音乐。
第四章详细设计
4.1程序设计分析
图5-1 程序设计流程图
这是一个简单的游戏,所以循环和分支之类的函数在大的面上运用较少,主要体现在计算上,尤其是坐标上的计算较为突出。
简单易懂,一目了然
4.2主要函数:
表5-1贪吃蛇主要函数
4.3主要代码
4.3.1 Main()主函数
主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数gameing(),即玩游戏的具体过程,游戏结束后执行return 0;语句关闭图形系统,结束程序。
代码如下:
int main()
{
GotoRood(START_X + SCREEN_WIDTH / 2, START_Y + SCREEN_LENGTH / 2);
printf("WELCOM TO GAME");
GotoRood(START_X + SCREEN_WIDTH / 2-2, START_Y + SCREEN_LENGTH / 2+10);
system("pause");
system("cls");//清除屏幕内容
PlaySound(TEXT("D:\\xiaopingguo\\xiaopingguo.wav"), NULL, SND_ASYNC | SND_NODEFAULT);
while (1)
{
gameing();
return 0;
}
}
程序分析:
一般而言,编写一个能运行在操作系统上的程序,都需要一个主函数。
主函数意味着建立一个独立进程,且该进程成为了程序的入口,对其它各函数(在某些OOP语言里称作方法,比如Java)进行调用,当然其它被调用函数也可以再去调用更多函数.......这样整个程序的运行轨迹就像一种栈,有时我们称之为调用栈。
主函数既是程序的入口,又是程序的出口,通常我们还可以指定一个exit code再退出,以表明程序最后的结果是什么样的。
自然而然的,这里的main函数就是贪吃蛇游戏程序的入口函数,通过该入口函数,进而可以调用gameing()函数,使游戏运行起来
4.3.2 游戏界面设计
主界面就是一个密封的矩形框,在矩形框的左边是游戏的操作说明,在框内主要是蛇和食物。
游戏边框流程图如图5-2所示。
图5-2 游戏边框流程图
代码如下:
void IniScreen(SNAKE *head) /*初始化屏幕*/ {
SNAKE *p1, *p2;
HideCursor();
GotoRood(START_X,START_Y);
/*-------------画游戏边框---------------*/
for (i = 0; i < SCREEN_WIDTH + 2; i++)
printf("-");
for (j = 1; j <= SCREEN_LENGTH; j++)
{
GotoRood(START_X + SCREEN_WIDTH + 1, START_Y + j);
printf("|");
}
GotoRood(START_X, START_Y + SCREEN_LENGTH + 1);
for (i = 0; i < SCREEN_WIDTH + 2; i++)
printf("-");
for (j = 1; j <= SCREEN_LENGTH; j++)
{
GotoRood(START_X,START_Y + j);
printf("|");
}
GotoRood(START_X + 20, START_Y - 1);
printf("贪吃蛇作者:唐姜明");
GotoRood(0,START_Y + 2);
printf("游戏说明:\n\n↑设置等级\n\n按〖回车〗开始\n\n↑↓←→\n控制方向\n");
/*--------------孵化蛇-------------------*/
head->x = START_X + SCREEN_WIDTH / 2;
head->y = START_Y + 8;
head->pre = NULL;
p1 = head;
while (++i < 3)
{
p2 = p1;
p1 = (SNAKE *)malloc(sizeof(SNAKE));
p1->x = START_X + SCREEN_WIDTH / 2;
p1->y = START_Y + 8 + i;
p1->end = NULL;
p2->next = p1;
p1->pre = p2;
}
p1->next = NULL;
head->end = p1;
}
程序分析:
这里的游戏边框设计的主要思想是利用for循环语句中的嵌套循环实现的。
如 for (i = 0; i < SCREEN_WIDTH + 2; i++) printf("-");这句话的意思是画出游戏边框的上边框,画完之后,再通过GotoRood(START_X + SCREEN_WIDTH + 1, START_Y + j);语句实现光标定位,并且与for (j = 1; j <= SCREEN_LENGTH; j++)语句结合使用,进而画出游戏边框的右边框。
同样的道理,其他两个边框的实现也可以用这种方法去实现。
4.3.3 游戏的具体过程函数gameing()
这个函数是游戏的主要部分,难点是在表示蛇的新位置,采用的方法是链表传递的方法。
另外,食物的出现要是随机的,蛇吃到食物的判断是蛇头的坐标和食物的坐
标相等。
游戏过程流程图如图5-3所示。
图5-3游戏过程流程图
代码如下:
void gameing() /*游戏过程*/
{
int i = 0, eat = 0, rank, scorelimit = 0, score = 0;
int direct = up; /* 初始方向为向上 */
time_t grade = 2; /* 初始等级为2 */
FOOD *fd;
SNAKE *head, *ptemp, *pnew; /*最少3个蛇身 + 1个蛇头的时候才会挂。
感觉用C++改成类来做会好一些。
*/
head = (SNAKE *)malloc(sizeof(SNAKE));
fd = (FOOD *)malloc(sizeof(FOOD));
GotoRood(START_X, START_Y - 1);
printf("Grade: %d", grade);
GotoRood(START_X + 10, START_Y - 1);
printf("Score: %-3d", score);
IniScreen(head);
CreatFood(fd, head);
while(rank = getch()) /*接受按键...↑设置等级【空格】开始游戏*/
{
if (rank == 72)
{
grade = ++grade % 10;
if (grade == 0)
grade = 1;
GotoRood(START_X, START_Y - 1);
printf("Grade: %d", grade);
}
else if (rank == 13)
break;
}
while (1)
{
RemoveSnk(head);
ptemp = (SNAKE *)malloc(sizeof(SNAKE)); /*临时的,用来增加在
蛇的头部*/
Move(&direct); /*....接受用户选择蛇的运动方向*/
switch(direct)
{
case up: ptemp->x = head->x;
ptemp->y = head->y - 1;
break;
case down: ptemp->x = head->x;
ptemp->y = head->y + 1;
break;
case left: ptemp->x = head->x - 1;
ptemp->y = head->y;
break;
case right: ptemp->x = head->x + 1;
ptemp->y = head->y;
break;
}
if (!eat) /*如果没吃到,那自然增加蛇的长度*/
{
ptemp->end = head->end->pre; /*将蛇的尾端位置改变,变为倒
数第二个*/
head->end->pre->next = NULL; /*再连接下...*/
free(head->end);
head->end = NULL;
}
else
{
ptemp->end = head -> end;/*吃到了。
在原有的基础上换一个头,
这样就多了一节*/
}
head->pre = ptemp; /*。
队列连接*/
ptemp->next = head;
ptemp->pre = NULL;
head = ptemp;
if (eat = Eated(head, fd))
{
CreatFood(fd,head);
score += grade; /*吃到了,就加分*/
scorelimit += grade;
if (scorelimit / 50 && grade <= 10) /*这个用来增加等级。
*/ { /*每过一次50分,等级
增加一次,10级是上限 */ GotoRood(START_X, START_Y - 1);
printf("Grade: %d", ++grade);
scorelimit = score % 50;
}
GotoRood(START_X + 10, START_Y - 1);
printf("Score: %-3d", score);
}
if (GameOver(head)) /*游戏是否结束....*/
{
BuildSnk(head); /*留下最后的英姿。
吃货该死..*/
GotoRood(START_X + SCREEN_WIDTH / 2, START_Y + SCREEN_LENGTH / 2);
puts("小菜鸟,你输了\n");
return;
}
CollisionTest(head); /*碰撞测试*/
BuildSnk(head);
Sleep((10 - grade) * 50); /*延时...程序会暂停(10 - grade)*50ms 的
时间, windows.h里的函数*/
}
}
程序分析:
gaming()函数是游戏的主要部分,难点在表示蛇的新位置并消除前一次的图形。
采用的方法是每次移动的时候从最后一节开始到倒数第二节(因蛇头为两节),将前一节的坐标赋值给后一节的坐标,移动后只要把最后一节用背景色去除即可,因为新位置0到n-l节还是要出现在画面上的。
然后蛇头按照方向键来更改位置。
另外,食物的随机出现要确保它的位置在10的倍数位置上,因为蛇的坐标都是以10为模的,这样的话就可以让蛇吃到,蛇吃到食物的判断是蛇头的坐标和食物的坐标相等。
其算法过程为:
(1)设置初始值。
为防止食物总出现在一个位置上,要设置随机数发生器,真正产生随机数。
初始时,蛇只有蛇头,设定一个开始的方向。
(2)循环执行,直到按Esc键退出。
(3)没有按键的情况下,循环执行。
如果没有食物,随机出现食物;如果有食物,则显示食物,蛇移动身体,根据蛇的方向改变坐标值,并判断蛇是否自己吃了自己,如果出现这种情况,则蛇死,调用游戏结束函数GameOver(),结束本次游戏,重新开始。
如果蛇吃到了食物,蛇身体长一节,数组元素增加一个,身体节数、分数都进行相应的改变。
在新位置画出蛇。
(4)如果有按键,则识别键值。
如果按键为Esc键则结束游戏,程序运行结束;如果所按键为方向键,则根据该键改变代表蛇方向的变量direction的值,要考虑相反方向键无效。
4.4其他函数的代码:
4.4.1 构建蛇身
void BuildSnk(SNAKE *head) /*构造蛇身*/
{
SNAKE *p = head;
while (p != NULL)
{
GotoRood(p->x, p->y);
printf("#");
p = p->next;
}
}
4.4.2蛇的移动方向函数
void Move(int *d) /*移动方向。
上下左右上:72 下:80 左:75 右:77*/
{
char ch;
while(_kbhit())
{
ch = getch();
if (ch == 72)
{
if ((*d == left || *d == right) && *d != down)
*d = up;
}
else if (ch == 80)
{
if ((*d == left || *d == right) && *d != up)
*d = down;
}
else if (ch == 75)
{
if ((*d == up || *d == down) && *d != right)
*d = left;
}
else if (ch == 77)
{
if ((*d == up || *d == down) && *d != left)
*d = right;
}
}
程序分析:
这里我们首先要明确一个函数kbhit()函数(VC++6.0下为_kbhit()),该函数的功能及返回值为:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。
那么接下来所有的问题便可迎刃而解了
这里用到的是C语言当中的if语句和复合运算符,例如
if (ch == 72)
{
if ((*d == left || *d == right) && *d != down)
*d = up;
}
其中,ch == 72 和(*d == left || *d == right) && *d != down为真的意思是说,如果贪吃蛇之前的运动为向左或者向右但是绝对不会是向下时,那么贪吃蛇接下来的运动只会是向上。
同理,贪吃蛇向左、向右、向下的实现也是一样的。
第五章结论
我做的是贪吃蛇游戏。
简单的一个,但对我一个初学者来说却是一个很大的困难。
更加是第一次做毕业设计,所以在后期编写程序时老是停滞不前,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。
可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。
特别是结构体,指针的部分,几乎是一片空白。
不过经过几天的努力,大体上把课本上的知识点看了一遍,知识点也都基。