C语言课程设计贪吃蛇游戏.docx
- 文档编号:1820892
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:13
- 大小:178.15KB
C语言课程设计贪吃蛇游戏.docx
《C语言课程设计贪吃蛇游戏.docx》由会员分享,可在线阅读,更多相关《C语言课程设计贪吃蛇游戏.docx(13页珍藏版)》请在冰豆网上搜索。
C语言课程设计贪吃蛇游戏
课程设计报告
课程名称C语言课程设计
设计题目贪吃蛇游戏
2012年10月11日
1.设计目的
本课程设计的目的就是要通过一次集中的强化训练,使学生能及时巩固已学的知识,补充未学的但又必要的内容。
进行课程设计目的在于加深对程序设计基础中基础理论和基本知识的理解,促进理论与实践的结合,进一步提高程序设计的能力。
具体目的如下:
1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养学生综合运用所学知识独立完成课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。
2.设计题目及要求
【1】设计题目贪吃蛇游戏
【2】要求
实现如下功能:
贪吃蛇按一个方向运行
判短是否撞到自己
是否撞墙
游戏结束
退出
【3】本程序最大优点是简单易行
综合应用数组、指针、结构体、文件等,对该设计题目进行设计和实现。
一、正文
1.计算法分析设
1.1模块调用层次图
主函数
↓
图形驱动Init画界面DrawK游戏具体过程GamePlay图形结束Close
↓
游戏结束GameOver输出成绩PrScore
【2】系统模块调用层次图
1.总体模块流程图:
2.算法分析
①主函数main():
定义使用的常数,全局变量及函数原型说明,并调用Init()函数初始化图形系统;然后调用DrawK()函数画界面,调用GamePlay()函数实现游戏的具体过程,游戏结束后调用Close()函数关闭图形系统结束程序。
②画界面函数DrawK():
主界面是一个密封的围墙,用两个循环语句分别在水平方向和垂直方向输出连续的宽度和高度均为10个单位的矩形小方块,设置成淡青色,背景颜色为黑色。
③游戏具体过程函数GamePlay():
3.算法过程:
a.设置初始值。
为防止食物出现在一个位置上,要设置随机数发生器,真正产生随机数。
初始时,蛇只有蛇头,设定一个开始方向;
b.循环执行,直到按Esc键退出;
c.没有按键的情况下,循环执行。
如果没有食物,随机出现食物;食物的随机出现要确保它的位置在10的倍数位置上,因为蛇的坐标都是以10为模的;如果有食物,则显示食物,蛇移动身体,根据蛇的方向改变坐标值,并判断蛇是否撞到了墙或自己吃到了自己,如果出现这两种情况之一,则蛇死;调用游戏结束函数GamePlay(),结束本次游戏;
判断蛇吃到食物的方法是蛇头的坐标和食物的坐标都相等;如果蛇吃到了食物,蛇身体长一节,数组元素增加一个,身体节数、分数都进行相应的改变。
在新位置画出蛇。
采用的方法是每次移动的时候从最后一节开始到倒数第二节,将前一节的坐标赋值给后一节的坐标,移动后只要把最后一节用背景色去除即可。
D.如果有按键,则识别按键值。
如果按键为Esc键则结束游戏,程序运行结束;如果所按键为方向键,则根据该键改变蛇方向的变量direction的值,相反方向键无效。
④游戏结束函数GameOver():
游戏结束,清除屏幕,调用输出分数函数PrScore(),并显示游戏结束。
⑤输出分数函数PrScore():
在指定位置利用sprintf()将整数转换为字符串,用outtextxy()输出,、bar()函数的应用是为了覆盖原来的值。
⑥图形结束函数Close():
在显示游戏结束信息的画面时,按任意键关闭图形系统,程序结束。
二、运行结果
程序载入turboC
编译执行
处理编译过程中的句法错误
程序运行过程调试
根据修改一些指令来修改程序的运行过程
如:
结果图
三、源程序清单
#include
#include
#include
#include
#include
enumdir{up,down,left,right};//枚举类型enumdir;
//围墙;
classFence{
public:
voidInitFence();
voidOutputF();
public:
chargame[20][20];
}f;//定义对象;
//画框框;
voidFence:
:
InitFence(){
for(inti=0;i<20;i++)
for(intj=0;j<20;j++){
if(i==0||i==19||j==0||j==19)
game[i][j]='*';
elsegame[i][j]='';
}
}
//显示框框;
voidFence:
:
OutputF(){
for(inti=0;i<20;i++){
for(intj=0;j<20;j++)
cout< cout< } } //蛇结点; classSnakeNode{ private: intx,y; SnakeNode*prior,*next; public: voidadd_head(intx,inty); intget_x(); intget_y(); voiddelete_tail(); }*head=NULL,*tail=NULL; //插入头结点; voidSnakeNode: : add_head(intx,inty){ SnakeNode*q=newSnakeNode; q->x=x;q->y=y; q->next=head; q->prior=NULL; if(head)head->prior=q; head=q; if(! tail)tail=head; f.game[x][y]='*';//f对象可以在定义Fence类时定义;且Fence类在SnakeNode类前定义; } intSnakeNode: : get_x(){ returnx; } intSnakeNode: : get_y(){ returny; } //删除尾结点; voidSnakeNode: : delete_tail(){ SnakeNode*p=tail; f.game[tail->get_x()][tail->get_y()]='';//把尾结点的坐标表示的'*'置为空格; if(tail==head) tail=head=NULL; else{ tail=tail->prior; tail->next=NULL; } deletep; } //move移动; classmove{ public: dirpoint;//枚举变量point: 控制方向; intfood_x; intfood_y; public: voidmoving(); voidchange_point(char);//改变方向; voidget_food(); }; voidmove: : moving(){ inta,b; a=head->get_x();//取得头结点横坐标 b=head->get_y();//头结点纵坐标 switch(point){ caseup: --a;break; casedown: ++a;break; caseleft: --b;break; caseright: ++b;break; } if(a==19||b==19||a==0||b==0){//判断是否撞墙; cout<<"gameover! ! ! "< exit(0); } if(a==food_x&&b==food_y){//吃food; head->add_head(a,b); get_food(); } else{ head->add_head(a,b);//插入头结点; head->delete_tail();//删除尾结点; } } voidmove: : change_point(charkeydown){ switch(keydown){ case'w': point=up;break; case's': point=down;break; case'a': point=left;break; case'd': point=right;break; } } voidmove: : get_food(){ srand((unsignedint)time(NULL));//做种子(程序运行时间); food_x=rand()%18+1; food_y=rand()%18+1; f.game[food_x][food_y]='*'; } //main(); intmain(){ cout<<"Using'w,s,a,d'tocontroldirection! ! ! \n\n\n"; //画框框和小蛇; movem; f.InitFence(); head->add_head(4,3); head->add_head(4,4); head->add_head(4,5); m.get_food(); f.OutputF(); while(true){ charkeydown=getch();//getch()返回键盘上读取的字符;包含头文件 m.change_point(keydown); while(! kbhit()){//判断有没有按键落下; system("cls");//清屏函数; m.moving(); f.OutputF(); Sleep(200); } } return0; 四、个人遇到的困难与解决方法 1.程序结构的理解 由于长时间对C语言与数据结构没有接触,使我们对这些有一些相对陌生,主要是二维数组的引用以及循环的控制方面,如: (1)for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } (2)for(i=3;i { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { GameOver();/*显示失败*/ snake.li
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 贪吃 游戏
![提示](https://static.bdocx.com/images/bang_tan.gif)