南通大学计算机科学与技术学院
操作系统试验
报 告 书
试验题目 贪吃蛇游戏
专业班级 XXXXXX 学生姓名XXXXX
指导教师XXXX 日期2017年6月
主要内容
(一)设计内容:在Windows 9x/2000/XP/ME操作系统下,使用VC、VB、Java或C等编程语言,采用多道程序设计技术编写一个游戏软件或解决一个简单的实际问题,要求设计一个两道以上的程序,可以是固定的2道程序、也可以是灵活的多道模式。设计的内容可以是下面任选其一:
(1)用多道程序技术实现一个游戏程序。如大炮打飞机、赛车比赛等。
(2)用多道程序技术模拟客观世界中一个多任务实际问题的解决。
(二)设计要求:
(1) 本程序可运行在Windows 9x/2000/XP/ME操作系统下,可安装到任意路径下。 (2) 采用多进程或多线程方式运行,尽量体现进程间的同步和互斥关系。 (3)经调试后程序能够正常运行,并体现多道程序的特点。
(三)实验目的:
1. 掌握进程和线程的概念。
2. 掌握进程控制原语或进程控制系统调用的使用 3. 掌握多道程序设计的基本理论、方法和技术。 4. 掌握相关语言进程控制的API函数的使用。 5. 培养学生多道程序设计的能力。 6. 培养学生团队合作的能力。
(四)实验的选择:用多道程序技术实现一个游戏程序。游戏:《贪吃蛇》
实验思想:
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,故定义一个结构体如下: struct Snake { intx,y; intlen; int direct; }Snake[20];
2.贪吃蛇食物设计 贪吃蛇的食物有一个坐标(x,y),此食物有一个标志isfood,当isfood为0时,表示食物还没被吃,为1时,表示被吃。 struct Food { int x;
int y;
intisfood; }Food;
(八)具体模块实现:
#include
#include
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE); COORD coord;
void locate(intx,int y) {
coord.X=y; coord.Y=x;
SetConsoleCursorPosition(hout,coord); };
void hide() {
CONSOLE_CURSOR_INFO cursor_info={1,0}; SetConsoleCursorInfo(hout, &cursor_info); }
double random(double start, double end) {
return start+(end-start)*rand()/(RAND_MAX + 1.0); }
intm,n;
struct node {
intx,y;
}snake[1000];
intsnake_length,dir; node food;
int direct[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
voidprint_wall() {
cout<< \
for (inti=1;i<=n;i++) cout<< \cout< for (int j=0;j<=m-1;j++) { cout<< \ for (inti=1;i<=n;i++) cout<< \cout<< \ } cout<< \ for (inti=1;i<=n;i++) cout<< \} voidprint_snake() {