20xx年计算机实习报告
计算机实习报告
姓名:
班级:
学号:
小班序号:
指导老师:
题目:贪吃蛇小游戏
邮箱:
20xx年9月 1
20xx年计算机实习报告
贪吃蛇小游戏实验报告
一.功能说明
1.1总体功能说明
该软件主要实现的是贪吃蛇的基本功能,达到简单的娱乐效果。首先,完成的是贪吃蛇的移动和转弯,通过上下左右四个按键来实现蛇的移动和转弯。其次还能实现蛇的吃食过程,游戏过程中会在游戏区域内随即产生一个食物,玩家通过控制蛇的移动使蛇的头部通过食物,则完成进食过程,食物消失,蛇的身体增长一截,并在此随机产生新的食物。最后还可以完成蛇的死亡过程,即游戏结束的控制过程,如果蛇的头部碰到了墙壁或是自己的身体就会死亡,游戏结束。此外还在游戏中加了音效,使得玩家玩游戏的过程中能够更加放松。
具有操作简单,易于控制,易学易玩的特点。
1.2用户界面
本图为游戏的主界面,其中外面的一圈紫色“■”为边界,边界内连成一串的“■”是蛇的身体,“●”形状的图标即为食物。该界面用于玩家与计算机的交流,使玩家能够通过图形界面来控制蛇的行为,进而实现游戏过程。
1.3使用方法
分别使用“↑↓←→”四个按键来实现对蛇的上下左右的控制,随着蛇的长度的增加,虽然蛇移动的速度没有变化,但是由于空间大小有限,而蛇的长度在逐渐增加,故使得游戏的难度组建增大。
20xx年9月 2
20xx年计算机实习报告
二.程序设计说明
2.1 总体设计框架
int main()
{ 播放声音
定义数组记录蛇的横纵坐标
定义变量记录蛇的长度
定义变量记录食物目标的位置
定义变量判定游戏是否结束
init(snakeLocation_x,snakeLocation_y,snakeLength);
createObject(object_x,object_y); //初始化
while(select为真)
{ switch(choice)
{
case KEY_UP:
do {将蛇的末尾擦除
后一节赋值给前一节
判断游戏是否结束
蛇头转向转弯后的位置}
case KEY_DOWN:
{将蛇的末尾擦除
后一节赋值给前一节
判断游戏是否结束
蛇头转向转弯后的位置}
case KEY_RIGHT:
{将蛇的末尾擦除
后一节赋值给前一节
判断游戏是否结束
蛇头转向转弯后的位置}
case KEY_LEFT:
{将蛇的末尾擦除
后一节赋值给前一节
判断游戏是否结束
蛇头转向转弯后的位置}
case KEY_ESC :
程序将会停止
}
}
}
2.2 关键算法描述
算法1:voidinit(int* snakeLocation_x,int* snakeLocation_y,int&snakeLength)
该算法的功能是用来进行初始化实现,实现游戏边界的设计、贪吃蛇身体的初始化、贪吃蛇身体20xx年9月 3
20xx年计算机实习报告
长度的初始化、在无输入的情况下蛇的移动。边界的设计主要是通过textout函数在指定位置输出“■”形状的边界。贪吃蛇身体的初始化是先定义在连续的三个点上分别输出一个“■”作为初始化的蛇。由于初始化的蛇是由三个“■”组成,故蛇的初始长度是三。在无输入的情况下,只要蛇不撞到自己的身体或是墙壁就不会死亡,一直沿着原来的方向前进,通过把后一节赋值给前一节来实现的。 算法2:voidcreateObject(int&object_x,int&object_y)
用于生成食物目标的一个函数。通过把产生的随机数的值分别对40和20区余,得到介于0到39之间的和0到19区间的一个随机数作为食物的横纵坐标,当满足以上条件并且食物点的横坐标为偶数时就会产生一个食物点。
算法3:inteatting(intx,inty,int&object_x,int&object_y,int&snakeLength)
用于判定贪吃蛇吃食物,并判定新产生的食物是否在蛇的身上或是边界上的函数。通过判断贪吃蛇的头部是否与目标食物的坐标相同来判定是否进食成功,当判定进食成功后蛇的长度会加一。通过判断食物所在位置的screen值是否为一,进而判定食物是否在合理的位置,不合理的话将重新运行creatobject函数,产生新的食物。
算法4:intgameOver(intx,int y)
用于判断程序是否结束。是这个程序中最简单的一个环节,但是却是最重要的一个环节。它是通过判断某一点的screen值是否为1来判断程序是否将程序结束。
2.3 程序设计的难点和关键点
本程序设计的难点和关键点是对蛇的控制、游戏结束的判断、吃食及身体长长的控制。 在对蛇的控制上,采用switch语句进行判断,判断后通过擦除蛇的头部,并将头部以外的其他部分通过循环的赋值使得上一节的坐标赋值给下一节,第一节的坐标根据转向的不同重新生成,进而实现蛇的移动的控制。
在对游戏是否结束的判断上是采用判断蛇的头部的坐标对应的screen值是否为一的判断来进行的。因为游戏的边框和蛇的身体所在的位置坐标对应的screen值为1,而其他地方的screen值为0,故舌头所在位置的screen值为1 的时候一定是蛇撞到了墙壁或者是撞到了自己的身体,故游戏结束。
在对蛇吃食及身体长长的控制上,先采用生成随机数再用这个随机数去对想要的范围取余的方式得到的数字即为范围内的数字,这样两个范围内的数字对应的坐标就是边框内的坐标,在这样的位置上产生的食物就不会再边框外。再通过判断产生食物的位置的screen值是否为一来判断产生的食物是否在蛇的身上或者在边框上,如果为一,那么将重新运行
createObject(object_x,object_y)来重新生成食物目标。蛇的吃食是通过判断蛇的头部坐标是否与食物的坐标相同来判断的,当蛇的头部坐标与食物坐标相同时,食物消失,蛇的身体长度加一,同时再产生新的食物。
2.4 调试的方法
在编程的过程中出现过蛇的纵向移动速度比横向的移动速度快一倍的现象,而且边框上每个栅栏装点的纵向宽度是横向宽度的二倍。经过查询得知,这两个问题均出自同一个原因,即横向的每个单位是一个字节,而纵向的是每个单位两个字节。通过调整横向上每个单位所占字节,以及蛇在横向移动速度变为每次两个字节,进而解决问题。
2.5 程序性能评价
程序运行过程中操作比较流畅,但是界面过于简单,音乐效果一般。
程序设计上在许多关键部位加了注释,但是由于经验不足,能力有限,设计上还存在许多不合理的地方。比如没有充分考虑程序的可读性,程序代码不是很整洁。
20xx年9月 4
20xx年计算机实习报告
三.心得体会
编程是一件需要经验,需要动脑,需要练习的一项技能。它在学习生活和未来的工作中都占据着很关键的地位。因此我感觉这次计算机实习很有必要,他让我了解到了自己编程能力的弱小以及编写程序的能力的重要性。
在本次编程过程中因为之前编程经验太少,对编程的思想的理解不深刻,很多问题都很困惑。这次变编程中解决了很多以前不懂的问题,但是同时又发现了很多的新问题。这次一定程度上锻炼了自己的编程能力,也让我了解到自己能力的不足。
这次实习我最大的心得和体会就是编程能力一定要培养,培养编程能力就必须要进行实践。因此今后我应当多用实践来锻炼自己的编程能力。
20xx年9月 5
第二篇:贪吃蛇游戏 实习报告
课程设计报告
贪吃蛇游戏设计
专业 电子信息工程
杜 运 福
B电子062
0610620224
曹 妍
20xx年8月30日 学生姓名 班学级 号 指导教师 完成日期
盐城工学院本科生课程设计报告(2008)
贪吃蛇游戏设计
摘要:本设计主要围绕贪吃蛇游戏展开。众所周知,贪吃蛇游戏一直以来是比较流行的。传统的贪吃蛇游戏功能比较少,对蛇的控制仅限于向左转和向右转,而现在的贪吃蛇游戏已经发展的相当好;具有更多的功能和友好的界面。例如,最近流行的免费的3D版的贪吃蛇游戏,界面相当的美观,有很强的立体效果,真实感更强,食物也为立体的且颜色绚丽。在3D版贪吃蛇游戏里面,墙壁是真实的墙壁,障碍物比较多,如树、土丘等。此外,其功能更多更强,可以选择难度。不过,总而言之,3D版与传统的贪吃蛇游戏有共性,即娱乐性与益智性。这些也是贪吃蛇游戏的优点。
本人因水平有限,只能设计简单的贪吃蛇游戏。不过,在功能上,比传统贪吃蛇游戏更丰富。蛇可以反向运动,操作起来,显得更为灵活。界面的颜色选用绿色,不易使眼睛疲劳。
关键词:3D版;传统;灵活;
2
贪吃蛇游戏设计
目 录
1、 概述
1.1、用TC设计程序的方法
1.2、简要说明
2、设计要求
3、系统分析与模块设计
3.1、算法设计
3.2、数据结构
3.3、模块设计
3.4、模块枝干图
4、程序流程图
4.1、图形驱动
4.2、开始画面
4.3、显示食物
4.4、蛇向前移动
4.5、判蛇死
4.6、吃到食物后处理
4.7、判蛇反向移动
4.8、游戏结束
4.9、图形结束
5、程序设计及关键源代码
6、运行结果分析
7、实习心得
盐城工学院本科生课程设计报告(2008)
贪吃蛇游戏的设计
1 .概 述
1.1、用TC设计程序的方法
首先应了解设计要求,然后按照功能设计模块,每个模块完成特定的功能,要使模块间的耦合性小,内聚性高;设计模块是相当重要的一个环节。模块的数量不宜太多,也不宜太少,要使每个模块都能比较简单的转换成流程图。模块设计完成后,就该给每个模块绘制流程图了。流程图要简单,容易理解,多用中文。不宜写过长的代码,增加理解难度。流程图与模块枝干图均可用绘图软件绘制,可适当加些背景色,用以区分。此外,流程图应容易转换成代码。绘制好了流程图,就要编写代码了。直接在TC环境里输入代码,然后运行测试,检查错误,最终,将设计出可行的程序。
1.2、简要说明
我设计的贪吃蛇游戏具有很多独特性。例如,墙壁不用实体,而用中空的
墙,颜色为绿色,显得更美观,且不易使眼疲劳。操作上,做了些简化,游戏开始时便可以自动运行,且速度较快,属中等难度。玩游戏的过程相当简单,只需按键盘上的上下左右方向键,便可改变蛇的行进方向。食物随机产生。贪吃蛇吃到一个食物后便得到10分。得分显示在左上角。当蛇撞到墙壁或自己时,蛇死,游戏结束,输出得分。
2.设计要求
外观为矩形,食物随机产生,添加注释,统计得分、每吃到一个食物获得
10分。蛇碰到自己或墙壁,游戏均结束。游戏结束时输出得分。画出模块枝干图与每个模块的程序流程图。修改某些代码,改变其外观及功能。
游戏操作应尽量简单。
界面美观,让人看了觉得舒服。
3、系统分析与模块设计
3.1、算法设计
玩游戏过程采用递归算法,由WHILE(1)控制循环过程,可使游戏重复玩,
在蛇死之前不停的玩。判断蛇死的算法是通过判断蛇有没有碰到自己及墙壁。使蛇向前移动采用递归算法,通过递归将蛇的每一节依次向前移动,横坐标与纵坐标依次向前赋值,从而达到使蛇前移的目的。蛇的前进方向通过IF结构判断。
1
贪吃蛇游戏设计
3.2、数据结构
蛇与食物信息分别用两个结构体存储与表示。将食物的横坐标X、纵坐标Y和判断是否要出现食物的变量YES分别作为食物的结构体的成员。蛇的横坐标数组X[N],纵坐标数组Y[N],蛇的节数NODE,蛇的移动方向DIRECTION、蛇的生命LIFE分别作为蛇的结构体的成员。结构体内每个成员的存储类型均为整型。
3.3、模块设计
模块应具有高内聚性,低耦合性。这样,程序运行才更稳定,效率更高。 据功能将贪吃蛇游戏划分成四个大模块,九个小模块。每个模块均具有自己的功能,而且,比较容易画出各个模块的流程图。
3.4、模块枝干图
简要说明:图形驱动即完成初始化图形系统功能;开始画面模块的主要作用是根据设置绘制出玩游戏区域四周的墙壁;玩游戏的过程是游戏此游戏程序的核心,又可细分为好多小的功能模块;其中,显示食物模块仅完成显示食物功能;蛇前移模块即通过递归算法实现蛇的向某方向移动;判蛇死模块的功能是通过判断蛇是否碰到自己或墙壁来判断蛇有没有死亡。吃到食物后小模块只有蛇吃到食物后才起作用。即当蛇吃到食物后,蛇自身延长一节并绘出蛇,同时加10分。通过键盘操控来玩游戏主要由判反向移动模块完成,即当蛇不是反向移动时,按照键盘上方向键指示移动。游戏结束模块功能简单,仅完成输出得分与提示语功能。最后图形结束模块完成关闭图形功能。
4、程序流程图
4.1、图形驱动
2
盐城工学院本科生课程设计报告(2008)
4.2、开始画面
3
贪吃蛇游戏设计
4.3、 显示食物
4
盐城工学院本科生课程设计报告(2008)
4.4 、 蛇向前移动
5
贪吃蛇游戏设计
4.5、 判蛇死
6
盐城工学院本科生课程设计报告(2008)
4.6 、 吃到食物后处理
7
贪吃蛇游戏设计
4.7、 判蛇反向移动
8
盐城工学院本科生课程设计报告(2008)
4.8、 游戏结束
9
贪吃蛇游戏设计
4.9、 图形结束
5、程序设计及关键源代码
定义上下左右控制方向:
#define LEFT 0x4b00 #define RIGHT 0x4d00
10
盐城工学院本科生课程设计报告(2008)
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
设定游戏速度:
int gamespeed=60000;
用结构体定义食物与蛇:
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/ }food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/ }snake;
主函数:
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/ Close();/*图形结束*/
}
图形驱动:
11
贪吃蛇游戏设计
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
开始画面,左上角坐标为(50,40),右下角坐标为(620,460)的围墙:
void DrawK(void)
{
setcolor(10);/*绿色*/
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i<=610;i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49); /*上边*/
rectangle(i,451,i+10,460);/*下边*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左边*/
rectangle(611,i,620,i+10);/*右边*/
}
}
玩游戏具体过程:
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
12
盐城工学院本科生课程设计报告(2008)
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==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.yes=0;/*画面上有食物了*/
}
if(food.yes==0)/*画面上有食物了就要显示*/
{
setcolor(BROWN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
for(i=snake.node-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)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++)
13
贪吃蛇游戏设计
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)
{
GameOver();
snake.life=1; /*蛇死*/
}
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.node]=-20;snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
14
盐城工学院本科生课程设计报告(2008)
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else if(key==UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else if(key==RIGHT&&snake.direction!=2) snake.direction=1;
else if(key==LEFT&&snake.direction!=1) snake.direction=2;
else if(key==DOWN&&snake.direction!=3) snake.direction=4;
}/*endwhile(1)*/
}
游戏结束:
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(GREEN);
settextstyle(0,0,3);
outtextxy(200,200," Game over!Try!");
getch();
}
输出成绩:
void PrScore(void)
{
char str[10];
15
贪吃蛇游戏设计
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(5);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
6、运行结果分析
通过运行,我对自己的设计比较满意。运行结果正如我所料,此贪吃蛇游戏具有易操作性及充满活力的外观。
截图及描述:
图6-1 开始画面
此图为开始画面图,蛇有三节,墙壁颜色为绿色,显得较有活力。
16
盐城工学院本科生课程设计报告(2008)
图6-2 蛇吃到两个食物后
蛇吃到食物后,得分为20分,蛇延长两节。
图6-3 游戏结束画面
17
贪吃蛇游戏设计
7、实习心得
在大一学习期间,我就知道在大二暑假期间,有程序设计实习。从那时起,我就期盼着这一天早点到来。只因我对编程有浓厚的兴趣。我是我们班第一个通过江苏省计算机VB二级考试的。我的VC++成绩也还可以。
转眼间,程序设计实习就如期而至了。实习的第一天是充满好奇与兴趣,当实习回来时,就感觉得这次实习并非想象中的那样。我本以为,程序设计实习应该是开放性的,让我们参照某些课题,自主、自由地设计程序。我想,那样更能促进我们学习和提高我们的动手能力。
这次实习中,我们都被给了程序的源码,而且有详细的功能说明。表面上看,我们几乎不需什么努力就能完成,而实际上,并非如此。因为那些程序大多是基于16位DOS执行的,并且,里面包含许多DOS下图形处理的函数,我从未涉及过,所以,很难看懂代码,即使有那样详细的注释。
通过坚持上机实习,我对代码的认识越来越多。我还上网找了些资料,如TC函数详解等等。我更多的了解了各种TC函数的功能。我通过一步步的学习,终于弄懂了整个程序,并且对程序做了些修改。如外观、大小、输出成绩等。通过修改程序代码增加游戏的功能,我也从中获得了自信。
通过使用Win-TC1.9设计程序,我更多的了解了TC函数的功能与用法,也了解了在TC环境下调用DOS绘图及处理的常用方法。
在上机实习的过程中,还绘制了模块枝干图与程序流程图,我感觉到,画模块枝干图并不是件容易的事。只有在弄懂程序后才能将整个程序划分成数量适宜的模块。划分模块确实挺重要的,原来我将玩游戏过程划为一个模块,后来发现太复杂,很难画出流程图。模块的数量直接关系到绘制程序流程图的难度。从中,我更深入了解了程序设计的整个过程,这也是我最受益的地方。
在实习过程中,遇到不懂的问题,时而查阅以前学过的书籍,也等于我做了复习。这也能提高我将理论付诸实践的能力。
此外,实习期间,你将我们划分成小组;这促进了我们的相互合作与相互学习。 总之,通过这次实习,我学到了好多书本以外的知识!
我同样很感谢老师,您!
参考文献
[1] 张岳新《Visual C++程序设计》。
[2] 张岳新《Visual C++程序设计基础实验指导书》。
[3]沈被娜 刘祖照 《计算机软件技术基础》
18