贪吃蛇课程设计报告文档格式.docx
《贪吃蛇课程设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《贪吃蛇课程设计报告文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
9
5.界面的设计:
10
5.1进入程序界面设计10
5.2第2个界面的设计:
5.3第3个界面设计:
11
6.把程序植入手机中12
二.字符设备驱动程序实现12
三.总结:
13
四.参考文献:
五.致谢14
摘要
程序核心思想:
运行程序首界面(进入游戏,退出游戏)进入游戏后选择难度(简单,普通,高难)根据不同的难度设置相应的属性。
进入游戏界面。
首先初始化蛇的坐标,食物的坐标,和障碍物的坐标。
然后获取当前屏幕的大小为将来的边界判断做准备。
然后创建并执行线程。
线程基本流程:
判断是否是暂停阶段,如果没有暂停就执行:
eatFood();
move(direction);
repaint();
如果游戏结束了就重新游戏或者退出。
Abstract
Coreoftheprocess:
firstrunningtheprograminterface(intothegame,withdrawfromthegame)intothegameafterthedifficultchoiceof(simple,ordinary,highlydifficult)dependingonthedifficultyofsettingthecorrespondingattribute.Intothegameinterface.Firstinitializethecoordinatesofthesnake,coordinatesfood,andthecoordinatesofobstructions.Andaccesstothesizeofthecurrentscreenforthefutureofthebordertoprepareforjudgement.Andthencreateandexecutionthreads.Threadthebasicprocess:
determinewhetherthestageissuspended,ifnotthemoratoriumontheimplementationof:
eatFood();
move(direction);
repaint();
gametoanendifthegameoroutonthere.
一.详细设计
1.属性解释
用1个2维数组snake[200][2]存放蛇身坐标,第2维是0的时候代表横坐标,为1的时候为纵坐标。
第1维数字代表蛇身方块的数字,例如snake[0][0]就代表蛇头的横坐标snake[1][1]就代表第2个方块的总坐标。
snakeNum为蛇的长度(以方格为单位)。
SNAKEWIDTH为方格大小。
direction;
为移动方向,zhangai0x,zhangai1x,zhangai2x,zhangai3x,zhangai0y,zhangai1y,
zhangai2y,zhangai3y,为障碍物的坐标。
foodx,foody为食物的坐标。
isPaused为判定是否是暂停状态,true为暂停false为非暂停。
A为难度系数,a可以为1,2,3。
1的时候最难,3的时候最简单。
SLEEP_TIME为系统沉睡时间,其值越小速度越快。
isPaused=true;
//设置游戏开始为暂停状态
snakeNum=7;
//设置蛇身长度7个方格
//循环依次初始化蛇身没个方格的坐标,蛇头的坐标为(100,40)
for(inti=0;
i<
snakeNum;
i++)
{
snake[i][0]=100-SNAKEWIDTH*i;
snake[i][1]=40;
}
//初始化移动方向为向右
direction=DIRECTION_RIGHT;
//初始化食物坐标
foodX=100;
foodY=100;
//初始化障碍物的坐标,其位置环绕挡住食物,
zhangai0x=foodX+4*a;
zhangai0y=foodY+4*a;
zhangai1x=foodX+4*a;
zhangai1y=foodY-4*a;
zhangai2x=foodX-4*a;
zhangai2y=foodY+4*a;
zhangai3x=foodX-4*a;
zhangai3y=foodY-4*a;
3.调用线程
thread=newThread(this);
thread.start();
while(isRun)//开始时间
if(!
isPaused)
eatFood();
//吃食物
move(direction);
//移动
if(gameover)//如果游戏结束
isRun=false;
restart();
break;
}
b=!
b;
//闪烁控制
repaint();
//重新画图
Thread.sleep(SLEEP_TIME);
开始创建并执行线程,如果没有暂停就执行eatFood();
然后判断游戏是否结束,然后重新画图repaint();
然后等待SLEEP_TIME时间继续循环。
privatevoidmove(intdirection)
//除蛇头外的蛇身坐标移动
for(inti=snakeNum-1;
i>
0;
i--)
{
snake[i][0]=snake[i-1][0];
snake[i][1]=snake[i-1][1];
//蛇头坐标的移动
switch(direction)
caseDIRECTION_UP:
snake[0][1]=snake[0][1]-SNAKEWIDTH;
caseDIRECTION_DOWN:
snake[0][1]=snake[0][1]+SNAKEWIDTH;
caseDIRECTION_LEFT:
snake[0][0]=snake[0][0]-SNAKEWIDTH;
caseDIRECTION_RIGHT:
snake[0][0]=snake[0][0]+SNAKEWIDTH;
坐标移动的总体思想:
1.蛇身的移动:
移动的时候,后面的方格要到前面方格的位置,也就是要让后面的方格的坐标变成前面方格的坐标。
即把前面方格的坐标赋值给后面的方格坐标。
就是让最后方格的坐标变成倒数第2个方格的坐标,倒数第2个方格坐标变成倒数第3个方格坐标,依次类推直到第2个方格变成第1个方格的坐标。
这样我们循环都最后还没有第1个方格的坐标,所以我们另将蛇头的坐标赋值。
2.蛇头的移动:
这和蛇当前移动的方向有关,以向上移动为例,那蛇头的坐标应该横坐标不变,纵坐标减去方格的长度,因为在屏幕上左上点为(0,0)越往左横坐标越大,越往下纵坐标越大。
所以向上移动纵坐标要减小。
其他方向的坐标运算如上述代码,也不难解释。
注意:
关于蛇身移动的循环for(inti=snakeNum-1;
i--)他是先给后面的值赋值最后循环到正数第2个方格。
开始我想反过来,从第2个开始赋值再循环都最后,实验的时候却和以前的方式运行结果不一样。
移动的时候蛇不管有多长就只能看到2个方格在移动。
后来发现,我这样改是不对的,按照我的思路a[1][0]=a[0][0];
a[2][0]=a[1][0];
…….仔细看后就发现我把a[0][0]的值赋给a[1][0]又把a[1][0]的值赋给a[2][0],我样有值的覆盖,也就是我让蛇身的所有方格的值全是a[0][0]的,再家上蛇头移动后蛇头的新坐标,屏幕上就只有2个方格了。
privatevoideatFood(){
//判别蛇头是否和食物重叠
if(snake[0][0]==foodX&
&
snake[0][1]==foodY){
snakeNum++;
generateFood();
/**
*产生食物
*说明:
食物的坐标必须位于屏幕内,且不能和蛇身重合
*/
privatevoidgenerateFood()
while(true)
foodX=Math.abs(random.nextInt()%(width-SNAKEWIDTH+1))
/SNAKEWIDTH*SNAKEWIDTH;
foodY=Math.abs(random.nextInt()%(height-SNAKEWIDTH+1))
booleanb=true;
i++)
if(foodX==snake[i][0]&
snake[i][1]==foodY)
b=false;
if(b)
}
该功能的总体思路:
如果蛇头的坐标和食物的坐标一样,也就是吃到了食物,蛇的长度+1并且产生新的食物。
生成食物的方法:
随机生成新的坐标赋值给食物坐标。
并要保证随机生成的坐标在屏幕内而且随机生成的食物坐标不能和蛇身重合。
生成新的食物后,在食物周围生成新的障碍物坐标。
随机产生食物坐标的方法:
foodX=Math.abs(random.nextInt()%(width-SNAKEWIDTH+1))
说来惭愧直到现在我还是不明白为什么经过这样的运算后得到的坐标就一定在屏幕内。
但我至少知道这样的运算可以得到必在屏幕内的坐标。
publicbooleanisGameOver(){
//边界判别
if(snake[0][0]<
0||snake[0][0]>
(width-SNAKEWIDTH)||
snake[0][1]<
0||snake[0][1]>
(height-SNAKEWIDTH)){
returntrue;
//碰到自身