java me 策划书.docx
《java me 策划书.docx》由会员分享,可在线阅读,更多相关《java me 策划书.docx(32页珍藏版)》请在冰豆网上搜索。
javame策划书
贪吃蛇游戏设计
1.概述
本设计主要围绕贪吃蛇游戏展开。
众所周知,贪吃蛇游戏一直以来是比较流行的。
传统的贪吃蛇游戏功能比较少,对蛇的控制仅限于向左转和向右转,而现在的贪吃蛇游戏已经发展的相当好;具有更多的功能和友好的界面。
例如,最近流行的免费的3D版的贪吃蛇游戏,界面相当的美观,有很强的立体效果,真实感更强,食物也为立体的且颜色绚丽。
在3D版贪吃蛇游戏里面,墙壁是真实的墙壁,障碍物比较多,如树、土丘等。
此外,其功能更多更强,可以选择难度。
不过,总而言之,即具娱乐性与益智性,这就是贪吃蛇游戏的优点。
因水平有限,只能设计简单的贪吃蛇游戏。
不过,在功能上,比传统贪吃蛇游戏更丰富。
蛇可以反向运动,操作起来,显得更为灵活。
界面的颜色选用绿色,不易使眼睛疲劳。
2.需求与分析
2.1对功能的规定
本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的开始、暂停、退出等功能,分为:
游戏主界面模块、游戏控制模块两个模块。
游戏主界面模块:
主要包括游戏图形区域界面、游戏开始按钮、暂停按钮、退出按钮。
游戏控制模块:
主要完成游戏的开始、暂停、退出等功能。
2.2对性能的规定
本游戏在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
游戏主界面应该力求美观,赏心悦目。
游戏控制模块应做到易懂、易操作,而且准确率高,不易出错。
2.3输入输出要求
输入:
玩家可以通过快捷键控制游戏,比如快捷键“N”开始游戏,“P”暂停游戏,“R”继续上次游戏,“S”查看6次最高纪录,“L”设置级别为初级,“H”设置级别为高级,“D”查看游戏说明,“E”退出游戏。
键盘上的方向键控制蛇的移动方向。
输出:
玩家所得的分数,玩家所用的时间。
当玩家所控制的蛇死亡后,要输出一个消息“GameOver!
”表示蛇的死亡。
2.4业务流程图
3.系统功能模块
3.1模块之间的关系
3.2模块枝干图
简要说明:
图形驱动即完成初始化图形系统功能;开始画面模块的主要作用是根据设置绘制出玩游戏区域四周的墙壁;玩游戏的过程是游戏此游戏程序的核心,又可细分为好多小的功能模块;其中,显示食物模块仅完成显示食物功能;蛇前移模块即通过递归算法实现蛇的向某方向移动;判蛇死模块的功能是通过判断蛇是否碰到自己或墙壁来判断蛇有没有死亡。
吃到食物后小模块只有蛇吃到食物后才起作用。
即当蛇吃到食物后,蛇自身延长一节并绘出蛇,同时加10分。
通过键盘操控来玩游戏主要由判反向移动模块完成,即当蛇不是反向移动时,按照键盘上方向键指示移动。
游戏结束模块功能简单,仅完成输出得分与提示语功能。
最后图形结束模块完成关闭图形功能。
4.任务分工
成员
分工
组长评分
刘利霞
后期调试、代码整合
肖莎
数据操作模块
田君
模型设计
刘子豪
软件整体框架设计以及模块划分
骆兵
视图层设计
5.设计详细说明
5.1开发环境及工具
硬件平台:
Intel80X86
操作系统:
WindowsXP专业版32位SP3
集成开发环境:
EclipseME
仿真工具:
SUN公司WTK2.5.2的ColorPhone
数据库:
javax.microedition.rms类库
5.2概要设计
5.2.1软件主要功能设计
程序结构
根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面开始游戏、停止游戏,设置游戏级别(速度),设置图片等。
具体的程序结构如下面的图所示。
程序流程
根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。
贪吃蛇的内容主要包括:
游戏开始,随机出现食物。
5.2.2程序系统的组织结构
每个模块和子程序的名称、标识符:
Ground类:
privateintTYPE;
publicint[][]rocks=newint[Global.WIDTH][Global.HEIGHT];
publicvoidsetGround(inttype){}
根据不同的Type值将rocks的不同下标的元素设为1,其他元素为0。
publicbooleanisSnakeEatRock(Snakesnake){}
判断蛇头的所在的位置在数组rocks中的值是否为1,如果是1,则表示蛇吃到了石头,返回TRUE,否则返回FALSE。
publicPointgetPoint(){}
产生一组随机数(x,y),是食物的坐标
publicvoiddrawMe(Graphicsg){}
将数组rocks中值为1的元素填充为石头颜色。
SnakeMidlet类:
publicstaticintx,y;
privateintoldDirection,newDirection;
用于判断newDirection和oldDirection是否为相反方向,用于选取有效方向。
privatePointoldTail;
用于判断蛇头是否和蛇身的某个节点的坐标重合,即蛇是否吃到自己。
publicLinkedListbody=newLinkedList();
publicvoiddie(){}
设置变量life=FALSE;使控制进程的条件为假,进程结束。
publicvoidmove(){}
实现蛇身沿着蛇头的轨迹移动
publicvoidchangeDirection(intdirection){}
根据方向键,改变蛇头的x、y的值,即改变方向
publicvoiddrawMe(Graphicsg){}//把属于蛇的格子画出来
privateclassSnakeDriverimplementsRunnable{}//蛇不停走动
Food类:
publicvoiddrawMe(Graphicsg){}
根据产生的一组随机坐标,在其坐标处画出食物
Controller类:
功能:
处理按键事件及鼠标点击事件,处理逻辑。
根据不同的情况向Snake,Food,Ground发出不同的命令。
实现接口snakeMoved,蛇每移动一步,就要判断一次,蛇是否吃到石头、是否吃到自己,是的话就snake.die()并停止计时;不是则不进行任何操作。
如果吃到食物,就要加分、重画食物、蛇身加长。
实现(N)NewGame功能、(E)Exit功能、(R)Resume功能、(L)LowLevel功能、(H)HighLevel功能、(P)Pause功能。
GamePanel类:
功能:
画出Snake,Food,Ground,并实现重新显示
5.3程序设计
5.3.1程序描述
目的和意义:
该部分以窗体上的按钮或键盘上的快捷键为用户提供友好的控制手段。
为工作量繁大的用户提供一个简单而有趣的小游戏。
特点说明:
程序交互性好,操作性强。
易操作。
简单而有趣。
功能全面,如:
开始新游戏、暂停、继续、成绩、查看游戏说明、退出游戏。
对于每次不可选的按钮设置为灰显,避免了用户的错误操作。
5.3.2性能
本游戏在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
游戏主界面应该力求美观,赏心悦目。
游戏控制模块应做到易懂、易操作,而且准确率高,不易出错。
5.3.3输入项
用户的按钮操作,如点击NewGame、Pause、Resume、LowLevel、HighLevel、HighScore、Description、Exit。
或者选择键盘上的方向键和游戏设置的快捷键。
快捷键有:
N(NewGame)、P(Pause)、R(Resume)、L(LowLevel)、H(HighLevel)、S(HighScore)、D(Description)、E(Exit)。
5.3.4输出顶
时间、分数,以及将石头、食物、等级、分数、时间、蛇每个节点的坐标信息。
5.3.5功能
5.3.6算法
蛇、石头、食物的表示方法:
把显示区看做一个大大的表格,里面的格子就是组成蛇的基本单位,一个格子就表示一块石头或代表一个事物。
几个连在一起的格子可以代表一条蛇。
使用坐标来区分这些格子。
蛇的移动方式:
蛇每移动一步,可以看做蛇头增加一个节点,蛇尾删去一个节点。
保存蛇的数据结构:
因为要区分蛇头和蛇尾,这就要求这个数据结构是有序的,还要经常的访问最后一个和第一个节点,所以LinkList最适合。
蛇的移动方向:
根据原来蛇头的坐标和方向计算新蛇头的坐标,
格子的坐标和像素坐标:
由于画蛇、食物、石头我们只是填充一个矩形,或者在相应位置显示一张图片,所以我们要知道每个格子的坐标。
5.3.7流程逻辑
5.3.8接口
SnakeListener:
VoidSankeMoved(Snake);
5.3.9存储分配
该游戏软件运行时,Snake、Food、Ground三个对象一致同时存在,直到戏结束。
其中蛇移动方法长期占用资源,改变方向、吃到食物及石头都是瞬发动作,只是瞬间占用系统资源。
5.3.10注释设计
Snake类中:
privateintoldDirection,newDirection;
用于判断newDirection和oldDirection是否为相反方向,用于选取有效方向。
privatePointoldTail;
用于判断蛇头是否和蛇身的某个节点的坐标重合,即蛇是否吃到自己。
Privateboollife=TRUE;进程的控制条件
5.3.11限制条件
a.每个选项NewGame、Pause、Resume、LowLevel、HighLevel、Exit不能连续点击;
b.每次要点击Exit退出游戏才能保存游戏;
c.所运行机器必须装有JVM。
5.3.12测试计划
对这几个主要功能NewGame、Pause、Resume、LowLevel、HighLevel、Exit逐个进行测试;
由于程序较小,测试时间预计为1小时;
预期的结果:
a.在开始游戏后,按键盘上的方向键蛇会相应的改变方向。
b.吃掉食物后蛇身的长度增加一节,分数增加。
c.蛇碰到石头或碰到自己后游戏结束。
d.选择Pause后,停止计时,蛇停止移动。
e.选择Resume后,蛇在Pause时的地方继续移动,时间继续计时。
如果程序在Pause后,选择了Exit,再次运行程序时,选择Resume,也可以继续上次的游戏。
f.选择LowLevel、HighLevel鹰相应改变石头的布局及蛇移动的时间间隔。
5.4程序测试
菜单界面:
游戏界面:
游戏界面2:
6、关键源代码
(1)SnakeMIDlet
packagehelped;
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
publicclassSnakeMIDletextendsMIDlet{
staticSnakeMIDletinstan;
publicDisplaydisplay;
publicGameCtrlgame;
playCanvas2c2=newplayCanvas2();
StartCasstc=newStartCas();
aboutCanvasac=newaboutCanvas();
TCanvastc=newTCanvas();
cuttingcg=newcutting();
ScoringCanvassc=newScoringCanvas();
staticmusicm=null;
menuCanvasmc=newmenuCanvas();
publicSnakeMIDlet(){
//获得Display
display=Display.getDisplay(this);
instan=this;
m=newmusic();
}
protectedvoidstartApp()throwsMIDletStateChangeException{
display.setCurrent(tc);
}
protectedvoidpauseApp(){
}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{
}
}
(2)playCanvas2
packagehelped;
importjava.io.IOException;
importjava.util.Random;
importjava.util.Timer;
importjava.util.TimerTask;
importjavax.microedition.lcdui.Canvas;
importjavax.microedition.lcdui.Font;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
classplayCanvas2extendsCanvasimplementsRunnable{
Timertimer=newTimer();
intstore=300;
intmax_length=100;
intcurrent_length=1;
Imagefood=null;
Imagesnake[]=newImage[max_length];
intsnake_px[]=newint[max_length];
intsnake_py[]=newint[max_length];
intcurrent_w=this.getWidth();
intcurrent_h=this.getHeight();
intscore=(current_length-1)*100;
intcurrent_dir=4;
finalintup_dir=1,down_dir=2,left_dir=3,right_dir=4;
publicplayCanvas2(){
this.setFullScreenMode(true);
current_w=this.getWidth();
current_h=this.getHeight();
timer.schedule(newRemindTask(),300,5000);
try{
snake[0]=Image.createImage("/head_img_right.png");
snake_px[0]=10;
snake_py[0]=10;
for(inti=1;isnake[i]=Image.createImage("/body_img.png");
snake_px[i]=10;
snake_py[i]=10;
}
food=Image.createImage("/food.png");
}catch(IOExceptione){e.printStackTrace();}
for(inti=0;isnake_px[i]=10-i;
}
}
protectedvoidpaint(Graphicsg){
g.setColor(0,55,120);
g.fillRect(0,0,current_w,current_h);
for(inti=0;ig.drawImage(snake[i],snake_px[i]*10,snake_py[i]*10,20);
}
g.drawImage(food,food_px*10,food_py*10,20);
g.setColor(0);
Fontfont=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE);
g.setFont(font);
g.drawString("菜单",210,300,20);
g.drawString(("得分:
"+score),100,300,20);
}
publicvoidkeyPressed(intkey){
switch(key){
case-1:
if(current_dir!
=down_dir)
current_dir=up_dir;
break;
case-2:
if(current_dir!
=up_dir)
current_dir=down_dir;
break;
case-3:
if(current_dir!
=right_dir){
current_dir=left_dir;
}
break;
case-4:
if(current_dir!
=left_dir)
current_dir=right_dir;
break;
case-7:
is_go=false;
SnakeMIDlet.instan.display.setCurrent(SnakeMIDlet.instan.mc);
SnakeMIDlet.instan.mc.m=110;
break;
}
this.repaint();
}
intfood_px;
intfood_py;
Randomrdm=newRandom();
publicvoidcreate_food(){
food_px=rdm.nextInt(24);
food_py=rdm.nextInt(27);
}
publicvoidfollow_head(){
for(inti=current_length-1;i>0;i--){
snake_px[i]=snake_px[i-1];
snake_py[i]=snake_py[i-1];
}
}
publicvoidup_AI(){
if(snake_py[0]if(snake_px[0]current_dir=right_dir;
}
if(snake_px[0]>food_px){
current_dir=left_dir;
}
if(snake_px[0]==food_px){
if(snake_px[0]>21){
current_dir=left_dir;
}
if(snake_px[0]<3){
current_dir=right_dir;
}
else{
current_dir=right_dir;
}
}
}
if(snake_py[0]==food_py){
if(snake_px[0]current_dir=right_dir;
}
if(snake_px[0]>food_px){
current_dir=left_dir;
}
}
if(snake_py[0]>food_py){
if(snake_px[0]current_dir=right_dir;
}
if(snake_px[0]>food_px){
current_dir=left_dir;
}
}
}
publicvoiddown_AI(){
if(snake_py[0]if(snake_px[0]current_dir=right_dir;
}
if(snake_px[0]>food_px){
current_dir=left_dir;
}
}
if(snake_py[0]==food_py){
if(snake_px[0]current_dir=right_dir;
}
if(snake_px[0]>food_px){
current_dir=left_dir;
}
}
if(snake_py[0]>food_py){
if(snake_px[0]current_dir=right_dir;
}
if(snake_px[0]>food_px){
current_dir=left_dir;
}
if(snake_px[0]==food_px){
if(snake_px[0]>21){
current_dir=left_dir;
}
if(snake_px[0]<3){
current_dir=right_dir;
}
else{
current_dir=left_dir;
}
}
}
}
publicvoidright_AI(){
if(snake_px[0]if(snake_py[0]current_dir=down_dir;
}
if(snake_py[0]>food_py){
current_dir=up_dir;
}
}
if(snake_px[0]==food_px){
if(snake_py[0]current_dir=down_dir;
}
if(snake_py[0]>food_py){
current_dir=up_dir;
}
}
if(snake_px[0]>food_px){
if(snake_py[0]>food_py){
current