贪吃蛇专业课程设计方案报告_第1页
贪吃蛇专业课程设计方案报告_第2页
贪吃蛇专业课程设计方案报告_第3页
贪吃蛇专业课程设计方案报告_第4页
贪吃蛇专业课程设计方案报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录课程设计目标……………3课程设计任务和要求…………………32.1课程设计内容…………32.2课程设计要求…………32.3课程设计环境…………3课程设计方案……………33.1方案论证………………33.2程序整体设计说明………33.3设计思绪………………43.4设计总体步骤图………43.5设计具体实现………5程序测试…………………84.1测试内容和结果………84.2程序运行效果图………9课程设计总结…………106.参考文件…………………11附录源程序…………………11课程设计目标:复习、巩固才C、C++基础知识,深入加深对VC技术了解和掌握;课程设计为学生提供了一个既动手又动脑,独立实践机会,将书本上理论知识和实际有机结合起来,锻炼学生分析处理实际问题能力。培养学生在项目开发中团体合作精神、创新意识及能力课程设计任务和要求2.1课程设计内容贪吃蛇游戏开发,首先它能够为大家提供一个目前比较流行休闲小游戏。贪吃蛇是家喻户晓益智类小游戏,选择这个题目一是为了将自己所学知识加以利用,二是一直以来贪吃蛇这个游戏就深深地吸引着大家,它制作方法对于很多同学而言全部是很神秘。所以我们期望经过这学期所学知识把它剖析开来,真真正正了解它本质和精髓。在这次学习中我们将从实践和实际项目中提升自己编程能力。所以决定选择这个题目作为VC课程设计。最终一部分就是游戏模块划分,依据分析,贪吃蛇这个程序一共要实现以下多个功效,包含游戏方面开始游戏、暂停游戏和停止游戏,游戏设置(蛇颜色、食物颜色操作说明等)和积分。2.2课程设计要求对系统进行功效模块分析、控制模块分析正确,符合课题要求,实现对应功效;能够加以其它功效或修饰,使程序愈加完善、合理;系统设计要实用,采取模块化程序设计方法,编程简练、可用,功效全方面;说明书、步骤图要清楚;统计设计情况(备查,也为编写设计说明书作好准备);2.3课程设计环境Windows7操作系统,VC6.0开发环境。课程设计方案3.1方案论证方案一:基于MFC设计该方案好处是系统自动生成软件框架,设计者只需填充编写代码即可,程序设计比较复杂,对于编程能力不强同学来说难度较大。方案二:基于easyX设计该方案好处是设计者只需编写程序文件,完成后编译即可生成可实施文件,编程前需要先安装easyX图形库。因为编程能力不强,方案二设计简单,易于调试,故选择方案二。3.2程序整体设计说明一个游戏要有开始部分,运行部分,结束部分(实际上开始部分和运行部分是一体)。游戏界面:1)开始游戏(加载并开始)2)暂停游戏(从目前进度结束)3)重新开始(在某一时刻暂停后能够继续接着玩)游戏设置:1) 蛇颜色(红色)2) 游戏帮助(游戏控制说明)3) 积分(每次吃掉一个食物增加10分,并显示出来)3.3设计思绪这个程序关键是表示蛇图形和蛇移动。用一个小矩形表示蛇一节身体,身体每长一节,增加一个矩形块。移动时必需从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。假如不按任何键,蛇自行在目前方向上前移,当游戏者按了有效方向键后,蛇头朝着指定方向移动,一步移动一节身体,所以当按了有效方向键后,先确定蛇头位置,然后蛇身体伴随蛇头移动,图形实现是从蛇头新位置开始画出蛇,这时原来蛇位置和新蛇位置差一个单位,所以看起来蛇会多一节身体,所以将蛇最终一节用背景色覆盖。食物出现和消失也是画矩形块和覆盖矩形块。3.4设计总体步骤图是是游戏结束否蛇头是否撞墙或本身否否随机生成下一个食物依据键盘控制蛇移动方向是蛇开始移动判定是否开始载入游戏并初始化是是游戏结束否蛇头是否撞墙或本身否否随机生成下一个食物依据键盘控制蛇移动方向是蛇开始移动判定是否开始载入游戏并初始化蛇头和食物坐标是否重合否是否蛇头和食物坐标是否重合否是否3.5设计具体实现食物类structFood /*食物结构体定义*/{ intx; /*食物横坐标*/ inty; /*食物纵坐标*/ intaddFood; /*判定是否要出现食物变量*/};2)蛇块类把蛇分成一块一块,一个蛇相当于有若干个块,蛇块类就是用来描述每块信息。structSnake /*蛇结构体定义*/{intx[MAX_JOINTS]; /*保留蛇身每一节在屏幕上列坐标*/ inty[MAX_JOINTS]; /*保留蛇身每一节在屏幕上行坐标*/ intjoint; /*蛇节数*/ intdirection; /*蛇移动方向*/ intlife; /*蛇生命,0活着,1死亡*/};初始化游戏游戏开始界面初始化:voidInitGraph(){ cleardevice(); setbkcolor(BLUE);/*设置背景颜色*/ setcolor(WHITE);/*设置前景颜色*/ cleardevice(); setfont(25,0,_T("微软雅黑")); outtextxy(170,150,"GreedySnake");/*在坐标(170,150)处输出字符串*/ outtextxy(219,254,"Ready?"); getch(); setbkcolor(0); cleardevice(); }绘制游戏场景setlinestyle(PS_SOLID,5)用于绘制实心宽度为5个像素线型,bar(i,40,i+7,47);为画一个左上角为(i,40),右下角为(i+7,47)矩形条,rectangle(i,40,i+10,49)也用于画矩形。voidDrawFence(){ inti; setbkcolor(LIGHTGREEN); setlinestyle(PS_SOLID,5); //画围墙 setfillstyle(LIGHTBLUE); for(i=50;i<=591;i+=10){ // rectangle(i,40,i+10,49); //上边 bar(i,40,i+7,47); bar(i,551,i+7,558); //下边 } for(i=40;i<=550;i+=10){ bar(50,i,57,i+7); //左边 bar(591,i,598,i+7); //右边 }}结束游戏PrScore(score)用于输出分数。voidGameOver(intscore){ cleardevice(); PrScore(score); setcolor(RED); setfont(80,0,_T("微软雅黑")); outtextxy(100,200,"GAMEOVER");mciSendString("closemo.mp3",NULL,0,NULL);//关闭音乐 getch(); exit(0);}判定是否需要出现食物if(food.addFood==1) //需要出现新食物{food.x=rand()%400+60; food.y=rand()%350+60; //食物出现后必需在整格内才能让蛇吃到 while(food.x%10!=0) {food.x++;} while(food.y%10!=0){food.y++;} food.addFood=0; //画面上有食物 } if(food.addFood==0) //画面上有食物,则显示 {setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); }7)在没有按键情况下,蛇自己移动身体for(i=snake.joint-1;i>0;i--) //蛇每个节往前移动 {snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } //1,2,3,4表示右,左,上,下四个方向,来决定蛇头移动 switch(snake.direction){caseMV_RIGHT:snake.x[0]+=10;break; caseMV_LEFT:snake.x[0]-=10;break; caseMV_UP:snake.y[0]-=10;break; caseMV_DOWN:snake.y[0]+=10;break; }8)a.从蛇第四节开始判定是否撞到自己,因为蛇头为两节,第三节不可能拐过来for(i=3;i<snake.joint;i++){ if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){ GameOver(score); //显示失败 snake.life=1; //蛇死*/ break; } }b.判定蛇是否撞到墙壁if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455){ GameOver(score); //此次游戏结束 snake.life=1; //蛇死 }c.判定是否撞到障碍物for(intobs_i=0;obs_i<vox.size();obs_i++){ if(vox[obs_i]==snake.x[0]&&voy[obs_i]==snake.y[0])GameOver(score); }以上三种判定以后,假如蛇死就跳出内循环,重新开始。吃到食物后画蛇if(snake.x[0]==food.x&&snake.y[0]==food.y)//吃到食物后 { //把画面上食物清除setcolor(0); rectangle(food.x,food.y,food.x+10,food.y-10); //新一节先放在看不见位置,下次循环就取前一节位置 snake.x[snake.joint]=-20;snake.y[snake.joint]=-20; snake.joint++; //蛇身体长一节 food.addFood=1; //画面上需要出现新食物 score+=10; //------------------------- PrScore(score); //输出新得分 } //画蛇 setcolor(RED); for(i=0;i<snake.joint;i++) { rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10); } Sleep(gamespeed); //延时控制蛇速度 //去除蛇最终一节 setcolor(0); rectangle(snake.x[snake.joint-1],snake.y[snake.joint-1], snake.x[snake.joint-1]+10,snake.y[snake.joint-1]-10); 10)按键操作key=getch();//接收按键 switch(key){//判定按键,是否往相反方向移动 case'w':case'W':{if(snake.direction!=MV_DOWN)snake.direction=MV_UP;}break; case'd':case'D':{if(snake.direction!=MV_LEFT)snake.direction=MV_RIGHT;}break; case'a':case'A':{if(snake.direction!=MV_RIGHT)snake.direction=MV_LEFT;}break; case's':case'S':{if(snake.direction!=MV_UP)snake.direction=MV_DOWN;}break; case'p':case'P':fun_pause();break; case'r':case'R':fun_reset();break; }编好程序后进行编译、运行,生成可实施文件,就能够玩贪吃蛇游戏了。4.程序测试4.1测试内容和结果1) 开始:程序运行后,会出来蓝色背景界面和提醒语Ready?,按任意键开始,注意不要在汉字输入法下玩。开始后只有两节红色蛇和一个绿色食物,而且蛇是运动。2) 方向键和WSAD键:蛇开始运行以后,当点击上下左右键(或WSAD)蛇就会按对应方向运动,蛇不能180度转弯,只能进行90度转弯。程序检测时蛇确实会按点击方向运动且不会向相反方向运动,全部方向键使用正确。3) 暂停/继续:当程序正在运行时,点击暂停/继续按钮“P”,蛇停在目前位置,再次点击“P”蛇又从目前位置继续运动。此按钮符合要求,所以暂停/继续按钮使用正确,功效能够实现。4) 重新开始:当游戏结束或想重新开始一局时,点击按钮“R”,游戏又回到最初状态,一个食物,一个运动着红色蛇块,且游戏积分清零。所以重新开始功效能够实现。5) 界面右侧能够出现按键提醒和分数显示等相关信息。4.2程序运行效果图5.课程设计总结在设计这个程序中我关键学会了怎样利用以下相关C语言和C++知识:1)函数定义是要做到顾名思义是很关键,它对读程序人正确定识程序十分关键,在修改这个程序过程中也能很快找到程序各模块作用,大大增加了程序可读性。2)分析函数先从main()函数入手。Main()函数是C++源程序编译时开始,从main()函数开始读函数可将其它函数功效了解得更透彻。3)在做程序时候先列框架,将这个程序所要达成目标(功效)分析出来,选择正确数据结构然后在将程序模块化,根据模块编写函数愈加简单合理。4)我还了解了很多库函数作用,如字符串函数中有很多对字符串进行处理函数,其功效我全部有所了解。5)学会了相关头文件使用方法,及系统调配问题处理方法等。6)了解到了注释关键性。经过这次试验,让我学到很多这个学期没有接触过很多知识,完成一个贪吃蛇项目;第一步就是先理清思绪,设计主界面,主界面是以一块封闭画布,并在画布内设计蛇体和食物。蛇头假如碰到墙或和蛇身某一部分碰到就会死亡;假如蛇头碰到食物,就会自动增加一节蛇身,并更改得分。想要写出好程序,还是要有扎实基础,这么碰到问题就不会一筹莫展来。在编程时我们要有想象力,不要拘泥于现有贪吃蛇游戏,而是要把自己想到再加上所学知识,碰到问题不能怕,而是要用心找出问题原因,再回来看看书本知识,不懂还能够问问老师。编程过程还要养成良好编程习惯,这么不仅自己能够很好看懂自己代码,也让人家轻易看懂自己代码,而不至于代码知识自己会看,出来问题只有自己会处理而其它人全部不会处理;碰到问题时要考虑最简单处理方案,只有简单方案不能满足要求时再考虑复杂方案。最关键编程还是要多和人沟通,不会不能立即问她人,不过一段时间后处理不了时还是应该向她人请教请教,“三人行必有我师”正是这个意思。经过这次试验,我深刻地体会到了面向对象和面向过程区分。程序在最初设计时因为面向对象思想不够成熟,造成在最终想要增加部分新功效时,出现了部分麻烦。总而言之,我们还需要深入提升自己能力。6.参考文件《C语言程序设计》武雅丽清华大学出版社《C++面向对象程序设计》谭浩强清华大学出版社《C语言课程设计案例精编》李丽娟中国水利水电出版社附录:源程序/////////////////////////////////////////////////程序名称:贪吃蛇//制作:莫新存//编译环境:VisualC++6.0,EasyX//////////////////////////////////////////////#include<iostream>#include<graphics.h>#include<stdlib.h>#include<conio.h>#include<dos.h>#include<time.h>#include<stdio.h>#include<vector>#definerandom(a,b)(rand()%((b)-(a)))+(a)#pragmacomment(lib,"Winmm.lib")//加入背景音乐时使用usingnamespacestd;#defineMAX_JOINTS 200#defineMV_RIGHT1#defineMV_LEFT2#defineMV_UP3#defineMV_DOWN4intrnd1,rnd2;vector<int>vox;vector<int>voy;voidInitGraph(void); /*图形界面初始化函数*/voidDrawFence(void); /*绘制游戏场景*/voidGameOver(intscore); /*结束游戏*/voidGamePlay(void); /*玩游戏具体过程*/voidPrScore(intscore);/*显示分数*/voidfun_pause();/*暂停游戏*/voidfun_reset();/*重置游戏*/voidfun_obstacle();/*设置障碍物*/structFood{ /*食物结构体定义*/ intx; /*食物横坐标*/ inty; /*食物纵坐标*/ intaddFood; /*判定是否要出现食物变量*/};structSnake{ /*蛇结构体定义*/ intx[MAX_JOINTS]; /*保留蛇身每一节在屏幕上列坐标*/ inty[MAX_JOINTS]; /*保留蛇身每一节在屏幕上行坐标*/ intjoint; /*蛇节数*/ intdirection; /*蛇移动方向*/ intlife; /*蛇生命,0活着,1死亡*/};voidplay(){ initgraph(800,600); InitGraph(); DrawFence(); GamePlay(); getch(); }intmain(){mciSendString("playmo.mp3",NULL,0,NULL);//播放音乐 play(); return0;}//初始化voidInitGraph(){ cleardevice(); setbkcolor(BLUE); setcolor(WHITE); cleardevice(); setfont(25,0,_T("微软雅黑")); outtextxy(170,150,"GreedySnake"); outtextxy(219,254,"Ready?"); getch(); setbkcolor(0); cleardevice(); }//绘制游戏场景voidDrawFence(){ inti; setbkcolor(LIGHTGREEN); setlinestyle(PS_SOLID,5); //画围墙 setfillstyle(LIGHTBLUE); for(i=50;i<=591;i+=10){ // rectangle(i,40,i+10,49); //上边 bar(i,40,i+7,47); bar(i,551,i+7,558); //下边 } for(i=40;i<=550;i+=10){ bar(50,i,57,i+7); //左边 bar(591,i,598,i+7); //右边 }}//结束游戏voidGameOver(intscore){ cleardevice(); PrScore(score); setcolor(RED); setfont(80,0,_T("微软雅黑")); outtextxy(100,200,"GAMEOVER");mciSendString("closemo.mp3",NULL,0,NULL);//关闭音乐 getch(); exit(0);}//输出成绩voidPrScore(intscore){ charstr_score[10]; //setfillstyle(YELLOW); //bar(50,15,220,35); //setcolor(6); //setfont(25,0,_T("微软雅黑")); //setfillstyle(BLACK); setbkmode(TRANSPARENT); //---new--- BeginBatchDraw(); setfillstyle(BLACK); bar(601,0,800,600); setfont(60,0,_T("微软雅黑")); setcolor(YELLOW); outtextxy(625,30,_T("贪吃蛇")); setfont(30,0,_T("微软雅黑")); setcolor(LIGHTGREEN); outtextxy(625,140,_T("制作:莫新存")); outtextxy(625,170,_T("班级:24041001")); outtextxy(625,200,_T("学号:19")); setfont(25,0,_T("微软雅黑")); setcolor(CYAN); outtextxy(625,380,_T("上:W")); outtextxy(625,400,_T("下:S")); outtextxy(625,420,_T("左:A")); outtextxy(625,440,_T("右:D")); outtextxy(625,460,_T("分数:")); outtextxy(625,490,_T("暂停(P键)")); outtextxy(625,520,_T("重新游戏(R键)")); setcolor(LIGHTBLUE); sprintf(str_score,"%i",score); outtextxy(680,460,str_score); EndBatchDraw(); if(score>0&&score%50==0)fun_obstacle();}voidGamePlay(){ int i,key; int gamespeed=200; //控制游戏速度* int score=0; //统计游戏得分 structFoodfood; //食物结构体变量 structSnakesnake; //蛇结构体变量 food.addFood=1; //1表示需要出现新食物,0表示已经存在食物 snake.life=0; //置蛇生命状态为活着 snake.direction=MV_RIGHT; //置蛇头方向往右 snake.x[0]=100;snake.y[0]=100; //置蛇头初始位置 snake.x[1]=110;snake.y[1]=100; snake.joint=2; //置蛇初始节数为2 PrScore(score); //显示游戏得分 //反复玩游戏,直到按Esc键结束 srand(time(NULL)); while(1) { while(!kbhit()) { mciSendString("playmo.mp3",NULL,0,NULL);//播放音乐 if(food.addFood==1){ //需要出现新食物 food.x=rand()%400+60; food.y=rand()%350+60; //食物出现后必需在整格内才能让蛇吃到 while(food.x%10!=0) { food.x++; } while(food.y%10!=0){ food.y++; } food.addFood=0; //画面上有食物 } if(food.addFood==0){ //画面上有食物,则显示 setcolor(GREEN); rectangle(food.x,food.y,food.x+10,food.y-10); }//在没有按键情况下,蛇自己移动身体 for(i=snake.joint-1;i>0;i--){ //蛇每个节往前移动 snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } //1,2,3,4表示右,左,上,下四个方向,来决定蛇头移动 switch(snake.direction){ caseMV_RIGHT:snake.x[0]+=10;break; caseMV_LEFT:snake.x[0]-=10;break; caseMV_UP:snake.y[0]-=10;break; caseMV_DOWN:snake.y[0]+=10;break; } //从蛇第四节开始判定是否撞到自己,因为蛇头为两节,第三节不可能拐过来 for(i=3;i<snake.joint;i++){ if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]){ GameOver(score); //显示失败 snake.life=1; //蛇死*/ break; } } //判定蛇是否撞到墙壁 if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455){ GameOver(score); //此次游戏结束 snake.life=1; //蛇死 } for(intobs_i=0;obs_i<vox.size();obs_i++){ //-----判定是否撞到障碍物---- if(vox[obs_i]==snake.x[0]&&voy[obs_i]==snake.y[0])GameOver(score); } //以上三种判定以后,假如蛇死就跳出内循环,重新开始 if(snake.life==1) break; if(snake.x[0]==food.x&&snake.y[0]==food.y){//吃到食物后 //把画面上食物清除 setcolor(0); rectangle(food.x,food.y,food.x+10,food.y-10); //新一节先放在看不见位置,下次循环就取前一节位置 snake.x[snake.joint]=-20;snake.y[snake.joint]=-20; snake.join

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论