1、 C语言程序设计课程设计题 目: 贪吃蛇游戏设计 学 院: 信息学院 专 业: 网络工程 姓 名: 李益双 学 号: 班 级: 信息A1111班 指导老师: 罗成 职 称: 讲师 完成日期: 6月 目 录1、 序言32、 摘要.43、 项目背景.54、 需求分析.65、 概要设计.76、 具体设计和测试.8601 定义蛇身数据结构.8602算法设计和程序步骤图.8 602.1贪吃蛇算法设计.8 602.2程序步骤图.9603光标移动设计和实现.10 603.1显示水平围墙实现.10 603.2显示分数实现.11 603.3接收玩家按键信息实现.11 603.4游戏结束时显示信息实现.11604
2、 贪吃蛇游戏主干设计.12 604.1游戏初始化和加载实现.12 604.2食物随机产生实现13 604.3蛇身增加设计.14 604.4蛇身显示和移动设计实现.15604.5蛇头部和物体碰撞而设计实现.167、 编码.17 8、 结论.189、 参考文件.1910、 致谢.19前 言 C语言,是一个通用、过程式编程语言,广泛用于系统和应用软件开发。含有高效、灵活、功效丰富、表示力强和较高移植性等特点,在程序员中备受青睐。C语言是由UNIX研制者丹尼斯里奇(Dennis Ritchie)于1970年 由肯汤普逊(Ken Thompson)所研制出B语言基础上发展和完善起来。现在,C语言编译器普
3、遍存在于多种不一样操作系统中,比如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言设计影响了很多以后编程语言,比如C+、Objective-C、Java、C#等。1980年代,为了避免各开发厂商用C语言语法产生差异,由美国国家标准局(American National Standard Institution)为C语言订定了一套完整国际标准语法,称为ANSI C,作为C语言标准。1980年代至今相关程式开发工具,通常全部支持符合ANSI C语法。对于一个初学者,Microsoft Visual C+是一个比很好软件。界面友好,功效强大,调试也很方便。这是微软出一
4、个C语言集成开发环境(IDE),关键有:VC+6.0、VSVSVS等,分为企业版和学生版等。对于初学者VC+6.0是比较轻易上手,但其对标准支持不好可能使人养成不良编程习惯。 在unix/linux操作系统上,学习c语言通常使用vim/emacs来编辑源文件,使用gcc来编译源文件,使用make程序来管理编译过程。 C+学习过程中,包含到很多基础知识点,需要以练习形式逐步深入,以达成融会贯通目标。学习C+是一项交互式练习,不实际编写程序就无法学会C+,所以,要抱着一个十年方能磨一剑心理,扎扎实实从基础开始。选部分好实例,这些实例经过反复挑选,现有利于我们掌握相关知识,又不识趣味性。不停地写代码
5、,写有意义代码。这其实也是入门任何其它编程语言必由之路。在编程过程中,关键训练我编程逻辑思绪和算法和编程、调试基础技术。所以,在作课程设计时,以任务驱动为前提,从提出问题开始,行分析和算法设计,最终再归纳总结,以加强学习针对性和应用性。万丈高楼平地起,能够编写复杂游戏全部是在编写过简单游戏程序基础上演变过来能力。然而像贪吃蛇这么小游戏程序,就自然成了游戏设计者入门首选。所以其界面简单,操作、玩法一目了然,所以编写起来就不会很困难,而且需要考虑问题也不是很多,就是蛇显示、移动、碰撞3个游戏主块,程序就自然编写出来了,不会一开始就把游戏设计初学者拒之门外。编成以后成就感就油然而生,并使之对游戏设计
6、产生强烈爱好。成为向游戏设计之路成功前进第一步,同时对于VC+应用水平也会上升,用起来会愈加熟练、得心应手。从易到难这是一个准则,总而言之,贪吃蛇小游戏研究会对增加程序阅读能力、编写程序能力等起到了意想不到作用。摘 要 本文首先对小游戏发展前景进行了展望,并对其研究现实状况和研究目标进行了介绍。然后对编写程序用工具软件 VC+进行了介绍。接着进入专题,对贪吃蛇这个游戏进行了介绍然后又对游戏总体设计和分析。最终具体地介绍了游戏中各个细节具体实现,并进行了细致分析。行云流水般地将在游戏编写过程中碰到问题和对应处理方法表述清清楚楚。在实践中我取得到了很多宝贵知识和编程经验!关键字:贪吃蛇,VC+,小
7、游戏。ABSTRACT In this paper, At the we saw the future of the development of little game.and then we introduced the situation and target of game research . afterwards, we peovided the programming tool which is called VC+ made by Microsoft . Next lets get down to business . in the first place . we intro
8、duced the gamegreedy snake .in the second place ,we designed and analyzed the overall game .At last , we vividly provided the particular realization of game details, and analyzed those detail meticulous. In the process of game programming. I came up against lots of trouble, but I didnt give it up, b
9、y the contrary. I overcame them one by one ,and at last I met with success ,I have got many precious knowledge and programming experience in the practice.Key words :Greedy snake, VC+, little game. 项目背景贪吃蛇介绍蛇传说中圣灵之物,仰头为神,俯首为魔。蛇是月亮国膜拜神,月亮国子民们全部认为蛇是万能主宰派来保护她们守护者。蛇在这个岛屿就像空气一样自然出现在各个角落,有些还成为居民宠物,陪同孩子长达,和
10、年轻人一起去探险,守护者散步老人。在善良女神女娲神保佑下,大家生活安宁平静。为了答谢女娲神庇佑,每十二个月月亮果国民们全部会举行一个守护蛇大赛,大人家全部会拿出自己最强、最炫、最快、最稀有蛇来参与比赛,取得第一名人将得到国王尤其嘉奖。所以国民一生全部在培养更有威力、更长、更壮蛇。“贪吃蛇”是在一个产生于1970年代中后期计算机游戏。也叫贪吃蛇。该游戏在1990年代因为部分手机将其引入而一时间再度流行起来。在游戏中,玩家操作一条细长蛇爬行和一个带边界平面上,一路捡起触碰到之事或其它类似物件,并要避免触碰到本身或包围者游戏区“墙”。每次贪吃蛇吃掉一件食物,它身体变增加部分,这让游戏难度逐步变大。操
11、控贪吃蛇时,玩家操控贪吃蛇头部朝向(上、下、左、右)操控贪吃蛇进行方向 贪吃蛇身体将跟随其头部行进。另外,玩家不可在游戏中途停止贪吃蛇行进。伴随贪吃蛇成功移植到手机系统,贪吃蛇操作按键要求和手机按键完美匹配,使贪吃蛇游戏风靡起来。 需求分析 现在小游戏很是流行在手机和互联网上全部是很火热,这引发了我爱好。查看了而多个小游戏网站,其实也没有什么,只不过是写以FLASH为主开发Flash小游戏,确实没有什么非同凡响地方。但你仔细思索想一下,就不难发觉,这些东西还真有一定市场,只是现在还默默地没有被大家所关注。首先,不停扩大网络爱好者和电脑应用者队伍,带来了很多“新手”,这些新手还会像以前我们刚开始
12、接触是一样,对部分相对简单,操作也方便、娱乐性强东西很感爱好。源源不停加入者,组成了“小游戏”玩家新主力军。其次,“小游戏”很方便下载,而且现在数码小产品被越来越多青年所青睐,拥有很多超强功效来支持这些小游戏。再次,伴随电视上网络上进程推进,网络走进千家万户时代为期不远。因为电视分辨率和内存大小限制,和遥控器操作要求简单,这种小游戏将会有一个巨大而潜在市场。以后小游戏发展趋势:1,体积小,小游戏通常全部占硬盘空间相当小,方便下载传输;2,内容好,体积小并不代表没有内容,相反小游戏内容还是比较丰富;3,耐玩,正是因为小游戏占空间不大,它也是在电脑上占据比较长游戏了;4,娱乐性高,小游戏玩起来还是
13、蛮有趣,拥有一定娱乐性;5,无年纪层次,不分老少、男女小游戏面向晚间范围广。概要设计 贪吃蛇游戏额基础规则:经过键盘上1、2、3、4键来控制蛇运行方向,当蛇将食物吃到了后身体长度自动增加,当蛇撞到墙或吃到本身则蛇死,此时将退出贪吃蛇游戏;当蛇向左运行时,按向右键将不会改变蛇运行方向,蛇将继续前进;同理其它方向一样。 在编写贪吃蛇游戏时有一下多个技术关键点。第一、 怎样实现蛇在吃到食物后食物消失,这里用到方法是采取背景色在出现事物地方将食物重画,这么食物就消失不见了。第二、 、怎样实现蛇移动且在移动过程中不留下痕迹,实现蛇移动也是贪吃蛇游戏最关键技术,关键方法是将蛇头后面每一节逐次移动到前一节位
14、置,然后按蛇运行方向不一样对蛇头位置作出对应调整,蛇每向前运行一步,对应将其为不宜结用背景色重画,及去掉其尾部。第三、 当蛇向上运行时,从键盘中输入向下键,此时蛇运行方向不变,其它多个方向以这类推,之力我是采取if.eles语句来实现该功效。第四、 食物出现位置这里采取随机产生,但这种随机产生也是有一定限制条件即食物出现位置横纵坐标必需能被10整除,只有这么才能确保蛇能够吃到食物。 具体设计和测试601定义蛇身数据结构 对于蛇身在某一瞬间位置标识,我们采取一个一维数组来标识出来,即用动态增加数组来存放每一节蛇身位置(包含蛇头和蛇尾)。 也就是说,用存放单位空间存放目前蛇身某部位位置来对整个蛇身
15、位置进行标识,所以每个存放空间内容就是一个点坐标值(row,col),而蛇身以从左到右方法进行编号,最左边是蛇尾部,最右边是蛇额头不。如表6-1为三节蛇数据结构。表6-1三节蛇数据结构(snake0.row,snake0.col)(snake1.row,snake1.col)(snake2.row,snake2.col)snake0.row和snake0.col是第0号蛇身也就是蛇尾横坐标row和纵坐标col:以这类推,snake2.row和snake2.col则是第二号蛇身也就是蛇头横坐标row和纵坐标col。602 算法设计和程序步骤图602.1 贪吃蛇算法设计 Snake game :1
16、:初始化游戏,游戏界面绘制、游戏速度设置、食物产生2:while 玩家不按退出键3: if 玩家按下某方向键4: 蛇身根据玩家按下方向移动5: eles蛇身根据默认方向(右)移动6: end if7: if 蛇头碰到墙壁8: 游戏结束9; end if10: if 蛇头碰到本身11: 游戏结束12: end if13: if 蛇碰到食物14: 蛇身增加、分数增加、产生新食物 15; end if 16: end whlile17: 游戏结束=602.2程序步骤图 602.2程序步骤图603光标移动设计和实现 在游戏过程中,对于光标移动相当关键。首先,食物产生是随机产生,可能出现在游戏界面任何一
17、个地方,所以生成随机坐标后,就要将光标移动到该坐标,然后进行显示食物操作。其次,游戏界面显示也需要移动光标。譬如,纵向围栏显示。再次,就是蛇身移动了,蛇尾部要不停清空,这么蛇就动起来了。其中X为纵坐标,Y为横坐标,(X,Y)对应于屏幕上像素点。COORD这个数据结构、SetConsoleCurorPosition()、GetStdHandle()这2个函数全部是位置,GetStdHandle()得到标准输入输出句柄。Gotoxy()这个函数是布尔型,返回真或假。 下面将光标移动应用到贪吃蛇游戏中603.1显示水平围墙实现 水平围墙就是在游戏区域中,限制蛇行动上下界,即活动对打边界。这里用一系列
18、“=”连续显示,直到设定最大活动范围。 水平围墙图603.1所表示图603.1水平围墙603.2显示分数实现 对于玩家得分,是在游戏当中,玩家控制贪吃蛇每当吞掉一个食物,对应分数就会增加一分。游戏结束时,分数会清零,再下一盘游戏中从0分开始计数玩家分数显示图603.2所表示603.2分数显示图603.3接收玩家按键信息实现 为了接收来自键盘信息,之力用到了conio.h这个头文件。经过一个布尔函数kbhit()真假来判定是否有按键被敲击,假如没有,游戏正常运行;不然通getch()得到那个char变量按键信息,然后修改蛇运动方向。603.4游戏结束时显示信息实现 当游戏介绍时,屏幕上要显示“G
19、ame over”字样,还有“another game(y/n)?”字样来让玩家选择继续游戏还是退出游戏。这里是经过使用gotoxy()函数,是上述字样在想要显示位置出现。游戏结束而显示信息图603.4所表示图603.4游戏结束显示604贪吃蛇游戏主干设计 604.1游戏初始化和加载实现 游戏开始时候,初始化蛇长度为4节,行进方向为右。并定义2维数组screengridrowcol,该数组作用是产生食物用。蛇开始移动坐标是哦(2,2)。然后绘制围墙横围墙用一排“=”显示,纵围墙用一列“|”显示,这么游戏框架就出来了,初始化游戏分数,并显示游戏部分帮助,如按键设置等。 游戏初始化,包含蛇初始长度
20、,蛇初始行进方向,游戏区域显示。 游戏加载完成后,效果图604.1所表示 图604.1贪吃蛇初始化604.2食物随机产生实现 对于前面提到过一个二维数组screengridrowcol这里要用到。用rand()函数生成2个随机生成整数作为食物横坐标和纵坐标,并判定食物是否出去围墙,假如在游戏区域外面,则对随机生成横纵坐标进行修改。然后移动光标到此处坐标进行输入“*”操作。(用“*”代表食物)这里c和r会在判定蛇头是否碰到食物用到。这里要应用到time.h这个头文件,用于产生随机数。 食物随机产生,图602.2所表示 图604.2随机食物产生604.3蛇身增加设计 对于蛇身增加设计要考虑到蛇头运
21、行方向。假如蛇头向右行进,新增加蛇身横坐标不变,纵坐标增加1;假如蛇头向左行进,新增加蛇身横坐标不变,纵坐标减1;假如蛇头向上行进,新增加蛇身纵坐标不变横坐标减1;假如蛇头向下行进,新增加蛇身纵坐标不变横坐标加1. 604.4蛇身显示和移动设计实现 对于蛇身显示属于本程序设计难点之一,因为蛇身是一个运动物体,每个时刻某一节所在位置是改变。就像一个动画过程,需要每隔一个固定时间,对蛇进行显示一次,并将蛇尾部一节消掉,使蛇头向前促进一节。这是一个动态过程,当然设置固定显示蛇身时间是能让人眼来得及反应时间,也就是不能太快,不然在人看到就是频闪一串了。其中addsegment()这个函数是用来为蛇头前
22、移赋值。604.5蛇头部和物体碰撞设计实现对于蛇头部和物体碰撞检测一样属于本程序设计难点。1、首先来关注蛇额头不和游戏区域围墙碰撞检测。假如检测到有碰撞,则游戏结束;不然游戏正常运行。这个是经过判定蛇头部横、纵坐标是否超出设定额最大界限或是低于最小下限来判定图604.5.1所表示为碰壁情况 图604.5.1为碰壁情况2、其次,考虑蛇头部是否和自己身体某个部位产生碰壁检测。假如检测到有碰壁,则游戏结束;不然游戏正常运行。这个是经过一个循环将蛇头部横、纵坐标值和每节蛇身(处蛇头外)知道蛇尾部横、纵坐标值和蛇头部横、纵值一致,则游戏结束;不然游戏正常运行。图604.5.2所表示为蛇碰到本身情况,蛇头
23、和距蛇尾长度一致蛇身处相撞。 图604.5.2蛇碰到本身情况 3、最终,就是蛇头部是否和食物碰撞检测了。假如检测到没有碰到则游戏正常运行;不然首先将二维数组screengridrowcol里有食物那个数据元素清空,方便生成下一个食物。然后在游戏区域再随机产生一个食物,分数和蛇长度分别增加1,最终在游戏区域下方显示分数。这里是经过令蛇头部横、纵坐标和先前产生食物时设置2个变量进行比较判定,这2个变量分别是r,c(r表示食物横坐标,c表示食物纵坐标),假如2者分别相等,则成功吞掉食物;不然游戏继续进行。 图604.5.3所表示为将要碰到食物情况,食物用“*”表示图604.5.3蛇碰到食物情况结论经
24、过理论和实践完美结合,我贪吃蛇游戏成功编制完成了。即使所编写而这个游戏很简单,又因为自己能力有限,游戏画面相当粗糙,没有经过美化界面美感就谈不上了,只能用简陋形容了。不过值得骄傲是整个游戏编写是自己亲手,而且依靠自己智慧独立完成。在编写游戏过程中,碰到了很多难题,比如,蛇头部和食物检测问题,蛇移动和显示问题,蛇转向问题,食物随机生成问题等等,这些个难题摆在面前,让人实在有些招架不住。经过查阅大量文件资料阅读相关书籍,最终决定了采取分治算法思想来对摆在面前问题一一击破。在处理是蛇移动和显示问题时候,经过大量研究、试验和调试,试验过多个移动和显示方法,最终决定了一个简单易用算法。处理难题时候,仿佛
25、是拨了一层云,又见一层云,不过日光也越来越闪耀了,最终看到了阳光,取得了成功。自己感觉经过这次学习研究,自己受益匪浅。不仅自己揭开了游戏程序神秘面纱,而且在实际程序编写和调试过程中,自己成长了不少,实战能力提升了不少。万丈高楼平地起,能够编写复杂游戏全部是在编写简单游戏基础上演变过来能力。然而像贪吃蛇这么简单游戏,就自然成了设计者入门之选,因为其界面简单,操作、玩法一目了然,所以编写起来就不会很困难,而且需要考虑问题也不用太多,就是蛇显示、移动、碰撞3个游戏主块,攻破这3个主块,程序就自然编写出来了,不会一开始就把游戏设计初学者拒之门外。编成以后就感觉就会油然而生,并使之对游戏设计产生强烈爱好
26、。成为向游戏设计之路成功前进第一步,同时对于VC+利用水平也会上升,用起来会愈加娴熟、得心应手。从易到难这是哟个准则,总而言之,贪吃蛇小游戏研究会对增加程序阅读能力、程序编写能力等起到了意想不到作用。当然,自己程序不足之处四处全部是,譬如能够讲画面设计美观一点,能够设置一下游戏难度,能够令算法实施效率再高一点并不满足编写出来就行。字啊以后漫漫研究学习道路上,我还有很远璐要走,迎接我是一个严峻挑战。参考文件1.C语言程序设计. 朱立华 王立柱 . 人民邮电出版社。2.C语言程序开发范例宝典. 王娣 安剑 孙秀梅 . 人民邮电出版社。3.数据结构. 姜梅 赵坚 . 中国水利水电出版社4.高级语言C
27、+程序设计 . 刘璟 周玉龙 . 高等教育出版社5.C+实战操作100例 . 蒋卫华 李伟华 . 清华大学出版社6.游戏设计基础 . Emest Adams . 机械工业出版社7.游戏设计概论 . 潜龙 . 科学出版社 致谢 .6附录 编码#define N 200#include #include #include #define LEFT 0x4b00#define RIGHT 0x4d00#define DOWN 0x5000#define UP 0x4800#define ESC 0x011bint i,key;int score=0;/*得分*/int gamespeed=50000
28、;/*游戏速度自己调整*/struct Foodint x;/*食物横坐标*/int y;/*食物纵坐标*/int yes;/*判定是否要出现食物变量*/food;/*食物结构体*/struct Snakeint xN;int yN;int node;/*蛇节数*/int direction;/*蛇移动方向*/int life;/* 蛇生命,0活着,1死亡*/snake;void Init(void);/*图形驱动*/void Close(void);/*图形结束*/void DrawK(void);/*开始画面*/void GameOver(void);/*结束游戏*/void GamePl
29、ay(void);/*玩游戏具体过程*/void PrScore(void);/*输出成绩*/*主函数*/void main(void)Init();/*图形驱动*/DrawK();/*开始画面*/GamePlay();/*玩游戏具体过程*/Close();/*图形结束*/*图形驱动*/void Init(void)int gd=DETECT,gm;initgraph(&gd,&gm,c:tc);cleardevice();/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)围墙*/void DrawK(void)/*setbkcolor(LIGHTGREEN);*/set
30、color(11);setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/for(i=50;i=600;i+=10)/*画围墙*/rectangle(i,40,i+10,49); /*上边*/rectangle(i,451,i+10,460);/*下边*/for(i=40;i0;i-)/*蛇每个步骤往前移动,也就是贪吃蛇关键算法*/snake.xi=snake.xi-1;snake.yi=snake.yi-1;/*1,2,3,4表示右,左,上,下四个方向,经过这个判定来移动蛇头*/switch(snake.direction)case 1:snake.x
31、0+=10;break;case 2: snake.x0-=10;break;case 3: snake.y0-=10;break;case 4: snake.y0+=10;break;for(i=3;isnake.node;i+)/*从蛇第四节开始判定是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/if(snake.xi=snake.x0&snake.yi=snake.y0)GameOver();/*显示失败*/snake.life=1;break;if(snake.x0595|snake.y0455)/*蛇是否撞到墙壁*/GameOver();/*此次游戏结束*/snake.life
32、=1; /*蛇死*/if(snake.life=1)/*以上两种判定以后,假如蛇死就跳出内循环,重新开始*/break;if(snake.x0=food.x&snake.y0=food.y)/*吃到食物以后*/setcolor(0);/*把画面上食物东西去掉*/rectangle(food.x,food.y,food.x+10,food.y-10);snake.xsnake.node=-20;snake.ysnake.node=-20;/*新一节先放在看不见位置,下次循环就取前一节位置*/snake.node+;/*蛇身体长一节*/food.yes=1;/*画面上需要出现新食物*/score+
33、=10;PrScore();/*输出新得分*/setcolor(4);/*画出蛇*/for(i=0;isnake.node;i+)rectangle(snake.xi,snake.yi,snake.xi+10,snake.yi-10);delay(gamespeed);setcolor(0);/*用黑色去除蛇最终一节*/rectangle(snake.xsnake.node-1,snake.ysnake.node-1,snake.xsnake.node-1+10,snake.ysnake.node-1-10); /*endwhile(!kbhit)*/if(snake.life=1)/*假如蛇死就跳出循环*/break;key=bioskey(0);/*接收按键*/if(key=ESC)/*按ESC键退出*/break;elseif(key=UP&snake.direction!=4)/*判定是否往相反方向移动*/snake.direction=3;elseif(key=RIGHT&snake.direction!=2)snake.direction=1;elseif(key=LEFT&snake.direction!=1)snake.directi
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100