C课程设计贪吃蛇小游戏内附完整源码及附件.docx
- 文档编号:5878201
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:21
- 大小:21.41KB
C课程设计贪吃蛇小游戏内附完整源码及附件.docx
《C课程设计贪吃蛇小游戏内附完整源码及附件.docx》由会员分享,可在线阅读,更多相关《C课程设计贪吃蛇小游戏内附完整源码及附件.docx(21页珍藏版)》请在冰点文库上搜索。
C课程设计贪吃蛇小游戏内附完整源码及附件
温馨提示
程序语言:
C、C++、C#、Python(红色字体表示本课设使用的程序设计语言)
图形功能选项:
Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(黑体注明表示本课设的程序图形种类,默认为非图形界面Win32控制台程序)
数据结构:
基础种类、数组、链表、双向链表、找寻树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、货仓、队列、串、图(黑体注明表示本课设使用的数据结构)
C++语言项:
STL库(黑体注明表示使用C++的STL库)
编译环境:
Windows764位旗舰版(Linux及其他环境请谨慎下载)
集成开发环境:
VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015均可经过编译。
(浅蓝色字体表示需要运行更正后的版本,请用户自行选择源代码测试)
分多头文件编译:
否(所有代码基本都包括在一个文件内,如需试验头文件功能,请自行参照相关文件)
内容说明:
1、课设题目及预览内容将在第二页开始显现。
2、代码行数:
259行
3、目录所示内容,本文基本涵盖,如无内容,会在本页进行说明。
4、附录绝对包括用户使用手册及程序完满源代码和详细说明。
5、如需下载其他头文件(比方DirectX需另行配置),本文会在此进行说明。
6、本文撰写内容仅供学习参照,别的,由于自己水平有限,编写之处难免存在错误和疏忽,恳请各位老师或同学责怪指正。
上机报告
程序实践名称:
________________________________
学生姓名:
________________________________
专业:
________________________________
班级:
________________________________
学号:
________________________________
指导教师:
________________________________
上机成绩:
________________________________
上机地址:
________________________________
上机时间:
____________年_______月_______日
一、上机目的与上机要求(能够有多个目标及要求,对应多个上机内容)
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])//吃到食品
againFood();
elseif(EMPTY==map[hearY+1][hearX])//什么都没遇到
erasingTheTail();//擦除尾巴
else{
gameOver=true;//没有遇到食品也许空,则表示游戏结束
break;
}
erasingTheHear(DOWN);
break;
caseLEFT:
if(FOOD==map[hearY][hearX-1])//吃到食品
againFood();
elseif(EMPTY==map[hearY][hearX-1])//什么都没遇到
erasingTheTail();//擦除尾巴
else{
gameOver=true;//没有遇到食品也许空,则表示游戏结束
break;
}
erasingTheHear(LEFT);
break;
caseRIGHT:
if(FOOD==map[hearY][hearX+1])//吃到食品
againFood();
elseif(EMPTY==map[hearY][hearX+1])//什么都没遇到
erasingTheTail();//擦除尾巴
else{
gameOver=true;//没有遇到食品也许空,则表示游戏结束
break;
}
erasingTheHear(RIGHT);
break;
default:
break;
}
}
四:
上机运行结果与解析
(详细的程序运行结果,图/表/文相结合,并对结果进行较全面的比较解析,近似于“考据问题”)
与预期的结论一致,运行结果满足预期收效。
五:
结论(谈论)
1、上机结论(对应前面的上机目的)
经过本次上机,充分的锻炼了我解决问题的能力,让我更加的认识到知识得运用才能熟练的掌握,也提高了我的学习兴趣和热情。
2、谈论(存在的问题及可能的改进方向)
游戏界面比较单一,只有蛇和食品,没有统计分数和排行榜,也没有游戏结束的画面,还不能够调整游戏的难度,蛇的速度基本是恒定的,无法动向更正。
这是我需要改进的地方。
六、教师评审
教师考语
实验成绩
(诚然上机主要重视于考据问题,但是建议各位老师从解决“工程技术问题”,特别是“复杂工程问题”的角度去评审学生上机过程及上机报告,主要内容包括提出问题、解析问题、解决问题及考据问题。
要有较详细的评审建议。
)
签字:
日期:
附录
用户使用手册
1、编译运行即开始游戏。
2、按小写字母wsad即可进行游戏的操作。
3、按任意键暂停游戏
程序源代码
#include
#include
#include
#include
#include
usingnamespacestd;
#defineN20//地图大小
#defineWALL5//墙
#defineHEAR1//蛇头
#defineTAIL2//蛇尾
#defineBODY3//蛇身
#defineFOOD4//食品
#defineEMPTY0//空
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);//擦除蛇头
};
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])//吃到食品
againFood();
elseif(EMPTY==map[hearY+1][hearX])//什么都没遇到
erasingTheTail();//擦除尾巴
else{
gameOver=true;//没有遇到食品也许空,则表示游戏结束
break;
}
erasingTheHear(DOWN);
break;
caseLEFT:
if(FOOD==map[hearY][hearX-1])//吃到食品
againFood();
elseif(EMPTY==map[hearY][hearX-1])//什么都没遇到
erasingTheTail();//擦除尾巴
else{
gameOver=true;//没有遇到食品也许空,则表示游戏结束
break;
}
erasingTheHear(LEFT);
break;
caseRIGHT:
if(FOOD==map[hearY][hearX+1])//吃到食品
againFood();
elseif(EMPTY==map[hearY][hearX+1])//什么都没遇到
erasingTheTail();//擦除尾巴
else{
gameOver=true;//没有遇到食品也许空,则表示游戏结束
break;
}
erasingTheHear(RIGHT);
break;
break;
}
}
voidRetroSnaker:
:
move(charch)
{
directionMap[hearY][hearX]=ch;
move();
}
voidRetroSnaker:
:
Init()
{
inti=0,j=0;
gameOver=false;
eatFood=false;
for(i=0;i for(j=0;j map[i][j]=EMPTY;//清空二维数组 directionMap[i][j]=EMPTY;//清空方向图 } for(i=0;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; //首次显示游戏界面 for(i=0;i for(j=0;j switch(map[i][j]) { caseWALL: cout<<"■";break; caseHEAR: cout<<"○";break; caseBODY: caseTAIL: cout<<"●";break; caseFOOD: cout<<"★";break; default: cout<<""; break; } cout< } } voidRetroSnaker: : gotoXY(intx,inty) { COORDcoord; coord.X=2*x; coord.Y=y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); } voidRetroSnaker: : againFood() { 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; gotoXY(foodX,foodY); cout<<"★"; } voidRetroSnaker: : erasingTheTail() { gotoXY(tailX,tailY);//擦除尾巴 cout<<""; map[tailY][tailX]=EMPTY; if(UP==directionMap[tailY][tailX]){ directionMap[tailY][tailX]=EMPTY; tailY--; } elseif(DOWN==directionMap[tailY][tailX]){ directionMap[tailY][tailX]=EMPTY; tailY++; } elseif(LEFT==directionMap[tailY][tailX]){ directionMap[tailY][tailX]=EMPTY; tailX--; } else{ directionMap[tailY][tailX]=EMPTY; tailX++; } map[tailY][tailX]=TAIL; } voidRetroSnaker: : erasingTheHear(charch) { intx=h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 贪吃 小游戏 完整 源码 附件