c语言课程设计贪吃蛇设计.docx
- 文档编号:10764987
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:23
- 大小:883.38KB
c语言课程设计贪吃蛇设计.docx
《c语言课程设计贪吃蛇设计.docx》由会员分享,可在线阅读,更多相关《c语言课程设计贪吃蛇设计.docx(23页珍藏版)》请在冰豆网上搜索。
c语言课程设计贪吃蛇设计
c语言课程设计-贪吃蛇设计
《C语言程序设计》课程设计
题目:
贪吃蛇游戏设计
学院:
信息学院
专业:
网络工程
姓名:
李益双
学号:
1101010121
班级:
信息A1111班
指导教师:
罗成
职称:
讲师
完成日期:
2012年6月
摘要
本文首先对小游戏的发展前景进行了展望,并对其研究现状与研究目标进行了介绍。
然后对编写程序用的工具软件VC++进行了介绍。
接着进入主题,对贪吃蛇这个游戏进行了介绍然后又对游戏总体设计与分析。
最后详细地介绍了游戏中各个细节的具体实现,并进行了细致的分析。
行云流水般地将在游戏编写过程中遇到的问题以及相应的解决方法表述的清清楚楚。
在实践中我获得到了许多宝贵的知识和编程的经验!
关键字:
贪吃蛇,VC++,小游戏。
ABSTRACT
Inthispaper,Atthewesawthefutureofthedevelopmentoflittlegame.andthenweintroducedthesituationandtargetofgameresearch.afterwards,wepeovidedtheprogrammingtoolwhichiscalledVC++madebyMicrosoft.Nextlet’sgetdowntobusiness.inthefirstplace.weintroducedthegame—greedysnake.inthesecondplace,wedesignedandanalyzedtheoverallgame.Atlast,wevividlyprovidedtheparticularrealizationofgamedetails,andanalyzedthosedetailmeticulous.Intheprocessofgameprogramming.Icameupagainstlotsoftrouble,butIdidn’tgiveitup,bythecontrary.Iovercamethemonebyone,andatlastImetwithsuccess,Ihavegotmanypreciousknowledgeandprogrammingexperienceinthepractice.
Keywords:
Greedysnake,VC++,littlegame.
项目背景
贪吃蛇简介
蛇——传说中的圣灵之物,仰头为神,俯首为魔。
蛇是月亮国膜拜的神,月亮国的子民们都认为蛇是万能的主宰派来保护他们的守护者。
蛇在这个岛屿就像空气一样自然的出现在各个角落,有些还成为居民的宠物,陪伴孩子长达,和年轻人一起去探险,守护者散步的老人。
在善良的女神女娲神保佑下,人们的生活安宁平静。
为了答谢女娲神的庇佑,每年月亮果的国民们都会举办一个守护蛇大赛,大人家都会拿出自己最强、最炫、最快、最稀有的蛇来参加比赛,获得第一名的人将得到国王的特别嘉奖。
所以国民一生都在培养更有威力、更长、更壮的蛇。
“贪吃蛇”是在一个产生于1970年代中后期的计算机游戏。
也叫贪吃蛇。
该游戏在1990年代由于一些手机将其引入而一时间再度流行起来。
在游戏中,玩家操作一条细长的蛇爬行与一个带边界的平面上,一路拾起触碰到之事或其它类似的物件,并要避免触碰到自身或者包围者游戏区的“墙”。
每次贪吃蛇吃掉一件食物,它的身体变增长一些,这让游戏的难度渐渐变大。
操控贪吃蛇时,玩家操控贪吃蛇的头部的朝向(上、下、左、右)操控贪吃蛇的进行方向
贪吃蛇的身体将跟随其头部行进。
另外,玩家不可在游戏中途停止贪吃蛇的行进。
随着贪吃蛇的成功移植到手机系统,贪吃蛇的操作按键要求与手机按键完美匹配,使贪吃蛇游戏风靡起来。
需求分析
现在小游戏很是流行在手机以及互联网上都是很火热的,这引起了我的兴趣。
查看了而几个小游戏网站,其实也没有什么,只不过是写以FLASH为主开发的Flash小游戏,确实没有什么非同凡响的地方。
但你仔细思考想一下,就不难发现,这些东西还真有一定的市场,只是现在还默默地没有被人们所关注。
首先,不断扩大的网络爱好者和电脑应用者队伍,带来了很多“新手”,这些新手还会像以前我们刚开始接触是一样,对一些相对简单,操作也方便、娱乐性强东西很感兴趣。
源源不断的加入者,组成了“小游戏”玩家的新主力军。
其次,“小游戏”很方便下载,而且现在的数码小产品被越来越多的青年所青睐,拥有许多超强功能来支持这些小游戏。
再次,随着电视上网络上进程的推进,网络走进千家万户的时代为期不远。
因为电视分辨率与内存大小的限制,以及遥控器操作要求简单,这种小游戏将会有一个巨大而潜在的市场。
今后小游戏的发展趋势:
1,体积小,小游戏一般都占硬盘空间相当小,方便下载传播;2,内容好,体积小并不代表没有内容,相反小游戏的内容还是比较丰富的;3,耐玩,正是因为小游戏占空间不大,它也是在电脑上占据比较长的游戏了;4,娱乐性高,小游戏玩起来还是蛮有趣的,拥有一定的娱乐性;5,无年龄层次,不分老少、男女小游戏面向的晚间范围广。
概要设计
贪吃蛇游戏的额基本规则:
通过键盘上的1、2、3、4键来控制蛇的运行方向,当蛇将食物吃到了后身体长度自动增加,当蛇撞到墙或吃到自身则蛇死,此时将退出贪吃蛇游戏;当蛇向左运行时,按向右键将不会改变蛇的运行方向,蛇将继续前进;同理其他方向一样。
在编写贪吃蛇游戏时有一下几个技术要点。
第一、如何实现蛇在吃到食物后食物消失,这里用到的方法是采用背景色在出现事物的地方将食物重画,这样食物就消失不见了。
第二、、如何实现蛇的移动且在移动过程中不留下痕迹,实现蛇的移动也是贪吃蛇游戏最核心的技术,主要方法是将蛇头后面的每一节逐次移动到前一节的位置,然后按蛇的运行方向不同对蛇头的位置作出相应调整,蛇每向前运行一步,相应的将其为不宜结用背景色重画,及去掉其尾部。
第三、当蛇向上运行时,从键盘中输入向下键,此时蛇的运行方向不变,其他几个方向以此类推,之力我是采用if….eles语句来实现该功能。
第四、食物出现的位置这里采用随机产生,但这种随机产生也是有一定限制条件的即食物出现位置的横纵坐标必须能被10整除,只有这样才能保证蛇能够吃到食物。
详细设计与测试
601定义蛇身的数据结构
对于蛇身在某一瞬间的位置标识,我们采用一个一维的数组来标识出来,即用动态增长的数组来存储每一节蛇身的位置(包括蛇头和蛇尾)。
也就是说,用存储单位空间存储当前蛇身某部位的位置来对整个蛇身的位置进行标识,因此每个存储空间的内容就是一个点的坐标值(row,col),而蛇身以从左到右的方式进行编号,最左边是蛇的尾部,最右边是蛇的额头不。
如表6-1为三节蛇的数据结构。
表6-1三节蛇的数据结构
(snake[0].row,snake[0].col)
(snake[1].row,snake[1].col)
(snake[2].row,snake[2].col)
snake[0].row和snake[0].col是第0号蛇身也就是蛇尾的横坐标row和纵坐标col:
以此类推,snake[2].row和snake[2].col则是第二号蛇身也就是蛇头的横坐标row和纵坐标col。
602算法设计与程序流程图
602.1贪吃蛇算法设计
Snakegame:
1:
初始化游戏,游戏界面的绘制、游戏速度的设置、食物产生
2:
while玩家不按退出键
3:
if玩家按下某方向键
4:
蛇身按照玩家按下方向移动
5:
eles蛇身按照默认方向(右)移动
6:
endif
7:
if蛇头碰到墙壁
8:
游戏结束
9;endif
10:
if蛇头碰到自身
11:
游戏结束
12:
endif
13:
if蛇碰到食物
14:
蛇身增长、分数增加、产生新食物
15;endif
16:
endwhlile
17:
游戏结束
=============================================================
602.2程序流程图
602.2程序流程图
603光标移动的设计与实现
在游戏过程中,对于光标的移动相当重要。
首先,食物的产生是随机产生的,可能出现在游戏界面的任何一个地方,因此生成随机坐标后,就要将光标移动到该坐标,然后进行显示食物操作。
其次,游戏界面的显示也需要移动光标。
譬如,纵向的围栏的显示。
再次,就是蛇身的移动了,蛇尾部要不断清空,这样蛇就动起来了。
其中X为纵坐标,Y为横坐标,(X,Y)对应于屏幕上的像素点。
COORD这个数据结构、SetConsoleCurorPosition()、GetStdHandle()这2个函数都是位置,GetStdHandle()得到标准输入输出的句柄。
Gotoxy()这个函数是布尔型的,返回真或假。
下面将光标移动应用到贪吃蛇游戏中
603.1显示水平围墙的实现
水平围墙就是在游戏区域中,限制蛇行动的上下界,即活动的对打边界。
这里用一系列“====”连续显示,直到设定的最大活动范围。
水平围墙如图603.1所示
图603.1水平围墙
603.2显示分数的实现
对于玩家的得分,是在游戏当中,玩家控制贪吃蛇每当吞掉一个食物,相应的分数就会增加一分。
游戏结束时,分数会清零,再下一盘游戏中从0分开始计数
玩家的分数显示如图603.2所示
603.2分数显示图
603.3接受玩家按键信息的实现
为了接受来自键盘的信息,之力用到了conio.h这个头文件。
通过一个布尔函数kbhit()的真假来判断是否有按键被敲击,如果没有,游戏正常运行;否则通getch()得到那个char变量的按键信息,然后修改蛇的运动方向。
603.4游戏结束时显示信息的实现
当游戏介绍时,屏幕上要显示“Gameover”的字样,还有“anothergame(y/n)?
”的字样来让玩家选择继续游戏还是退出游戏。
这里是通过使用gotoxy()函数,是上述的字样在想要显示的位置出现的。
游戏结束的而显示信息如图603.4所示
图603.4游戏结束显示
604贪吃蛇游戏主干的设计
604.1游戏的初始化与加载的实现
游戏开始的时候,初始化蛇的长度为4节,行进方向为右。
并定义2维数组screengrid[row][col],该数组的作用是产生食物用。
蛇开始移动的坐标是哦(2,2)。
然后绘制围墙横的围墙用一排“=”显示,纵的围墙用一列“||”显示,这样游戏的框架就出来了,初始化游戏分数,并显示游戏的一些帮助,如按键设置等。
游戏初始化,包括蛇的初始长度,蛇初始行进的方向,游戏区域的显示。
游戏加载完成后,效果如图604.1所示
图604.1贪吃蛇的初始化
604.2食物随机产生的实现
对于前面提到过的一个二维数组screengrid[row][col]这里要用到。
用rand()函数生成2个随机生成的整数作为食物的横坐标和纵坐标,并判断食物是否出去围墙,如果在游戏区域外面,则对随机生成的横纵坐标进行修改。
然后移动光标到此处坐标进行输入“*”操作。
(用“*”代表食物)这里的c和r会在判断蛇头是否碰到食物用到。
这里要应用到time.h这个头文件,用于产生随机数。
食物随机产生,如图602.2所示
图604.2随机食物产生
604.3蛇身的增长设计
对于蛇身增长的设计要考虑到蛇头的运行方向。
如果蛇头向右行进,新增加的蛇身横坐标不变,纵坐标增加1;如果蛇头向左行进,新增加的蛇身横坐标不变,纵坐标减1;如果蛇头向上行进,新增加的蛇身纵坐标不变横坐标减1;如果蛇头向下行进,新增加的蛇身纵坐标不变横坐标加1.
604.4蛇身的显示与移动的设计实现
对于蛇身的显示属于本程序设计的难点之一,因为蛇身是一个运动的物体,每个时刻的某一节所在的位置是变化的。
就像一个动画过程,需要每隔一个固定的时间,对蛇进行显示一次,并将蛇尾部的一节消掉,使蛇头向前增进一节。
这是一个动态的过程,当然设置的固定显示蛇身时间是能让人眼来得及反应的时间,也就是不能太快,否则在人看到就是频闪的一串了。
其中addsegment()这个函数是用来为蛇头的前移赋值的。
604.5蛇的头部与物体的碰撞的设计实现
对于蛇的头部与物体碰撞的检测同样属于本程序设计的难点。
1、首先来关注蛇的额头不与游戏区域围墙的碰撞检测。
如果检测到有碰撞,则游戏结束;否则游戏正常运行。
这个是通过判断蛇的头部的横、纵坐标是否超过设定的额最大的界限或是低于最小的下限来判断的
如图604.5.1所示为碰壁情况
图604.5.1为碰壁情况
2、其次,考虑蛇的头部是否与自己身体的某个部位产生的碰壁检测。
如果检测到有碰壁,则游戏结束;否则游戏正常运行。
这个是通过一个循环将蛇的头部的横、纵坐标值与每节蛇身(处蛇头外)知道蛇的尾部的横、纵坐标值与蛇的头部的横、纵值一致,则游戏结束;否则游戏正常运行。
如图604.5.2所示为蛇碰到自身的情况,蛇头与距蛇尾长度一致的蛇身处相撞。
图604.5.2蛇碰到自身的情况
3、最后,就是蛇的头部是否与食物碰撞的检测了。
如果检测到没有碰到则游戏正常运行;否则首先将二维数组screengrid[row][col]里有食物的那个数据元素清空,以便生成下一个食物。
然后在游戏区域再随机产生一个食物,分数和蛇的长度分别增加1,最后在游戏区域下方显示分数。
这里是通过令蛇的头部的横、纵坐标与先前产生食物时设置的2个变量进行比较判断的,这2个变量分别是r,c(r表示食物的横坐标,c表示食物的纵坐标),如果2者分别相等,则成功吞掉食物;否则游戏继续进行。
如图604.5.3所示为将要碰到食物的情况,食物用“*”表示
图604.5.3蛇碰到食物的情况
结论
通过理论与实践的完美结合,我的贪吃蛇游戏成功的编制完成了。
虽然所编写的而这个游戏很简单,又因为自己能力有限,游戏画面相当粗糙,没有经过美化的界面美感就谈不上了,只能用简陋形容了。
但是值得骄傲的是整个游戏的编写是自己亲手,并且依靠自己的智慧独立完成的。
在编写游戏过程中,遇到了许多难题,例如,蛇的头部与食物的检测问题,蛇的移动与显示问题,蛇的转向问题,食物的随机生成问题等等,这些个难题摆在面前,让人实在有些招架不住。
经过查阅大量的文献资料阅读相关书籍,最后决定了采用分治算法的思想来对摆在面前的问题一一击破。
在解决的是蛇的移动与显示问题的时候,通过大量的研究、实验与调试,试验过多种移动与显示的方法,最后决定了一种简单易用的算法。
解决难题的时候,仿佛是拨了一层云,又见一层云,但是日光也越来越闪耀了,最终看到了阳光,取得了成功。
自己感觉通过这次学习研究,自己受益匪浅。
不仅自己揭开了游戏程序神秘的面纱,而且在实际的程序编写与调试过程中,自己成长了不少,实战的能力提高了不少。
万丈高楼平地起,能够编写复杂的游戏都是在编写简单的游戏基础上演变过来的能力。
然而像贪吃蛇这样的简单游戏,就自然成了设计者的入门之选,因为其界面简单,操作、玩法一目了然,所以编写起来就不会很困难,而且需要考虑的问题也不用太多,就是蛇的显示、移动、碰撞3个游戏的主块,攻破这3个主块,程序就自然编写出来了,不会一开始就把游戏设计初学者拒之门外。
编成之后就感觉就会油然而生,并使之对游戏设计产生强烈的兴趣。
成为向游戏设计之路成功迈进的第一步,同时对于VC++的运用水平也会上升,用起来会更加娴熟、得心应手。
从易到难这是哟个准则,总之,贪吃蛇小游戏的研究会对增长程序阅读能力、程序编写能力等起到了意想不到的作用。
当然,自己的程序不足之处到处都是,譬如可以讲画面设计的美观一点,可以设置一下游戏的难度,可以令算法的执行效率再高一点并不满足编写出来就行。
字啊以后漫漫的研究学习道路上,我还有很远的璐要走,迎接我的是一个严峻的挑战。
参考文献
1.《C语言程序设计》.朱立华王立柱.人民邮电出版社。
2.《C语言程序开发—范例宝典》.王娣安剑孙秀梅.人民邮电出版社。
3.《数据结构》.姜梅赵坚.中国水利水电出版社
4.《高级语言C++程序设计》.刘璟周玉龙.高等教育出版社
5.《C++实战操作100例》.蒋卫华李伟华.清华大学出版社
6.《游戏设计基础》.EmestAdams.机械工业出版社
7.《游戏设计概论》.潜龙.科学出版社
————致谢
2012.6
附录
——编码
#defineN200
#include
#include
#include
#defineLEFT0x4b00
#defineRIGHT0x4d00
#defineDOWN0x5000
#defineUP0x4800
#defineESC0x011b
inti,key;
intscore=0;/*得分*/
intgamespeed=50000;/*游戏速度自己调整*/
structFood
{
intx;/*食物的横坐标*/
inty;/*食物的纵坐标*/
intyes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
structSnake
{
intx[N];
inty[N];
intnode;/*蛇的节数*/
intdirection;/*蛇移动方向*/
intlife;/*蛇的生命,0活着,1死亡*/
}snake;
voidInit(void);/*图形驱动*/
voidClose(void);/*图形结束*/
voidDrawK(void);/*开始画面*/
voidGameOver(void);/*结束游戏*/
voidGamePlay(void);/*玩游戏具体过程*/
voidPrScore(void);/*输出成绩*/
/*主函数*/
voidmain(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
voidInit(void)
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"c:
\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
voidDrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(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;i<=450;i+=10)
{
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
}
/*玩游戏具体过程*/
voidGamePlay(void)
{
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while
(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!
kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!
=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!
=0)
food.y++;
food.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case1:
snake.x[0]+=10;break;
case2:
snake.x[0]-=10;break;
case3:
snake.y[0]-=10;break;
case4:
snake.y[0]+=10;break;
}
for(i=3;i { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { GameOver();/*显示失败*/ snake.life=1; break; } } if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55|| snake.y[0]>455)/*蛇是否撞到墙壁*/ { GameOver();/*本次游戏结束*/ snake.life=1;/*蛇死*/ } if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/ break; if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/ { setcolor(0);/*把画面上的食物东西去掉*/ rectangle(food.x,food.y,food.x+10,food.y-10); snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food.yes=1;/*画面上需要出现新的食
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 贪吃 设计