操作系统实验报告(贪吃蛇游戏)_第1页
操作系统实验报告(贪吃蛇游戏)_第2页
操作系统实验报告(贪吃蛇游戏)_第3页
操作系统实验报告(贪吃蛇游戏)_第4页
操作系统实验报告(贪吃蛇游戏)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

南通大学计算机科学与技术学院操作系统试验报告书试验题目贪吃蛇游戏专业班级XXXXXX学生姓名XXXXX指导教师XXXX日期2017年6月主要内容(一)设计内容:在Windows9x/2000/XP/ME操作系统下,使用VC、VB、Java或C等编程语言,采用多道程序设计技术编写一个游戏软件或解决一个简单的实际问题,要求设计一个两道以上的程序,可以是固定的2道程序、也可以是灵活的多道模式。设计的内容可以是下面任选其一:(1)用多道程序技术实现一个游戏程序。如大炮打飞机、赛车比赛等。用多道程序技术模拟客观世界中一个多任务实际问题的解决。(二)设计要求:本程序可运行在Windows9x/2000/XP/ME操作系统下,可安装到任意路径下。采用多进程或多线程方式运行,尽量体现进程间的同步和互斥关系。(3)经调试后程序能够正常运行,并体现多道程序的特点。(三)实验目的:掌握进程和线程的概念。掌握进程控制原语或进程控制系统调用的使用掌握多道程序设计的基本理论、方法和技术。掌握相关语言进程控制的API函数的使用。培养学生多道程序设计的能力。培养学生团队合作的能力。实验的选择:用多道程序技术实现一个游戏程序。游戏:《贪吃蛇》实验思想:1.首先制作游戏的窗体布局。其中包括窗体的大小,位置,添加按钮组件,在窗体上面划定游戏区域等。2.为按钮添加监听器,为开始按钮,结束按钮,键盘,还有游戏结束的时候的确定按钮.3.单击开始按钮,看到的效果是在游戏区域里面看到一个随机产生的食物,和蛇体。产生随见事物使用Random类,随机定位一个游戏区域里面的方块,然后使用Graphrics可以定位到这个方块的坐标图上颜色,这样就产生了肉眼可见的食物。关于蛇体,我们将蛇体的每个方块添加到集合里面,使用的是List,为什么不用数组,原因是数组的长度总是有限的,你不知道蛇体里面最终存放多少方格,而且数组比较繁琐。我们将蛇体的每个方块另外创建一个类(蛇体的每个方格)snakeAct,包含成员变量方格的坐标,每个snakeAct对象实例就是一个方块,将这个对象添加到列表List中就好了,然后再用Graphics,循环画出列表中的每个对象,就成功的画出了蛇体。设置蛇体的初始长度只有蛇头,并设置蛇头的初始位置为居中。4.通过方向键设置蛇头的移动,定义move()方法,蛇头每移动一次位置就会变化到另外一个方块,对应的坐标x,y都是有相应的变化,例如按下UP键,坐标的变化就是,x不变,y减1。5.蛇头可以运动只有面临的问题就是要吃食物,而吃食物的过程是在移动过程中,所以在move()方法中添加eat()方法,吃到食物的条件是蛇头的坐标和食物的坐标对应相等,蛇头吃到食物的过程就是将列表中没有吃到食物前的最后一个方格重新画一遍,这样列表的长度就加一,而列表中的对象就多了一个。6.将食物添加到列表中之后,仍然只是蛇头可以移动,让蛇体跟着蛇头移动定义othermove()方法,就是将蛇体的每个蛇块替换移动前的前一个蛇块的坐标,这样在移动只有,整个蛇体就可以移动了,othermove方法也写在move()方法里面,move()方法写在键盘的监听方法里面。7.撞墙的或者蛇头撞到自己的身体,可以再move()方法里面进行预判,如果蛇头移动满足判定条件,才可以移动,若蛇头碰到墙壁或者自己的身体,弹出对话框,点击确定按钮,恢复初始化,清空列表。开始游戏开始游戏蛇开始移动根据键盘控制蛇的移动方向暂停是否判断蛇头和食物的坐标是否重合是否继续 是否随机生成下一个食物 是否判断蛇头和自身及墙、炸弹是否重合是游戏结束详细设计:1.贪吃蛇的本体设计贪吃蛇的头部拥有一个坐标(x,y),蛇体有一个长度length,蛇有一个运动方向direct,故定义一个结构体如下:structSnake{intx,y;intlen;intdirect;}Snake[20];2.贪吃蛇食物设计贪吃蛇的食物有一个坐标(x,y),此食物有一个标志isfood,当isfood为0时,表示食物还没被吃,为1时,表示被吃。structFood{intx;inty;intisfood;}Food;(八)具体模块实现:#include<iostream>#include<cstdio>#include<cstdlib>#include<ctime>#include<conio.h>#include<cmath>#include<windows.h>usingnamespacestd;HANDLEhout=GetStdHandle(STD_OUTPUT_HANDLE);COORDcoord;voidlocate(intx,inty){coord.X=y;coord.Y=x;SetConsoleCursorPosition(hout,coord);};voidhide(){CONSOLE_CURSOR_INFOcursor_info={1,0};SetConsoleCursorInfo(hout,&cursor_info);}doublerandom(doublestart,doubleend){returnstart+(end-start)*rand()/(RAND_MAX+1.0);}intm,n;structnode{intx,y;}snake[1000];intsnake_length,dir;nodefood;intdirect[4][2]={{-1,0},{1,0},{0,-1},{0,1}};voidprint_wall(){cout<<"";for(inti=1;i<=n;i++)cout<<"-";cout<<endl;for(intj=0;j<=m-1;j++){cout<<"|";for(inti=1;i<=n;i++)cout<<"";cout<<"|"<<endl;}cout<<"";for(inti=1;i<=n;i++)cout<<"-";}voidprint_snake(){locate(snake[0].x,snake[0].y);cout<<"@";for(inti=1;i<=snake_length-1;i++){locate(snake[i].x,snake[i].y);cout<<"*";}}boolis_correct(){if(snake[0].x==0||snake[0].y==0||snake[0].x==m+1||snake[0].y==n+1)returnfalse;for(inti=1;i<=snake_length-1;i++){if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y)returnfalse;}returntrue;}boolprint_food(){srand((unsigned)time(0));boole;while(1){e=true;inti=(int)random(0,m)+1,j=(int)random(0,n)+1;food.x=i;food.y=j;for(intk=0;k<=snake_length-1;k++){if(snake[k].x==food.x&&snake[k].y==food.y){e=false;break;}}if(e)break;}locate(food.x,food.y);cout<<"$";returntrue;}boolgo_ahead(){nodetemp;boole=false;temp=snake[snake_length-1];for(inti=snake_length-1;i>=1;i--)snake[i]=snake[i-1];snake[0].x+=direct[dir][0];snake[0].y+=direct[dir][1];locate(snake[1].x,snake[1].y);cout<<"*";if(snake[0].x==food.x&&snake[0].y==food.y){snake_length++;e=true;snake[snake_length-1]=temp;}if(!e){locate(temp.x,temp.y);cout<<"";}elseprint_food();locate(snake[0].x,snake[0].y);cout<<"@";if(!is_correct()){system("cls");cout<<"Youlose!"<<endl<<"Length:"<<snake_length<<endl;returnfalse;}returntrue;}intmain(){cout<<"--------------------贪吃蛇---------------------"<<endl;cout<<"请先输入两个数,表示地图大小.要求长宽均不小于10."<<endl;cout<<"请注意窗口大小,以免发生错位.建议将窗口调为最大."<<endl;cout<<"再选择难度.请在1-10中输入1个数,1最简单,10则最难"<<endl;cout<<"然后进入游戏画面,以方向键控制方向.祝你游戏愉快!"<<endl;cout<<"-----------------------------------------------"<<endl;cin>>m>>n;if(m<10||n<10||m>25||n>40){cout<<"ERROR"<<endl;system("pause");return0;}inthard;cin>>hard;if(hard<=0||hard>100){cout<<"ERROR"<<endl;system("pause");return0;}snake_length=5;clock_ta,b;charch;doublehard_len;for(inti=0;i<=4;i++){snake[i].x=1;snake[i].y=5-i;}dir=3;system("cls");hide();print_wall();print_food();print_snake();locate(m+2,0);cout<<"Nowlength:";while(1){hard_len=(double)snake_length/(double)(m*n);a=clock();while(1){b=clock();if(b-a>=(int)(400-30*hard)*(1-sqrt(hard_len)))break;}if(kbhit()){ch=getch();if(ch==-32){ch=getch();switch(ch){case72:if(dir==2||dir==3)dir=0;break;case80:if(dir==2||dir==3)dir=1;break;case75:if(dir==0||dir==1)dir=2;break;case77:if(dir==0||dir==1)dir=3;break;}}}if(!go_ahead())break;locate(m+2,12);cout<<snake_length;}system("pause");return0;}上机调适及运行结果:参考文献:《C++程序设计教程》《操作系统》《数据结构》管致锦徐慧陈德裕清华大学出版社附分工总结1号:这次实验我负责做了游戏的全局框架,给组员分配了一些任务便于合作完成。我自己负责了食物的生成,一开始想的很简单,将游戏区域化成一个大的二维数组,另外写一个随即函数用于生成随机数,用随机数组成坐标作为生成食物的位置,初次编写很顺利,但是经过多次调试后发现漏洞很大,首先食物不能生成在蛇身的位置,需要再添加一条确认函数,然后食物与蛇头的碰撞事件函数花费了不少事件,由于多人合作的远古,还需要先弄清组原对于游戏的认知和编写思路、参数定义等,这些方面经过多次协调修改之后终于得到了解决。最后有一个问题难住了我们,就是关于食物实例经过碰撞事件后需要销毁,但是内存却一直占用得不到回收的问题,一直没有得到很好的解决,最后求助贴吧,使用解散和激活函数,终于成功解决,使得游戏的进行更加流畅了,并且长时间的游戏也不会导致游戏卡顿占用计算机过大的内存,这应该算是游戏的一个优化了。经过这次长达三个月的实验,我发现程序的编写不是想象的那么简单,每一步都需要多次演算一丝不苟精确无误,否则一步错步步错,不能及时发现的话最后需要花大量的时间也不一定能找出错误进行修正。另外,多人合作也使得编写加快了不少,只要能够沟通好,合作无间,解决问题会变容易很多。2号:贪吃蛇游戏程序设计关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头(绿色)用三节表示。移动时必须从蛇头开始,所以蛇不可以向相反的方向移动,如果不按任意键,蛇自行在当前方向右前移,但按下有效方向键后,蛇头朝该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇,同时还定义了一个随意的墙。然后利用图形驱动,,制作美观的游戏界面,通过随机函数产生随机的食物,控制游戏过程食物的出现。定义键盘操作控制游戏过程蛇的移动方向,画出边界,并判断游戏是否结束,统计游戏过程中蛇吃的食物数量,计

温馨提示

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

评论

0/150

提交评论