当前位置:文档之家› 贪吃蛇课设

贪吃蛇课设

唐山学院一、设计题目、内容及要求题目:贪吃蛇游戏程序设计内容:游戏开始时弹出初始菜单,游戏者按任意键进入游戏。

游戏者用←↓→↑键来控制蛇在游戏场景内运动,每吃到一个食物,游戏者得10分,分数累加结果会在计分板上显示;与此同时蛇身长出一节。

当贪吃蛇的头部撞击到游戏场景边框或者蛇的身体时游戏结束,并显示游戏者最后得分。

要求:程序结构合理、算法准确、语法正确,并生成可执行文件。

C语言程序设计课程设计题目贪吃蛇游戏程序设计系(部) 信息工程系班级电信4班姓名康林林学号4130220436指导教师2014年2 月24 日至 3 月7 日共 2 周2014年3月7 日二、要求的设计成果(课程设计说明书、设计实物、图纸等)1. 课程设计说明书:课程设计说明书1份,不少于2000字。

说明书中要包含需求分析、总体设计、详细设计以及主要的算法描述等内容。

2. 源代码:程序清单三、进程安排2.24-2.5:完成需求分析和程序总体设计。

2.26-2.27:完成数据录入、删除、修改、插入和浏览功能模块的设计。

2.28-3.3:程序调试无误,生成可执行文件。

3.4-.5:撰写课程设计说明书初稿。

3.6-3.7:提交课程设计说明书、程序和数据。

四、主要参考资料[1] 谭浩强,张基温.C语言程序设计教程(第3版)[M].北京:高等教育出版社,2006[2] 吕凤煮.C语言基础教程——基础理论与案例[M].北京:清华大学出版社,2005[3] 黄明、梁旭、万洪莉.C语言课程设计[M].北京:电子工业出版社,2006[4] 郭宁,郑小玲.管理信息系统[M].北京:人民邮电出版社,2006[5] 赵池龙,杨林,陈伟.实用软件工程[M].北京:电子工业出版社,2006指导教师(签名):教研室主任(签名):C语言程序设计课程设计任务书课程设计成绩评定表出勤情况出勤天数缺勤天数成绩评定出勤情况及设计过程表现(20分)课设答辩(20分)设计成果(60分)总成绩(100分)提问(答辩)问题情况综合评定指导教师签名:年月日一:需求分析1.当我们拿到这个课题的时候,我们对设计贪吃蛇这个游戏,充满浓厚的兴趣,由于这个课题设计只是对我们所设计的游戏进行了简单的要求,这对于我们初学者还说是比较合适的。

2.使用c语言编译这个程序,预计实现游戏的开始、等级的选择、分数的显示等。

3.由于vc++6.0中不包含我们设计这个游戏所需要的头文件,我们在编译的时候可以更改保存拓展名以实现程序。

二、总体设计说明在数据结构上,用数组存储蛇以及蛇的运动区域。

在数组中,每个元素有四个云感动方向,分别为RIGHT,LEFT,UP,DOWN.在没有蛇身的区域,数组的元素值为0。

在蛇身的每个节点,用一个数组元素存储当前蛇节点的运动方向。

通过改变数组中元素的值来表示蛇身的移动。

在程序中运用定时器来保证蛇的持续移动。

每个一定的时间间隔,蛇移动一格。

在设计界面时。

在Visual Studio C++6.0的环境下,建立基于对话框的工程,在工程下设计游戏界面,实现贪食蛇运行算法。

在对话框中画出一个矩形,在大矩形中,用20x20的像素单位表示每一个蛇的节点。

当数组节点的值不为0的时候,在大矩形中画出相应的蛇的节点矩形。

并在蛇每移动一小格的时候,重绘整个窗口。

在对蛇身进行绘画时。

通过数组元素的值将蛇身在对话框的矩形中显示出来。

在蛇身运动时,首先在蛇头位置蛇身增长一个节点,然后判断蛇头是否到达食物所在位置,若在食物所在位置,则蛇尾不减一,蛇身继续移动,若蛇头不在食物位置,则蛇尾减一,蛇身继续移动。

若蛇头越界或者蛇头与蛇身重叠,则游戏结束。

三:详细设计以及主要的算法描述#include<iostream>#include<windows.h>#include<conio.h>#include<time.h>#include<stdlib.h>using namespace std;#define COUT cout<<"■"//定义一个宏,用于输出方块,注意方格占两个光标struct Body//定义蛇的链表结构体,x,y分别记录纵横坐标,原点在屏幕左上角{int x,y;Body *next;//定义指向下一个结点};int Food=0,Food_x,Food_y,Direction=4,Grade,Score=0;//分别定义游戏的:食物【有是1,无是0】//食物的x,y坐标。

蛇头方向【上1,左2,下3,右4】。

