C++课程设计贪吃蛇小游戏内附完整源码及附件文档格式.docx
《C++课程设计贪吃蛇小游戏内附完整源码及附件文档格式.docx》由会员分享,可在线阅读,更多相关《C++课程设计贪吃蛇小游戏内附完整源码及附件文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
________________________________
学生姓名:
专业:
班级:
学号:
指导教师:
上机成绩:
上机地点:
上机时间:
____________年_______月_______日
一、上机目的与上机要求(可以有多个目标及要求,对应多个上机内容)
1、上机目的(具体的目的,类似于“提出问题”)
将理论用于实践,更充分的掌握课本的知识,巩固并加深对课本知识的理解,进一步提高我们的动手编程能力。
编写程序既能锻炼我们的动手能力,又能培养提高我们的学习热情。
贪吃蛇是一个很简单而且比较益智的小游戏,编写起来比较简单,而且我们所学的知识也恰好能解决这个问题。
首先,我们需要明确一下编写贪吃蛇的框架。
其次,需要几个类控制整个游戏的运作。
最后,如何解决蛇移动和吃到食物的问题。
2、上机要求(具体的上机要求及相关的问题分析,类似于“分析问题”)
由于游戏比较简单,所以一个类足够驾驭这个游戏的运作。
还有蛇的移动,因为蛇吃到一个食物,相应的长度就加一,这样,应该拆成蛇头、蛇身、蛇尾来进行比较方便操作,蛇头控制移动方向,而且蛇头吃到了食物,则蛇尾不需要去除。
二、上机设备(环境)及要求
操作系统:
Windows7
编译环境:
VC6.0++
三、上机内容与步骤(类似于“解决问题”)
1、步骤1
(1)上机内容(明确的上机内容):
解决问题的思路和方法(系统/方法/算法等),图文结合
首先,定义一个二维数组来储存整个地图的内容;
其次,再定义一个二维数组来记录蛇每部分的运动方向;
最后,分析一下整个游戏的关键:
一开始,我们把蛇分成了三个部分,蛇头、蛇身、蛇尾。
如图所示,黄色的是墙,这是初始状态的地图。
食物
蛇尾
蛇头
下图是初始状态的方向。
蛇尾→
蛇头→
蛇开始默认移动,先擦除蛇头,绘制蛇身,如下图:
蛇身
根据方向绘制蛇头,如下图:
擦除蛇尾,如下图:
再绘制蛇尾,如下图:
这样便完成了蛇的移动,同样的方向的记录也是类似的。
蛇头↑
蛇尾↑
注:
有箭头代表蛇的方向。
当蛇吃到食物的时候,只需要在食物的地方绘制蛇头,而原来蛇头的地方绘制蛇身即可,无须擦除蛇尾再进行绘制,然后重新产生食物,如下图。
蛇身↑
当检测到按键的时候,先改变蛇的移动方向,再移动蛇即可。
(2)主要实现(详细的关键代码)
voidRetroSnaker:
:
move()
{
switch(directionMap[hearY][hearX])
{
caseUP:
if(FOOD==map[hearY-1][hearX])//吃到食物
againFood();
elseif(EMPTY==map[hearY-1][hearX])//什么都没遇到
erasingTheTail();
//擦除尾巴
else{
gameOver=true;
//没有遇到食物或者空,则表示游戏结束
break;
}
erasingTheHear(UP);
break;
caseDOWN:
if(FOOD==map[hearY+1][hearX])//吃到食物
elseif(EMPTY==map[hearY+1][hearX])//什么都没遇到
erasingTheHear(DOWN);
caseLEFT:
if(FOOD==map[hearY][hearX-1])//吃到食物
elseif(EMPTY==map[hearY][hearX-1])//什么都没遇到
erasingTheHear(LEFT);
caseRIGHT:
if(FOOD==map[hearY][hearX+1])//吃到食物
elseif(EMPTY==map[hearY][hearX+1])//什么都没遇到
erasingTheHear(RIGHT);
default:
}
}
四:
上机运行结果与分析
(详细的程序运行结果,图/表/文相结合,并对结果进行较全面的对比分析,类似于“验证问题”)
与预期的结论一致,运行结果满足预期效果。
五:
结论(讨论)
1、上机结论(对应前面的上机目的)
通过本次上机,充分的锻炼了我解决问题的能力,让我更加的了解到知识得运用才能熟练的掌握,也提高了我的学习兴趣和热情。
2、讨论(存在的问题及可能的改进方向)
游戏界面比较单一,只有蛇和食物,没有统计分数和排行榜,也没有游戏结束的画面,还不能调整游戏的难度,蛇的速度基本是恒定的,无法动态修改。
这是我需要改进的地方。
六、教师评审
教师评语
实验成绩
(虽然上机主要侧重于验证问题,但是建议各位老师从解决“工程技术问题”,特别是“复杂工程问题”的角度去评审学生上机过程及上机报告,主要内容包括提出问题、分析问题、解决问题及验证问题。
要有较详细的评审意见。
)
签名:
日期:
附录
用户使用手册
1、编译运行即开始游戏。
2、按小写字母wsad即可进行游戏的操作。
3、按任意键暂停游戏
程序源代码
#include<
iostream>
ctime>
conio.h>
stdlib.h>
Windows.h>
usingnamespacestd;
#defineN20//地图大小
#defineWALL5//墙
#defineHEAR1//蛇头
#defineTAIL2//蛇尾
#defineBODY3//蛇身
#defineFOOD4//食物
#defineEMPTY0//空
#defineUP'
w'
//蛇的前进方向:
上下左右
#defineDOWN'
s'
#defineLEFT'
a'
#defineRIGHT'
d'
#defineGMAE_TIME100//设置游戏的绘制速度
classRetroSnaker{
public:
RetroSnaker(){Init();
boolgameOver;
//游戏是否结束
voidmove();
voidmove(charch);
private:
intmap[N][N];
//二维地图
intdirectionMap[N][N];
//方向图
inthearX,hearY;
//蛇头坐标
inttailX,tailY;
//蛇尾坐标
intfoodX,foodY;
//食物坐标
booleatFood;
//标记是否吃到食物
voidInit();
//初始化
voidgotoXY(intx,inty);
//光标跳转到屏幕的相应位置
voidagainFood();
//食物被吃,再次产生食物
voiderasingTheTail();
voiderasingTheHear(charch);
//擦除蛇头
};
move(charch)
directionMap[hearY][hearX]=ch;
move();
Init()
inti=0,j=0;
gameOver=false;
eatFood=false;
for(i=0;
i<
N;
i++)
for(j=0;
j<
j++){
map[i][j]=EMPTY;
//清空二维数组
directionMap[i][j]=EMPTY;
//清空方向图
i++){//初始化墙
map[0][i]=WALL;
map[N-1][i]=WALL;
map[i][0]=WALL;
map[i][N-1]=WALL;
//初始化蛇头
hearX=N/2;
hearY=N/2;
map[hearY][hearX]=HEAR;
directionMap[hearY][hearX]=RIGHT;
//记录蛇头的移动方向
//初始化蛇尾
tailX=N/2-1;
tailY=N/2;
map[tailY][tailX]=TAIL;
directionMap[tailY][tailX]=RIGHT;
//记录蛇尾的移动方向
//初始化食物
srand(unsigned(time(NULL)));
//随机播种
do{
foodX=rand()%(N-1)+1;
//产生随机数1~(N-1)
foodY=rand()%(N-1)+1;
}while(EMPTY!
=map[foodY][foodX]);
map[foodY][foodX]=FOOD;
//首次显示游戏界面
i++){
j++)
switch(map[i][j])
{
caseWALL:
cout<
<
"
■"
;
break;
caseHEAR:
○"
caseBODY:
caseTAIL:
●"
caseFOOD:
★"
default:
cout<
break;
}
cout<
endl;
gotoXY(intx,inty)
COORDcoord;
coord.X=2*x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
againFood()
gotoXY(foodX,foodY);
cout<
erasingTheTail()
gotoXY(tailX,tailY);
map[tailY][tailX]=EMPTY;
if(UP==directionMap[tailY][tailX]){
directionMap[tailY][tailX]=EMPTY;
tailY--;
elseif(DOWN==directionMap[tailY][tailX]){
tailY++;
elseif(LEFT==directionMap[tailY][tailX]){
directionMap[tailY][tailX]=