课程设计贪吃蛇小游戏.docx
《课程设计贪吃蛇小游戏.docx》由会员分享,可在线阅读,更多相关《课程设计贪吃蛇小游戏.docx(16页珍藏版)》请在冰豆网上搜索。
课程设计贪吃蛇小游戏
课程设计报告
课程名称:
面向对象程序设计C++
设计题目:
贪吃蛇小游戏
专业:
运算机科学与技术
姓名:
学号:
指导教师:
李晓虹
2016年1月1日
一、开发背景及意义
开发背景
贪吃蛇是众所周知的益智类小游戏,选择那个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇那个游戏就深深地吸引着我,它的制作方式关于以前的我而言都是很神秘的。
我希望通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精华。
尽管我的编程能力不是很强,可是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。
因此我选定了那个题目。
二、系统需求分析
、程序功能
贪吃蛇游戏是一个经典小游戏,一条蛇在封锁围墙里,围墙里随机显现一个食物,通过按键盘四个光标键操纵蛇向上下左右四个方向移动,蛇头撞倒食物,那么食物吃掉,蛇躯体长一节,同时记10分,接着又显现食物,等待蛇来吃,若是蛇在移动中撞到墙或躯体交叉蛇头撞倒自己躯体游戏终止。
、设计思想
程序关键在于表示蛇的图形及蛇的移动。
用一个小矩形快表示蛇的一节躯体,躯体每长一节,增加一个矩形块,蛇头用俩节表示。
移动时必需从蛇头开始,因此蛇不能向相反的方向移动,若是不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节躯体,因此按下有效方向键后,先确信蛇头的位置,而后蛇2 的躯体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的缘故,原先的蛇的位置和新蛇的位置差一个单位,因此看起来蛇多一节躯体,因此将蛇的最后一节用背景色覆盖。
食物的显现与消失也是画矩形块和覆盖矩形块。
为了便于明白得,概念两个结构体:
食物与蛇。
、流程图
图2-1
三、整体设计
运行环境
本程序运行时需要硬件环境和支持环境。
a.硬件环境:
一样的PC机
b.软件环境:
WINGDOWS95或以上
系统流程
用流程图示出程序的要紧操纵流程和处置流程,如图3-1所示:
图3-1
用户接口设计
a.用户看到的游戏界面:
网状边框表示草地,绿色矩形串代表蛇,绿色空心圆形代表食物。
b.用户通过单击工具栏按钮【玩】或【游戏】—>【开始】开始游戏。
c.用户能够在窗口中直接看到游戏玩法的文字提示。
d.游戏终止时程序会弹出窗口提示。
四、详细设计
数据结构
动态数组CArraym_aBody;//保留蛇身
点类CPointm_pAim;//保留一个食物目标的坐标
函数
函数概念
函数概念是对各个基础函数的概念,而且设置需要运用的信息,便于挪用
#defineN200
#defineM200
#include""
#include<>
#include<>
#include<>
#include<>
#include<>
#include<>
#include<>
#defineLEFT97//A
#defineRIGHT100//D
#defineDOWN115//S
#defineUP119//W
#defineEsc0x011b
inti,key;
intscore=0;
intgamespeed=250;//游戏速度可依如实际情形自行调整
structFood
{
intx;//食物的横坐标
inty;//食物的纵坐标
intyes;//判定是不是要显现食物的变量
}food;//食物的结构体
structSnake
{
intx[M];
inty[M];
intnode;//蛇的节数
intdirection;//蛇的移动方向
intlife;//蛇的生命,0表示活着,1表示死亡
}snake;
voidInit();//图形驱动
voidClose();//图形终止
voidDrawK();//开始画面
voidGamePlay();//玩游戏的具体进程
voidGameOver();//游戏终止
voidPrScore();//输出成绩
voidCSnakeView:
:
IniAim()//随机函数生成食物的X和Y坐标
voidCSnakeView:
:
IniGame()//改函数对游戏初始化概念游戏的初始状态
voidCSnakeView:
:
ReDisplay(CPointpPoint)//刷新游戏区域中pPoint处的一个小方格
voidCSnakeView:
:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)//判定键盘按钮事件
CView:
:
OnTimer(nIDEvent);//计时器函数来重画屏幕
主函数main()
主函数是程序的主流程,第一概念利用到的常数、全局变量及函数原型说明,然后初始化图形系统,挪用函数DrawK()画出开始画面,挪用函数GamePlay(),即玩游戏的具体进程,游戏终止后挪用Close()关闭图形系统,终止程序
voidmain()//主函数
{
Init();//图形驱动
DrawK();//开始画面
GamePlay();//玩游戏的具体进程
Close();//图形终止
}
voidInit()//图形驱动
{
intgd=DETECT,gm;
initgraph(&gd,&gm,"");/*此处为turboc的途径,读者能够依照自己的电脑而改*/
cleardevice();
}
画界面函数DrawK()
主界面是一个封锁的围墙,用两个循环语句别离在水平和垂直方向输出持续的宽度和高度均的矩形方块,表示围墙,为了夺目,设置为白色。
voidDrawK()//开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙
{
setbkcolor(GREEN);
setcolor(LIGHTRED);
setlinestyle(0,0,5);//设置线型
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);//右边
}
}
游戏具体进程函数GamePlay()
这是游戏的要紧组成部份,他采纳将前一节的坐标赋给后一节,用背景颜色将最后节去除,当蛇头的坐标与食物的坐标相等时,表示食物被吃掉了。
voidGamePlay()//玩游戏的具体进程
{
rand();//随机数发生器
=1;//1表示需要显现新食物,0表示已经存在食物
=0;//蛇活着
=1;//方向往右
[0]=100;[0]=100;//舌头坐标
[1]=110;[1]=100;
=2;//蛇的节数
PrScore();//输出分数
while
(1)//可重复玩游戏,按ESC键终止
{
while(!
kbhit())//在没有按键的情形下,蛇自己移动躯体
{
if==1)//需要显现新食物
{
=rand()%400+60;
=rand()%350+60;
while%10!
=0)//食物随即显现后必需让食物能够在整格内,如此才能让蛇迟到
++;
while%10!
=0)
++;
=0;//画面上有食物了
}
if==0)//画面上有食物就要显示
{
setcolor(GREEN);
rectangle,,+10,;
}
for(i=;i>0;i--)//蛇的每一个环节往前移动,也确实是贪吃蛇的关键算法
{
[i]=[i-1];
[i]=[i-1];
}
switch//1,2,3,4表示上下左右四个方向,通过那个判定来移动蛇头
{
case1:
[0]+=10;break;
case2:
[0]-=10;break;
case3:
[0]-=10;break;
case4:
[0]+=10;break;
}
for(i=3;i<;i++)//从蛇的第四节开始判定是不是撞到自己了,因为蛇头为两节,第三节不可能拐过来
{
if[i]==[0]&&[i]==[0])
{
GameOver();//显示失败
=1;
break;
}
}
if[0]<55||[0]>595||[0]<55||[0]>455)//蛇是不是撞到墙壁
{
GameOver();//本次游戏终止
=1;//蛇死
}
if==1)//以上两种判定以后,若是蛇死就跳出内循环,从头开始
break;
if[0]==&&[0]==//吃到食物以后
{
setcolor(0);//把画面上的食物去掉
rectangle,,+10,;
[]=-20;
[]=-20;//新的一节先放在看不见得位置,下次循环就取前一节的位置
++;//蛇的躯体长一节
=1;
score+=10;
PrScore();//输出新的得分
}
setcolor(WHITE);//画出蛇
for(i=0;i<;i++)
rectangle[i],[i],[i]+10,[i]-10);
Sleep(gamespeed);
setcolor(0);//用黑色去除蛇的最后一节
rectangle[],[],[]+10,[]-10);
}
if==1)//若是蛇死就跳出循环
break;
key=getchar();//同意案件
if(key==Esc)//按ESC键退出
break;
elseif(key==UP&&!
=4)
=3;
elseif(key==RIGHT&&!
=2)
=1;
elseif(key==LEFT&&!
=1)
=2;
elseif(key==DOWN&&!
=3)
=4;
}//endwhile
(1)
}
游戏终止函数GameOver()
游戏终止,清除屏幕,输出分数,显示游戏终止信息。
voidGameOver()//游戏终止
{
cleardevice();
PrScore();
setcolor(RED);
outtextxy(100,100,"呜呜呜,贪吃蛇挂掉了!
!
!
");
getch();
}
voidPrScore()//输出成绩
{
charstr[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
sprintf(str,"score:
%d",score);
outtextxy(55,20,str);
}
voidClose()//图形终止
{
getch();
closegraph();
}
五、系统调试
能够依照程序运行的错误提示对原程序进行修改,在调试进程中有时也会碰到不懂的问题,我去图书馆或上网查阅一些资料或是向教师请教也解决了对源程序一一修改直到运行成功。
六、结果分析
运行界面
图6-1游戏运行界面
图6-2游戏终止界面
图6-3游戏终止界面
界面分析
如图6-1游戏运行界面所示,游戏能够实现其大体功能,正常运行,界面有一个菜单项,进行辅助功能,能够依照需要进行选择,可点击游戏的下拉菜单开始或点击工具栏的玩开始游戏。
第二界面会显示当前玩家的游戏历时和当前得分,游戏主界面还有对游戏的具体说明。
如图6-2游戏终止界面显示,当贪吃蛇碰着四面任何一面时,游戏就终止,系统会弹出“呜呜呜,贪吃蛇挂掉了!
!
!
”的提示框,关闭提示框,系统停留在本次游戏界面,再次点击开始,系统数据清空。
七、总结
在设计那个程序中我要紧学会了如何运用以下有关C语言和C++的知识
1)函数概念是要做到顾名思义是很重要的,它对读程序的人正确熟悉程序
十分重要,在修改那个程序的进程中也能专门快找到程序各模块的作用,大大增加了程序的可读性。
2)分析函数先从main()函数入手。
Main()函数是C++源程序编译时的开始,
从main()函数开始读函数可将其他函数的功能明白得得更透彻。
3)在做程序的时候先列框架,将那个程序所要达到的目的(功能)分析出
来,选择正确的数据结构然后在将程序模块化,依照模块编写函数加倍简单合理。
4)我还了解了很多的库函数的作用,如字符串函数中有很多对字符串进行
处置的函数,起功能我都有所了解。
5)学会了有关头文件的利用方式,及系统调配问题的解决方式等。
6)了解到了注释的重要性。