贪吃蛇实验报告论文
更新时间:2023-10-06 11:27:01 阅读量: 综合文库 文档下载
程序设计实践
题
目
贪吃蛇
学生姓名 教学院系 专业年级
学 号
计算机科学学院 软件工程2015级
完成日期
2016 年 6 月
摘 要
智能设备诞生以来,各种APP游戏层出不穷伴随着科学技术的发展,人们都渴望在不工作的时候有一些娱乐活动,而贪吃蛇这一款游戏正好符合大众的心理。所以,为了迎合许多用户的需求,才开发了这款叫做贪吃蛇的小游戏,并且这款小游戏适合各阶层人士,此外它还具有很强的娱乐性和交互性。
尽管现在市面上存在的游戏版本很多,可是贪吃蛇的市场还是很大的。原因就在与它能引人入深,爱不释手。随着游戏速度的逐渐加快,其刺激性也更强。可以说该游戏的优势不仅在于它的简单易行,而且在于它很快顺利的运行。对于那些在外忙忙碌碌的人们,想让他们花费大量的时间在大型游戏上显然是不可能的,但是小游戏却刚好能够迎合他们的需求。
关键词: C语言 Easy X photoshop 函数 游戏
目录
1绪论................................................................................................................................................ 5
1.1设计背景 ............................................................................................................................. 5 1.2设计的目的和意义 ............................................................................................................. 5 2游戏设计 ........................................................................................................................................ 6
2.1 游戏需求分析 ..................................................................................................................... 6 2.2系统总体流程 ..................................................................................................................... 6 2.3系统主要模块函数设计 ..................................................................................................... 7
2.3.1思路的分析 .............................................................................................................. 7 2.3.2地图绘制 .................................................................................................................. 9 2. 3.3加入背景音乐 ....................................................................................................... 11 2. 3.4绘制贪吃蛇本体 ................................................................................................... 12 2.3.5贪吃蛇的移动和控制 ............................................................................................ 13 2. 3.6绘制苹果 ............................................................................................................... 14 2. 3.7蛇吃苹果 ............................................................................................................... 15 2. 3.8判断贪吃蛇咬到自己 ........................................................................................... 15 2. 3.9判断撞到墙 ........................................................................................................... 16 2. 3.10结束游戏函数 ..................................................................................................... 16 2. 3.11更改UI界面和backmusic背景音乐 ................................................................ 16
3游戏测试 ...................................................................................................................................... 17 4结论.............................................................................................................................................. 19
4.1设计完成任务 ................................................................................................................... 19 4.2设计中遇到的困难 ........................................................................................................... 19 4.3展望................................................................................................................................... 20 5.源代码.......................................................................................................................................... 21
1绪论
1.1设计背景
信息化时代,智能设备已经做到人手一部,大家通过智能设备玩游戏已经成
为一个必不可少的手段打发时间和放松自己的手段。本游戏可以很方便的移植到IOS 安卓等便携设备和平台上。
1.2设计的目的和意义
本游戏利用VC++6.0,Easy X插件库,Visual Studio 2015,VA番茄助手,Photoshop cs6.0,格式工厂等技术软件设计的一款人尽皆知老少皆宜的益智类游戏,搞笑的风格和有节奏的背景音乐能让人在紧张工作学习之余得到放松。
2游戏设计
2.1 游戏需求分析
本游戏是基于C语言和Easy X环境库编译运行的小游戏,主要几个模块为地图搭建,贪吃蛇本体搭建,随机产生食物,蛇吃食物会变长,蛇咬到自己判定死亡,撞墙判定死亡,最后设计UI界面,加入背景音乐。
2.2系统总体流程
2.3系统主要模块函数设计
从上到下的函数: 地图函数 背景音乐函数 创建贪吃蛇函数 移动贪吃蛇函数 创建食物函数 吃食物变长的函数 吃到自己函数 碰到墙的函数 暂停函数 结束游戏函数 游戏控制函数 主函数
2.3.1思路的分析
首先我收到了一个很详细的PDF,里面有所有的搭建环境的教程还有大部分代码,首先搭建环境,要安装Easy X环境库,用VC++6.0作为编译器。测试是否安装成功。
然后看PDF文件的设计思路,发现蛇本体用一个数组表示更方便,绘制时使用遍历数组可以,但是数组是固定的长度,不能随吃苹果数量,蛇身体边长,怎么办?所以最后决定用链表表示。
每个蛇身体就是一个节点,每个节点有左右上下坐标。确定为20,每吃一个苹果,增加一个链表节点。这个表示方法可行。
场景分析:
分析一下游戏场景(地图),发现可以用0来表示地图可以移动的区域,用1来表示墙。二维数组即可表示整个平面地图。
场景建立结果见3-1。
2.3.2地图绘制
规定游戏地图的区域25X30()包括边界:
初始化数组的值,中间的23X28为0,边界为1:
这里直接加载图片,设置上下左右边界的草坪(墙),方便接下来绘制地图边界,注意一定要是20X20的分辨率的图片:
学生资源提供的草边界为jpg格式的图片:
绘制上下边界:
绘制左右边界:
:
:这段代码,规定背景色为绿色,在第一排中间位置显示“LHR超级贪吃蛇”。
现在地图搭建完毕,运行结果图见3-1。
2. 3.3加入背景音乐
接下来加入背景音乐: 需要引用这个声音库:
第一行代码是打开backmusic.wma文件 第二份代码设置音量大小为300 第三行代码设置重复播放 注意一下:为了防止编译时文件拷贝到其他文件盘的根目录下导致使用绝对位置而打不开文件,所以贴图和背景音乐都使用的是相对位置。
学生资源提供了一个 backmusic.wma的文件:
2. 3.4绘制贪吃蛇本体
将蛇身体转化为行列坐标,每个节点为20X20:
遍历输出蛇身体,默认为红色,蛇头居中加一个黄色的圆圈作为眼睛:
绘制效果如图3-2:。
2.3.5贪吃蛇的移动和控制
遍历输出蛇身体,蛇身体随着蛇头移动到后一个位置。 控制蛇身体的移动:
根据键盘映射,上下左右按键移动。
2. 3.6绘制苹果
创建一个随机苹果,判断蛇身体是否与苹果重合,重合则判断苹果存在,并贴入苹果的图片。
2. 3.7蛇吃苹果
判断蛇是否吃到苹果,如果被吃了,蛇头向前延伸一格,绘制新蛇头这里注意不能向后延伸,会出现断裂。效果见图3-3。
2. 3.8判断贪吃蛇咬到自己
只要头接触到自己的身体就判定return1,并返回endgamestatus=2。
IsExistFood=true; } }
void eatefood() {
snake*p; p=head;
bool IsEated=false; //右
if(head->left+20==food->left&&head->right+20==food->right&&head->top==food->top&&head->bottom==food->bottom) { food->next=head; head=food; IsEated=true; IsExistFood=false; } //左
if(head->left-20==food->left&&head->right-20==food->right&&head->top==food->top&&head->bottom==food->bottom) {
food->next=head; head=food; IsEated=true; IsExistFood=false; } //下
if(head->left==food->left&&head->right==food->right&&head->top+20==food->top&&head->bottom+20==food->bottom) { food->next=head; head=food; IsEated=true; IsExistFood=false; } //上
if(head->left==food->left&&head->right==food->right&&head->top-20==food->top&&head->bottom-20==food->bottom) { food->next=head; head=food; IsEated=true;
IsExistFood=false; }
if(IsEated) { score++; fillrectangle(p->left ,p->top,p->right,p->bottom);
fillrectangle(p->left ,p->top,p->right,p->bottom); int x=(head->left+head->right)/2; int y=(head->top+head->bottom)/2; setfillcolor(YELLOW); fillcircle(x,y,2); } }
int biteself() {
snake*p;
p=head->next; while(p!=NULL) {
if(p->left==head->left&&p->top==head->top&&p->right==head->right&&p->bottom==head->bottom) { endgamestatus=2; return 1; }
p=p->next; }
return 0; }
int cantcrosswall() {
if(head->left<20||head->right>580|head->top<100||head->bottom>560) { endgamestatus=1; return 1; }
return 0; }
void pause() {
while(1)
{ Sleep(300); if(GetAsyncKeyState(VK_SPACE) ) { break; } } }
void endgame() {
RECT r={0,100,600,200}; RECT r2={0,200,600,300}; if(endgamestatus==1) { drawtext(_T(\对不起,您撞到墙了。按空格游戏结束。\r,DT_CENTER | DT_VCENTER | DT_SINGLELINE); }
else if(endgamestatus==2) { drawtext(_T(\对不起,您咬到自己了。按空格游戏结束。\r,DT_CENTER | DT_VCENTER | DT_SINGLELINE); }
else if(endgamestatus==3) { drawtext(_T(\您已经结束了游戏。按空格游戏结束。\r,DT_CENTER | DT_VCENTER | DT_SINGLELINE); }
char s[]=\你的得分\char GetScore[10];
itoa(score,GetScore,10); outtextxy(10,20,s);
outtextxy(80,20,GetScore); pause(); exit(0); }
void GameControl() {
while(1) { if(GetAsyncKeyState(VK_UP) ) { direction=UP;
} else if(GetAsyncKeyState(VK_DOWN) ) { direction=DOWN; } else if(GetAsyncKeyState(VK_LEFT) ) { direction=LEFT; } else if(GetAsyncKeyState(VK_RIGHT) ) { direction=RIGHT; } else if(GetAsyncKeyState(VK_ESCAPE) ) { break; }
movesnake(); if(!IsExistFood) createfood(); eatefood();
if(biteself()==1||cantcrosswall()==1) {
endgame(); }
} }
void main(int argc,char * argv[]) {
initgraph(800,600); InitMap(); playmusic(); initsnake(); GameControl(); getch();
closegraph(); }
5.源代码
#include
#pragma comment( lib,\
#define ROWS 25 #define COLS 30
int map[ROWS][COLS];
#define X 0 #define Y 80
typedef struct SNAKE {
int left; int top; int right; int bottom;
struct SNAKE*next; }snake;
snake *head,*tail; #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 int direction =RIGHT; snake *food;
bool IsExistFood=false; int score=0;
int endgamestatus; void InitMap() {
setbkcolor(GREEN); cleardevice();
RECT r={0,0,600,100};
drawtext(_T(\超级贪食蛇\r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); int i,j;
for(i=0;i if(i==0||i==(ROWS-1)||j==0||j==(COLS-1)) map[i][j]=1; else map[i][j]=0; } IMAGE imgtop,imgleft,imgright,imgbottom; loadimage(&imgtop,\loadimage(&imgleft,\loadimage(&imgright,\loadimage(&imgbottom,\//绘制的图形 int left=X,top=Y,right=left=20,bottom=top+20; for(i=0;i left=X; right=left+20; for(j=0;j if(map[i][j]==1&&i==0) { putimage(left,top,&imgtop); } if(map[i][j]==1&&i==(ROWS-1)) { putimage(left,top,&imgbottom); } if(map[i][j]==1&&j==0) { putimage(left,top,&imgleft); } if(map[i][j]==1&&j==(COLS-1)) { putimage(left,top,&imgright); } if(map[i][j]==0) { setfillcolor(GREEN); fillrectangle(left,top,right,bottom); } left+=20; right+=20; } top+=20; bottom+=20; } } void playmusic() { mciSendString(\NULL,0,NULL); mciSendString(\NULL,0,NULL); mciSendString(\NULL,0,NULL); } void initsnake() { head=(snake*)malloc(sizeof(snake)); snake *p; int startRow=10,startCol=5; head->left=startCol*20; head->top=startRow*20; head->right=(startCol+1)*20; head->bottom=(startRow+1)*20; p=head; for(int i=0;i<3;i++){ tail=(snake*)malloc(sizeof(snake)); tail->left=startCol*20; tail->top=(startRow+i+1)*20; tail->right=(startCol+1)*20; tail->bottom=(startRow+i+2)*20; p->next=tail; tail->next=NULL; p=tail; } p=head; while(p!=NULL) { setfillcolor(RED); fillrectangle(p->left,p->top,p->right,p->bottom); if(p==head) { int x=(p->left+p->right)/2; int y=(p->top+p->bottom)/2; setfillcolor(YELLOW); fillcircle(x,y,2); } p=p->next; } } void movesnake() { int left,top,right,bottom; int newleft,newtop,newright,newbottom; snake*p; setcolor(WHITE); setfillcolor(GREEN); fillrectangle(tail->left,tail->top,tail->right,tail->bottom); p=head; while(p!=NULL) { Sleep(50); if(p==head) { newleft=p->left; newtop=p->top; newright=p->right; newbottom=p->bottom; if(direction==RIGHT){p->left+=20;p->right+=20;} if(direction==LEFT){p->left-=20;p->right-=20;} if(direction==UP){p->top-=20;p->bottom-=20;} if(direction==DOWN){p->top+=20;p->bottom+=20;} } else { left=p->left;top=p->top;right=p->right;bottom=p->bottom; p->left=newleft;p->right=newright;p->top=newtop;p->bottom=newbottom; newleft=left;newtop=top;newright=right;newbottom=bottom; } setcolor(WHITE); setfillcolor(RED); fillrectangle(p->left,p->top,p->right,p->bottom); if(p==head) { fillrectangle(newleft,newtop,newright,newbottom); int x=(p->left+p->right)/2; int y=(p->top+p->bottom)/2; setfillcolor(YELLOW); fillcircle(x,y,2); } p=p->next; } } void createfood() { snake *p; srand((unsigned)time(NULL)); food=(snake*)malloc(sizeof(snake)); int row =rand()%ROWS; int col=rand()%COLS; if(row==0) row=1; if(row==(ROWS-1)) row=ROWS-2; if(col==0) col=1; if(col==(COLS-1)) col=COLS-2; food->left=col*20; food->right=food->left+20; food->top=row*20+80; food->bottom=food->top+20; p=head; bool ISSame=false; while(p!=NULL) { if(p->left==food->left&&p->top==food->top&&p->right==food->right&&p->bottom==food->bottom) { ISSame=true; free(food); createfood(); } p=p->next; } if(!ISSame){ IMAGE imgfood; loadimage(&imgfood,\ putimage(food->left+1,food->top+1,&imgfood);
正在阅读:
贪吃蛇实验报告论文10-06
某某县龙山新区12号道路工程建设项目可行性研究报告 - 图文12-08
新北师大版五年级上册数学第四单元 多边形的面积教学设计教学反思作业题答案12-04
2022高考410分的公办二本大学有什么03-30
园林局党总支部党建工作述职报告09-27
交通事故其残疾赔偿金怎么计算05-19
机械制图及计算机绘图试题库04-08
大数据收集及分析整体解决方案03-21
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 贪吃
- 实验
- 报告
- 论文
- 学习跆拳道心得体会
- 竞争比合作更能使文明进步四辩稿
- 小学音乐湘文艺版一年级下册第五课《(听赏)公鸡、母鸡、大象》比赛获奖教案优质课公开课优秀教案
- 建筑初级职称评审材料
- 水利建设工程安全生产条件市场准入制度
- 基于FPGA的双口RAM在双CPU通信中的应用及设计终稿
- 计算机网络维护中常见问题以及解决方案
- 全国百强校北京师范大学附属实验中学2014-2015学年高二上学期期末考试物理(理)试题
- 中国稻草人产品行业市场前景分析预测年度报告(目录) - 图文
- Windows CA 证书服务器配置 - 图文
- 应用物理化学习题(附答案)分解
- 自主创新成果转化重大专项申报书
- 冲压工艺及基本原理
- 华大2018年网络教育-土木工程材料平时作业参考答案
- 部编小学二年级语文下册第22课《小毛虫》
- 中国未来十年机场建设与发展的新趋势
- 运筹学复习题及参考答案
- ZH1105W柴油机机体钻孔专机总体及夹具设计
- 第2章 飞行环境及飞行原理
- C语言习题集合(数组)