贪吃蛇暑期实训总结报告.doc_第1页
贪吃蛇暑期实训总结报告.doc_第2页
贪吃蛇暑期实训总结报告.doc_第3页
贪吃蛇暑期实训总结报告.doc_第4页
贪吃蛇暑期实训总结报告.doc_第5页
免费预览已结束,剩余25页可下载查看

下载本文档

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

文档简介

暑期实训实训报告实训题目: 贪吃蛇游戏程序设计 院 系: 计算机科学与工程学院 专 业: 网络工程 班级: 网络工程131 学 号: 090213128 姓 名: 指导教师: 肖微 实训地点: 九章楼N6-101 开课时间: 2013 至 2014学年第 2 学期常熟理工学院计算机科学与工程学院制学生姓名 周豪 实训报告成绩 评语: 指导教师(签名) 年 月 日说明:指导教师评分后,实训报告交院办公室保存。目录1实训的目的和任务6实训的目的:6实训的任务:62.开发环境(软件开发环境和硬件开发环境)63.界面设计73.1设计思路73.2实现原理74.算法设计105.程序流程306.总结321实训的目的和任务实训的目的:1.巩固和加深对C语言课程基本知识的理解和掌握2.掌握C语言编程和程序调试的基本技能3.利用C语言进行基本的程序设计4.掌握书写程序设计说明文档的能力5.提高运用C语言解决实际问题的能力6. 进一步理解和运用结构化程设计的思想和方法7.独立完成一个游戏的设计应用 实训的任务:1.分析实训题目要求2.了解实训要求内容3.掌握实训要求代码4.编写程序代码,调试程序使其能正确运行5.设计完成的软件要便于操作和使用6.完成课程设计报告,并进行答辩2.开发环境(软件开发环境和硬件开发环境)1、一台能正常运行的计算机电脑2、Windows XP3、Microsoft Visual Studio20104、Microsoft Word20103.界面设计3.1设计思路:大家在运行这个游戏的时候,开始界面能够出现一只蛇,这样的图案比较符合游戏的内容。首先是蛇图形的绘画,我们可以运用搜狗输入法轻松的绘出蛇的大致图像,但是值得大家注意的是搜狗直接生成的图形,在里面出现了“”的符号,是Visual Studio不能识别的字符,应该改成“”,否则程序不能运行。除此之外,一个简单的游戏介绍也是必不可少的,使用QQ拼音输入法中的符号工具栏,再加上自己制定的游戏规则,可以生成各种我们需要的游戏简介画面。 3.2实现原理:printf(-欢迎进入贪吃蛇游戏-); std:cout / endl; std:cout _|0_| 0| endl; std:cout/ / _/ endl; std:cout_|_/ endl; std:cout _ endl; std:cout endl; std:cout | | endl; std:cout / / endl; std:cout / / endl; std:cout / / endl; std:cout / / endl;std:cout / / _-_ endl; std:cout / / _- -_ | |endl; std:cout ( ( _- _-_ -_ _/ |endl; std:cout -_- _- -_ -_- /endl; std:cout -_ _- -_ _-endl; std:cout -_- -_-endl;通过“std:cout”(向终端屏幕输出)可以将找到的蛇图形显示在屏幕上。显示结果printf( -游戏简介- n);printf( n);printf( 通过上下左右四个方向键可以控制贪吃蛇 n);printf( n);printf( 每吃掉一个虫子得分就会增加100分 n);printf( n);printf( 当吃的虫子多余5个时虫子的速度会增加哦 n);printf( n);printf( 游戏开始之前需要自己选择一下等级哦,还请量力而为 n);printf( n);printf( 请输入您要挑战的游戏等级,15级,速度逐渐减慢,切记!n);printf( 对了忘了说了,按回车键游戏才能开始 n);printf( 现在输入要选的等级吧 );显示结果先在Word中设计好需要显示的内容,然后利用printf()将其输出显示在屏幕上。不过在使用std:cout时一定要注意,std是标准库的命名空间名,cout,endl都在其中。头文件如果是#include下面就要这样写,或者加上 using namespace std;头文件如果是#include下面不用4.算法设计#include#include stdafx.h#include #include iostream#includeconio.h#include#include #define uint unsigned int上面的许多文件名都是第一次见到,但是在此编程中却是必不可少的,缺一个程序都没法顺利执行。enumARROW_UP=72,ARROW_DOWN=80,ARROW_LEFT=75,ARROW_RIGHT=77;枚举类型,分别标出上下左右四个方向键所对应的数值,这些数值都是固定的。typedef enumORIENTATION_UP,ORIENTATION_DOWN,ORIENTATION_LEFT,ORIENTATION_RIGHTOrientation;struct PTint x;/横坐标int y;/纵坐标;结构体定义一个坐标。struct BodyPT now;Body *last;Body *next;结构体定义蛇的一节身体,为创建链表做准备。struct SnakeOrientation dir;Body *head;Body *tail;uint bodylong;HANDLE hStdout=GetStdHandle(STD_OUTPUT_HANDLE);using namespace std;const int X=10;const int Y=5;/*pianyiliang*/const int WIDTH=60;const int HEIGHT=25;const char BRICK=H;const char snk=O;int cnt=0;int delaytime;int k;int score=0;PT foodpt;Snake snake;定义一些即将使用的全局变量,根据以前学到的知识,当全局变量在某一函数中被使用的时候,即使不返回函数值,全局变量也会改变。因为这部分定义的结构体比较多,所以特别容易弄混,在使用的时候,花费好长时间才熟练的掌握。void hidecursor() CONSOLE_CURSOR_INFO cursor_info; cursor_info.bVisible =false; cursor_info.dwSize =30; SetConsoleCursorInfo(hStdout,&cursor_info);以上代码的运行,可以隐藏运行结果界面的光标,这是我们学习c语言以来,第一次碰到类似的代码,有趣的是,其中的cursor_info.dwSize =30;改变数字不影响运行结果,起初我以为这行代码是多余的,但是将它删除之后,程序运行便出现了错误,后来我上网查了一下才知道,这行代码的作用是改变光标的大小,因为光标被隐藏,所以改变数字不会影响最终结果,然而值得注意的是,这行代码一定不能够省略。 void paintsnake() /贪吃蛇图形void prepare() /游戏简介void print_char(int x ,int y ,char ch) COORD c; c.X=x; c.Y=y; SetConsoleCursorPosition(hStdout,c); putchar(ch);上面代码中COORD表示的是坐标,“X”和“Y”分别表示的是横坐标和纵坐标,规定好这两个后就可以很好的确定所打印的代码的位置。通过改变x,y,以及ch就可以实现在任意位置打印任意字符的功能。void draw_wall()for(int i=0;iHEIGHT;i+)for(int j=0;jnow.x=pt.x&b-now.y=pt.y)return 1;b=b-next;return 0;因为生成的小虫子可能落到蛇的身上,所以要排除落到蛇身的随机点void creat_worm()PT pt;pt=randpt();while(judge()=1)randpt();/生成满足条件的随机点foodpt.x=pt.x;foodpt.y=pt.y;/将随机点的坐标赋给虫子print_char(foodpt.x,foodpt.y,1);确定随即点之后,通过print_char()函数可以画出我们需要的虫子。void init_snake()/*蛇的结构*/snake.dir=ORIENTATION_UP;/首先确定蛇的第一步移动方向Body* temp=new Body;/定义一个指针temp ,并进行初始化snake.head=temp;/从蛇头开始snake.head -now.x=WIDTH/2+X;snake.head-now.y=HEIGHT/2+Y;/使蛇头位置是在围墙的中间snake.head-last=NULL;temp=NULL;temp=new Body;/将指针temp指向蛇的第二节身体temp-now.x=snake.head-now.x-1;temp-now.y=snake.head-now.y;temp-last =snake.head ;/snake.head-next=temp;/*将temp中存的信息存到snake.head-next,第二节蛇身的坐标确定*/temp=NULL;/*初始化temp*/temp=new Body;temp-next=NULL;temp-now.x=snake.head-next-now.x-1;temp-now.y=snake.head-next-now.y;/*snake.head蛇头位置一直确定*/snake.head-next-next=temp;/新身体即第三节身体的信息确定temp-last=snake.head-next;snake.tail=temp;snake.bodylong=3;/蛇的身体长度creat_worm();/生成一个虫子void show_snake()/将蛇的身体画出Body *temp= snake.head;while(temp!=NULL)print_char(temp-now.x,temp-now.y,snk);temp=temp-next;画蛇部分是链表的一种应用,因为链表是比较难的一部分,所以在此之前,我就先将之前学的链表部分自己复习了一下,这样理解起老师所给的代码就简单多了。void flash_windows()/*抖动控制台窗口*/HWND hWnd=GetForegroundWindow();for (int i=0;inow.x=X|snake.head-now.y=Y|snake.head-now.x=(X+WIDTH-1)|snake.head-now.y=(Y+HEIGHT-1)/将蛇头的坐标和围墙的座标进行比较,如果重合的话蛇就判断为死亡return 0;elsereturn 1;判断蛇是否存活int can_eat_worm()if(snake.head-now.x=foodpt.x&snake.head-now.y=foodpt.y)return 1;elsereturn 0;如果蛇头坐标和虫子坐标重合,则判断蛇可以吃到虫子,随即返回1void eat_food()Body *newHead=new Body;newHead-last=NULL;switch(snake.dir)case ORIENTATION_UP:newHead-now.x=foodpt.x;newHead-now.y=foodpt.y-1;break;case ORIENTATION_DOWN:newHead-now.x=foodpt.x;newHead-now.y=foodpt.y+1;break;case ORIENTATION_LEFT:newHead-now.x=foodpt.x-1;newHead-now.y=foodpt.y;break;case ORIENTATION_RIGHT:newHead-now.x=foodpt.x+1;newHead-now.y=foodpt.y;break;/将食物的last作为新蛇头newHead-next=snake.head;snake.head-last=newHead;snake.head=newHead;snake.bodylong+;creat_worm();cnt+;/每吃一次虫子,计数变量cnt就会自身加一score+=100;/ 每吃一次虫子,分数加100if (cnt=5&cnt10)delaytime =100;/当吃的虫子达到一定数目的时候,速度就会改变将食物看作新头,从而将蛇的身体长度加1,但是在这个过程中当蛇吃到事物的时候,新头和旧头会重合,所以蛇的增长会有一定时间的延迟,但是如果将食物的last作为蛇头的话就不会出现这个问题。int judgebody()Body *pt=snake.head;Body *b=snake.head;b=b-next;while(b!=NULL)if(b-now.x=pt-now.x&b-now.y=pt-now.y)return 1;b=b-next;return 0;将蛇头看作随机生成的虫子,然后通过“生成虫子不再蛇身上”的思路,判断蛇受否撞到了自己。int move_snake()int flag=0;PT next;switch(snake.dir)case ORIENTATION_UP:next.x=snake.head-now.x;next.y=snake.head-now.y-1;break;case ORIENTATION_DOWN:next.x=snake.head-now.x;next.y=snake.head-now.y+1;break;case ORIENTATION_LEFT:next.x=snake.head-now.x-1;next.y=snake.head-now.y;break;case ORIENTATION_RIGHT:next.x=snake.head-now.x+1;next.y=snake.head-now.y;break;int last_x=snake.tail-now.x;int last_y=snake.tail-now.y;/先将蛇尾的坐标存到定义的常量中,为下面的去蛇尾做准备Body *temp=snake.tail;while(temp-last!=NULL)/不是蛇头temp-now.x=temp-last-now.x;temp-now.y=temp-last-now.y;temp=temp-last;temp-now=next;if(alive()=0|judgebody()=1)return 0;if(can_eat_worm()eat_food();print_char(last_x,last_y, );/去蛇尾show_snake();return 1;int get_arrow_key_code()int keycode=_getch();if(keycode=0|keycode=224)keycode=_getch();/此处的keycode=_getch()需要读取两次。return keycode;void delay(uint time)Sleep(time);/延迟执行int keycode;if(_kbhit()/检查当前是否有键盘输入,若有则返回一个非0值,否则返回0,如果把这个句子去掉,蛇就不会自己移动,你按一次它才动一下。keycode=get_arrow_key_code();switch(keycode)case ARROW_UP:if(snake.dir!=ORIENTATION_DOWN)snake.dir=ORIENTATION_UP;break;case ARROW_DOWN:if(snake.dir!=ORIENTATION_UP)snake.dir=ORIENTATION_DOWN;break;case ARROW_RIGHT:if(snake.dir!=ORIENTATION_LEFT)snake.dir=ORIENTATION_RIGHT;break;case ARROW_LEFT:if(snake.dir!=ORIENTATION_RIGHT)snake.dir=ORIENTATION_LEFT;break;首先是需要读入方向键,值得注意的是,keycode=_getch需要有两次,因为当你按下一个键的时候,按下、生起,读了两次。除此之外,if(_kbhit()是必不可少的,因为,这个语句的作用是检查当前是否有键盘输入,若有则返回一个非0值,否则返回0,如果把这个句子去掉,蛇就不会自己移动,你按一次它才动一下。void countscore()if(score500&score1000&score1500)printf( 呵呵,竟然得了%d分!你肯定是外星人派来的!(_)n);通过得分的不同,输出不同的成绩公布,极大程度的增加了游戏的趣味性。int _tmain(int argc, _TCHAR* argv)hidecursor();system(color 5b);/改变运行环境的颜色paintsnake();Sleep(2000);system(cls);prepare();scanf(%d,&k);delaytime=k*100+100;system(cls);/将显示屏幕清空 draw_wall();init_snake();while(1)if(!move_snake()break;delay(delaytime);flash_windows();Sleep(300);system(cls);countscore(); hidecursor();int a;std:cin a;return 0;5.程序流程游戏界面和简介 选择等级开始游戏 随机放置食物 方向键控制蛇的运动方向 Y 是否吃到食物 N N Y 蛇变长,并总分加100分 游戏结束,是否继续是否碰壁或结尾 Y 退出游戏 N 6.总结在这个星期里,我们专业的学生在实训老师肖微的带领下进行了C语

温馨提示

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

评论

0/150

提交评论