级数【用于调节蛇的速度】,得分Body *body001=new Body[sizeof(Body)];//定义蛇头结点,定义为全局变量的好处是所有函数都可以引用,而且地址不会因函数结束而丢失void Position(int x,int y)//这个是使光标指向x,y左边处{COORD pos={y-1,x-1};HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out,pos);}void CreatSneak()//创造3个蛇身结点{Body *body002=new Body[sizeof(Body)];//创建在函数体内且在头结点里标记下一个蛇身,不会因函数体执行完毕而是分配的内存地址丢掉Body *body003=new Body[sizeof(Body)];Body *body004=new Body[sizeof(Body)];body001->x=11;body001->y=35;body002->x=11;body002->y=33;body003->x=11;body003->y=31;body004->x=11;body004->y=29;body001->next=body002;//依次指向下一个链表body002->next=body003;body003->next=body004;body004->next=NULL;//蛇尾指向NULL}void Prt_Map()//打印地体,就是四周的方格子{int i;for(i=1;i<=80;i+=2){Position(1,i);COUT;Position(24,i);COUT;}//x:2~23 共22个for(i=1;i<=24;i++){Position(i,1);COUT;Position(i,57);COUT;//y:3~55共27个Position(i,79);COUT;}}void Prt_Sneak()//输出蛇身{Body *p;p=body001;//创建一个临时指针,并指向头结点while(p!=NULL)//判断是否指向蛇尾{Position(p->x,p->y);COUT;//光标调整到蛇身位置p=p->next;//p指向下一个结点}Position(Food_x,Food_y);COUT;Position(7,63);cout<<"Score: "<<Score;Position(10,63);cout<<"Grade: "<<Grade;}int JudgeOver()//判断是否撞墙或者撞到自己{Body *p;p=body001->next;if(body001->y==1||body001->y==57||body001->x==1||body001->x==24) return 1;while(!(p->x==body001->x&&p->y==body001->y)){if(p->next==NULL)return 0;p=p->next;}return 1;}void Creat_Food()//创造食物{if(Food==0)//如果没有食物才创造食物{srand((int)time(0));//引用本地时间作为种子产生随机数,如果直接用随机数函数,那样会很蛋疼Food_x=rand()%21+2;//关于为什么模21与52,你分析一下我上面产生地图的函数就知道了int temp=rand()%52+3;if(temp%2==0)Food_y=temp+1;//方格子要占用两个光标,所以只能在奇数Y光标位置上产生else Food_y=temp;Food=1;}}void Move()//蛇身移动函数{Body *p=new Body[sizeof(Body)],*q,*temp=new Body[sizeof(Body)];if(Direction==1)//判断方向{if(body001->x==(Food_x+1)&&body001->y==Food_y)//蛇头吃到食物,其实也就是他们的坐标相等{temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0; Score+=5;}//把食物连接在舌头上else{temp->x=body001->x-1;temp->y=body001->y;temp->next=body001;body001=t emp;q=body001;//没有吃到食物的话,就把舌头按照它运动的方向移动一个单位while((q->next)->next!=NULL)q=q->next;//然后一次移动蛇身Position((q->next)->x,(q->next)->y);cout<<" ";//最后一个身上用空格填补delete(q->next); q->next=NULL;//删除节点}}if(Direction==2){if(body001->x==Food_x&&body001->y==(Food_y+2)){temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0; Score+=5;}{temp->x=body001->x;temp->y=body001->y-2;temp->next=body001;body001=t emp;q=body001;while((q->next)->next!=NULL)q=q->next;Position((q->next)->x,(q->next)->y);cout<<" ";delete(q->next); q->next=NULL;}}if(Direction==3){if(body001->x==(Food_x-1)&&body001->y==Food_y){temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0; Score+=5;}else{temp->x=body001->x+1;temp->y=body001->y;temp->next=body001;body001=t emp;q=body001;while((q->next)->next!=NULL)q=q->next;Position((q->next)->x,(q->next)->y);cout<<" ";delete(q->next); q->next=NULL;}}if(Direction==4){if(body001->x==Food_x&&body001->y==(Food_y-2)){temp->x=Food_x;temp->y=Food_y;temp->next=body001;body001=temp;Food=0; Score+=5;}else{temp->x=body001->x;temp->y=body001->y+2;temp->next=body001;body001=t emp;q=body001;while((q->next)->next!=NULL)q=q->next;Position((q->next)->x,(q->next)->y);cout<<" ";delete(q->next); q->next=NULL;}}}void Game(){while(1){if(JudgeOver()==1)return;//判断食物有没有被吃掉if(GetAsyncKeyState(VK_UP)&&Direction!=3)Direction=1;else if(GetAsyncKeyState(VK_LEFT)&&Direction!=4)Direction=2;else if(GetAsyncKeyState(VK_DOWN)&&Direction!=1)Direction=3;else if(GetAsyncKeyState(VK_RIGHT)&&Direction!=2)Direction=4;Creat_Food();Move();Prt_Sneak();Sleep(550-Grade*50);//用SLEEP函数实现延迟void main(){Position(12,24);cout<<"Plese Select Grade:[1~10]";cin>>Grade;if(Grade<1||Grade>10){cout<<"Worry!"<<endl;return;} system("cls");CreatSneak();Prt_Map();Prt_Sneak();Game();system("cls");Position(12,35);cout<<"You Lost !"<<endl;Position(13,31);cout<<"You Got "<<Score<<" Scores"<<endl; Position(24,29);getch();}。

相关主题