J2ME课程设计报告模板

更新时间:2023-07-25 06:32:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

J2ME课程设计报告

J2ME手机贪吃蛇

专 业: 软件工程

班 级: 2

组 号:

指导教师: 郭俊

二011年 9 月 14日

摘要

1)介绍项目意义背景。

本文给出了一个基于MIDP2.1的贪吃蛇游戏的设计方案,并给出全部实现源代码。利用J2ME语言编程的思想来完成系统的设计,然后编写出程序设计代码进行界面设计,实现友好的界面交互,具有清晰的程序流程图,最后编程实现了全过程。

2)本文作的主要工作:

(1),贪吃蛇是个老幼皆宜的小游戏。

(2),它实现由3块正方形的方块组成的一条蛇和正方形小块组成的食物,然后有小蛇按方向去吃食物。

(3),计算机使食物随机出现,根据计算机控制它在一定的时间不停的出现,玩家可以让小蛇上、下、左、右的进行吃食物。

3)本文组织

第一章:首先,主要有主程序GameManager来连接实现全界面功能

第二章: Navigator.java: 该文件是开始界面。MainScreen.java: 该文件负责创建主界面。 MessageScreen.java: 该文件是胜利后和最高分文件。

第三章: NewGame.java:该文件是整个游戏的核心文件。

目 录

(空两行)

1. 前言------------------------------------------------------------------------------------------------------------- 1

2. 需求分析------------------------------------------------------------------------------------------------------- 1

3. 概要设计(特殊功能) ------------------------------------------------------------------------------------- 1

4. 详细设计------------------------------------------------------------------------------------------------------- 2

5. 源代码及可执行程序 ---------------------------------------------------------------------------------------- 4

6. 特殊问题解决方法 ------------------------------------------------------------------------------------------ 24

6.1. 问题1 ------------------------------------------------------------------------------------------------------ 24

6.2. 问题2 ------------------------------------------------------------------------------------------------------ 25

7. 使用说明及测试结果 --------------------------------------------------------------------------------------- 25

8. 结论------------------------------------------------------------------------------------------------------------ 26 参考书目 ------------------------------------------------------------------------------------------------------------ 27

1. 前言

J2ME语言继承了JAVA语言易学易用的特点,特别适合于初学者学系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。通过这学期来J2ME课程的学习,我初步掌握了J2ME语言的最基本的知识,于是老师的指导下动手用J2ME编写俄贪吃蛇游戏。

游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,激发大家的娱乐激情。从本游戏的基本玩法出发,主要就是贪吃蛇是个老幼皆宜的小游戏。它实现由3块正方形的方块组成的一条蛇和正方形小块组成的食物,然后有小蛇按方向去吃食物。计算机使食物随机出现,根据计算机控制它在一定的时间不停的出现,玩家可以让小蛇上、下、左、右的进行吃食物。

2. 需求分析

1、开始:开始游戏

2、继续:对游戏暂停之后可以继续游戏

3、帮助:能帮助你更好的过关

4、关于:关于软件的制作人员

5、退出:关闭游戏

3. 概要设计(特殊功能)

对你要实现的系统的总体设计,包括:你系统的系统结构和体系框架;项目框图及本工作在项目中的地位;系统中自己完成模块部分的所有对象的概要设计(如对象的主要职责和对象之间的相互关系);主要的控制流程;重要的功能流程设计及方案选择等内容。

首先游戏的功能最主要就是能够实现贪吃蛇的游戏功能。在游戏的过程中可以暂停返回到主菜单界面,可以返回继续原来的游戏或者开始新游戏。原来计划使用记录管理系统(RMS)将游戏状态保存下来,这样退出程序后也可以继续原来的游戏,但是实际中发现需要保存的数据量太大,保存时间过长(大约4—5 秒),最后还是决定用Boolean 变量控制游戏状态。

本游戏的操作流程非常简单,用户启动MIDlet启动后,即进入游戏主画面,屏幕开始显示为欢迎画面。用户按下[开始]按钮后,就可以开始玩游戏了,当用户想暂停时,再次按一下[开始]按钮,游戏就暂停了,在暂停的情况下再按[开始]按钮,游戏继续运行。任何时候按[退出]按钮,游戏MIDlet都会终止。

本程序共有5个java源文件:

GameManager.java:该文件是游戏画布。

Navigator.java: 该文件是开始界面。

MainScreen.java: 该文件负责创建主界面。

MessageScreen.java: 该文件是胜利后和最高分文件。

NewGame.java:该文件是整个游戏的核心文件。

4. 详细设计

游戏包括几个部分,由于数码相机近距离照不清手机上的字,这里只有用模拟 器的截图了:

游戏的起点是 GameManage 类,继承自MIDlet 类,实现游戏的开始和退出。 主菜单界面提供进入其他功能的选项,代码在 MainScreen.java 文件中,继承

自List 类。

选择“帮助”和“关于”菜单显示文字信息,由 MessageScreen.java 实现,继 承自Form 类。

在 Navigator.java 中实现对游戏流程的控制,处理游戏界面的切换和显示。 游戏界面屏幕大小设置的非常好,所以效果在模拟器上看起来右边已经

出了屏幕:

游戏界面就在 NewGame.java 中实现。由于偷懒,这里把算法的处理和游戏的

动画显示都放在这个文件里面,太不了。

游戏界面切换

如图所示,游戏从 GameManage 开始启动,进入Navigator 控制显示主菜单界 面,其他界面都由从菜单界面进入,除了当游戏胜利后可以从游戏界面跳至结束

信息界面。

5. 源代码及可执行程序

要求提交主要模块的全部源代码(以小组方式统一提交);源代码应该满足小组规定的源代码规范,包括命名规范,缩进对齐规范,注释规范等等。源代码的注释应丰富并且有实用。同时要求编译生成.class文件,以package的方法发布。使得在检查程序时可以方便的运行。报告中只对需要说明的极少部分关键代码进行阐述。

1、 GameManager

游戏启动后,直接进入主菜单界面,原来设计了一个boolean 变量

isInitialization

用来在外界原因中断游戏(如来电话)后返回时使用,不过现在没有考虑这种情况,等以后有时间再增加。

public void startApp( ) {

if(isInitialization){

Navigator.current=Navigator.MAIN_SCREEN;

Navigator.showScreen(null);

isInitialization=false;

}

}

2、 MainScreen

显示主菜单,通过选择菜单转入其他页面。

这里使用 Navigator 类的静态boolean 型变量isNewGame 判断是否产生继续菜 单:

private void getGameMenu( ){

append("开始",null);

if(!Navigator.isNewGame){

append("继续",null);

}

append("帮助",null);

append("关于",null);

append("离开",null);

}

在命令动作方法中通过判断选择菜单的名称, 使用Navigator 类的 changeScreen( )方法转换页面。

String cmd=getString(getSelectedIndex());

Navigator.changeScreen(cmd);

3、 MessageScreen

由于要根据不同情况显示不同信息,需要传入一个参数构造MessageScreen 类 的实例,所以构造方法如下:

public MessageScreen(String messageName) {

super(Navigator.softTitle);

back=new Command("返回", Command.BACK,1);

message=initStringItem(messageName);

this.append(message);

this.addCommand(back);

this.setCommandListener(this);

}

在initStringItem( )产生不同页面,如果是完成游戏后显示的信息,则将 Navigator 类的变量isNewGame 置为true:

private StringItem initStringItem(String s){

if(s.equals("胜利")){

Navigator.isNewGame=true;

return new StringItem("--胜利宣言--", " "); } else if(s.equals("帮助")){

String temp=" ";

return new StringItem("--帮助--", temp); }

else if(s.equals("关于")){

String temp=" ";

return new StringItem("--关于游戏--", temp); }

else{

return new StringItem("error","\nno information!"); }

}

4 、Navigator

这个类是整个游戏控制的核心,保证了游戏流程进行的正确。编写完成显示界 面和改变界面功能的两个方法showScreen ( )和changeScreen( )。

changeScreen( )根据当前页面变量current 做出相应的操作。即在手机上,即使 不同页面触发相同事件,也会引起不同的操作。这里一般是根据按下命令键的字 符串区分不同操作。

public static void changeScreen(String cmd){

switch (current) {

case MAIN_SCREEN:

if(cmd.equals("开始")){

Navigator.isNewGame=true;

current=GAME_SCREEN;

showScreen(null);

}

else if(cmd.equals("继续")){

Navigator.isNewGame=false;

current=GAME_SCREEN;

showScreen(null);

}

else if(cmd.equals("帮助")){

current=MESSAGE_SCREEN;

showScreen("帮助");

}

else if(cmd.equals("关于")){

current=MESSAGE_SCREEN;

showScreen("关于");

}

else if(cmd.equals("离开")){

showScreen("离开");

}

break;

case GAME_SCREEN:

if(cmd.equals("返回")){

current=MAIN_SCREEN;

showScreen(null);

}

else if(cmd.equals("胜利")){

current=MESSAGE_SCREEN;

showScreen("胜利");

}

break;

case MESSAGE_SCREEN:

if(cmd.equals("返回")){

current=MAIN_SCREEN;

showScreen(null);

}

break;

}

}

showScreen () 根据当前页面变量current 的不同值显示相应页面。与

changeScreen( )相同的处理方法,在不同current 时,根据传入的字符串参数做出不

同处理。

public static void showScreen(Object obj){

switch(current){

case MAIN_SCREEN:

if(obj==null){

display.setCurrent(MainScreen.getInstance());

}

else if(((String)obj).equals("离开")){

GameManager.instance.isSafeQuit=true;

GameManager.quitApp();

}

break;

case GAME_SCREEN:

display.setCurrent(NewGame.getInstance());

break;

case MESSAGE_SCREEN:

display.setCurrent(new MessageScreen((String)obj));

break;

}

}

5 、Coordinates

这个类用来产生随机的x、y 坐标数,产生的是在一个固定范围内的非零值。 如产生0 和行数之间的随机非零整数:

temp= random.nextInt( );

x = ng.Math.abs( (temp) % row);

6 、Block

游戏界面由多个小方格组成,单独编了一个Block 类,每一个小方格都是这个 类的一个实例。

direction 保存当前方格的前进方向,isRandom 区别当前方块是蛇身的一部分还

是随机产生的方块,status 区别当前方块是背景还是蛇身。

7 、NewGame

这里实现游戏功能,包括产生新游戏页面、返回旧游戏页面、游戏算法的实现、 屏幕的显示刷新等。如果更面向对象化一些,应该把算法的部分另外编写一个类 来实现,但是事先没有规划,想一些写一些,等写好后也懒得改了。正所谓:偷 懒我所欲也,OO 亦我所欲也,两者不可得兼,舍OO 而取偷懒者也。

舍弃面向对象的结果就是一个字——繁!从图上就可以看出明显这个类要复杂 的多。为了防止程序正在处理绘图的时候无法相应其他事件(如按键盘),这个类

使用线程来解决这个问题。getInstance( )处理显示新游戏还是原来的游戏: synchronized public static Displayable getInstance( ) {

if (instance == null) {

Navigator.isNewGame = false;

instance = new NewGame();

}

else if (Navigator.isNewGame) { Navigator.isNewGame = false;

instance = new NewGame();

}

return instance;

}

对键盘事件的处理:

protected void keyPressed(int keycode) {

if (isRunning) {

switch (keycode) {

case KEY_NUM2: //数字键2

case -1: //导航键↑

if(headX-1<0){ //出界

break;

}

else if(

blockStatus[headX-1][headY].direction==DIRECTION_DOWN&&bl

ockStatus[headX-1][headY].status==true){ //蛇头移动方向是向后,即原 来蛇头的位置

break;

}

else{

blockStatus[headX][headY].direction = DIRECTION_UP;

headDirection = DIRECTION_UP;

break;

}

}

}

}

在paint( )中调用paintBlocks( )绘制方块,根据方块的status 值不同,分别用两 种颜色区分背景和蛇身:

if (!blockStatus[i][j].status) {

g.setColor(COLOR_BACKGROUND);

g.fillRect(MARGIN_LEFT + (BLOCK_LENGTH + 1) * j,

MARGIN_TOP + (BLOCK_LENGTH + 1) * i,

BLOCK_LENGTH, BLOCK_LENGTH);

}

else if (blockStatus[i][j].status) {

g.setColor(COLOR_SNAKE);

g.fillRect(MARGIN_LEFT + (BLOCK_LENGTH + 1) * j,

MARGIN_TOP + (BLOCK_LENGTH + 1) * i,

BLOCK_LENGTH, BLOCK_LENGTH);

}

线程的run( )方法中,进行程序各个功能的调度:

while (isRunning) {

moveSnakeHead();

if (snakeLength >= BLOCK_ROW_NUM * BLOCK_COL_NUM) {

isRunning = false;

Navigator.changeScreen("胜利");

break;

}

//出界或蛇头与蛇身交叉

else if (isOut || isCross) {

isRunning = false;

Navigator.isNewGame = true;

initialization();

Navigator.changeScreen("返回");

}

else {

moveSnakeTail();

if (!isHaveBlock) { //产生一个新的随机方格

showRandomBlock();

isHaveBlock = true;

}

repaint( ); //刷新屏幕

try {

Thread.sleep(sleepTime);

}

catch (Exception ex) {}

}

}

showRandomBlock( )产生随机方格,方格的位置应该避开蛇身的坐标: while (flag) {

Coordinates cod = new Coordinates(BLOCK_ROW_NUM,

BLOCK_COL_NUM);

x = cod.x;

y = cod.y;

if (!blockStatus[x][y].status) {

blockStatus[x][y].status = true;

blockStatus[x][y].isRandom = true;

flag = false;

}

else{

blockStatus[tailX+1][tailY].direction=DIRECTION_NONE;

}

}

moveSnakeHead( )和moveSnakeTail( )比较复杂,简单说就是moveSnakeTail( ) 根据按键的值将相应方向的方格蛇值为蛇头;moveSnakeHead( )将前一个蛇身方格设置为蛇尾,同时清除当前蛇尾方格的状态。这样,动态的现实就好像整个的蛇

向前移动了一格。

这里需要注意的是:

1)根据蛇头坐标计算是否出界;

2)蛇头碰到非背景的方格,需要判断是随机方格还是碰到了蛇身。如果是随 机方格,就将这个方格设置为蛇头;如果是蛇身则游戏结束;

3)蛇头中保存的始终是上一次按键按下的方向值,新按键按下,设置新的蛇 头,这样,蛇身的每一个方格中的方向都是它前一个蛇身方格的方向,即 移动的前进方向;

4)移动蛇尾时,如果这一次的移动中蛇头碰到随机方格,则蛇尾不移动;移

动蛇尾后将原蛇尾的方块的方向属性设置为无方向。

源代码:

1、

package greedsanke;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class GameManager extends MIDlet {

public static GameManager instance;

private boolean isInitialization;

public static boolean isSafeQuit;

/** Constructor */

public GameManager() {

instance = this;

isInitialization=true;

isSafeQuit=true;

Navigator.display=Display.getDisplay(this);

//Navigator.midlet=instance;

}

/** Main method */

public void startApp() {

if(isInitialization){

Navigator.current=Navigator.MAIN_SCREEN;

Navigator.showScreen(null);

isInitialization=false;

}

}

/** Handle pausing the MIDlet */

public void pauseApp() {

}

/** Handle destroying the MIDlet */

public void destroyApp(boolean unconditional) throws MIDletStateChangeException{ if(unconditional==false){

throw new MIDletStateChangeException();

}

}

/** Quit the MIDlet */

public static void quitApp() {

//J2ME 编写贪吃蛇游戏

//17

try {

instance.destroyApp(isSafeQuit);

instance.notifyDestroyed();

instance = null;

}

catch (MIDletStateChangeException ex) {

//do work of end midlet

//---------------------------

//---------------------------

isSafeQuit=true;

}

}

}

2、

package greedsanke;

import javax.microedition.lcdui.*;

import javax.microedition.rms.*;

public class MainScreen extends List implements CommandListener{

private static Displayable instance;

private MainScreen() {

super(Navigator.softTitle,IMPLICIT);

getGameMenu();

setCommandListener(this);

}

private void getGameMenu(){

append("开始",null);

if(!Navigator.isNewGame){

append("继续",null);

}

append("最高分",null);

append("帮助",null);

append("关于",null);

append("离开",null);

}

synchronized public static Displayable getInstance(){

instance=new MainScreen();

return instance;

}

public void commandAction(Command command,Displayable s){

String cmd=getString(getSelectedIndex());

Navigator.changeScreen(cmd);

}

}

3、

package greedsanke;

import javax.microedition.lcdui.*;

public class MessageScreen extends Form implements CommandListener{

private StringItem message;

public Command back;

public MessageScreen(String messageName) {

super(Navigator.softTitle);

back=new Command("返回", Command.BACK,1);

message=initStringItem(messageName);

this.append(message);

this.addCommand(back);

this.setCommandListener(this);

}

private StringItem initStringItem(String s){

if(s.equals("胜利")){

Navigator.isNewGame=true;

return new StringItem("--胜利宣言--", "\n 文字 ");

}

else if(s.equals("最高分")){

String temp="\n 文字 ";

return new StringItem("--帮助--", temp);

}

else if(s.equals("帮助")){

String temp="\n 文字 ";

return new StringItem("--帮助--", temp);

}

else if(s.equals("关于")){

String temp="\n 文字 ";

return new StringItem("--关于游戏--", temp);

}

else{

return new StringItem("error","\nno information!");

}

}

public void commandAction(Command command, Displayable displayable){

if(command.getCommandType()==Command.BACK){

Navigator.changeScreen(command.getLabel());

}

}

}

4、

package greedsanke;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class Navigator {

final public static String softTitle="家园制造";

final public static int MAIN_SCREEN=0;

final public static int GAME_SCREEN=1;

final public static int MESSAGE_SCREEN=2;

public static boolean isNewGame=true;

public static Display display;

public static int current;

public Navigator() {

}

public static void showScreen(Object obj){

switch(current){

case MAIN_SCREEN:

if(obj==null){

display.setCurrent(MainScreen.getInstance());

}

else if(((String)obj).equals("离开")){

GameManager.instance.isSafeQuit=true;

GameManager.quitApp();

}

break;

case GAME_SCREEN:

display.setCurrent(NewGame.getInstance());

break;

case MESSAGE_SCREEN:

display.setCurrent(new MessageScreen((String)obj));

break;

}

}

public static void changeScreen(String cmd){

switch (current) {

case MAIN_SCREEN:

if(cmd.equals("开始")){

Navigator.isNewGame=true;

current=GAME_SCREEN;

showScreen(null);

}

else if(cmd.equals("继续")){

Navigator.isNewGame=false;

current=GAME_SCREEN;

showScreen(null);

}

else if(cmd.equals("最高分")){

Navigator.isNewGame=false;

current=GAME_SCREEN;

showScreen(null);

}

else if(cmd.equals("帮助")){

current=MESSAGE_SCREEN;

showScreen("帮助");

}

else if(cmd.equals("关于")){

current=MESSAGE_SCREEN;

showScreen("关于");

}

else if(cmd.equals("离开")){

showScreen("离开");

}

break;

case GAME_SCREEN:

if(cmd.equals("返回")){

current=MAIN_SCREEN;

showScreen(null);

}

else if(cmd.equals("胜利")){

current=MESSAGE_SCREEN;

showScreen("胜利");

}

break;

case MESSAGE_SCREEN:

if(cmd.equals("返回")){

current=MAIN_SCREEN;

showScreen(null);

}

break;

}

}

}

5、

package greedsanke;

import javax.microedition.lcdui.*;

public class NewGame

extends Canvas

implements Runnable, CommandListener {

private static Displayable instance;

public Command back, start, pause;

private java.util.Random random;

private int COLOR_PANEL = (255 << 255) | (255 << 255) | (255);

private int COLOR_BACKGROUND = (200 <<200) | (200 <<200) | (200);

private int COLOR_SNAKE = (100 << 0) | (100 << 0) | (100);

private static int BLOCK_ROW_NUM = 28;

private static int BLOCK_COL_NUM = 23;

private int BLOCK_LENGTH = 9;

private int MARGIN_LEFT = 5;

private int MARGIN_TOP = 6;

private static Block[][] blockStatus;

private boolean isOut, isCross;

private boolean isRunning;

private boolean isHaveBlock;

private boolean isTouchRandom;

private static int oldDirection;

private Thread snakeThread;

private int sleepTime;

private int snakeLength;

private int headDirection;

final private static int DIRECTION_UP = 0;

final private static int DIRECTION_DOWN = 1;

final private static int DIRECTION_LEFT = 2;

final private static int DIRECTION_RIGHT = 3;

final public static int DIRECTION_NONE=4;

private int headX, headY;

private int tailX, tailY;

public NewGame() {

blockStatus = new Block[BLOCK_ROW_NUM][BLOCK_COL_NUM];

sleepTime = 150;

random = new java.util.Random();

initialization();

back = new Command("返回", Command.BACK, 1);

start = new Command("开始", Command.OK, 2);

pause = new Command("暂停", Command.STOP, 3);

addCommand(back);

addCommand(start);

setCommandListener(this);

}

private void initialization() {

isOut = false;

isCross = false;

isHaveBlock = false;

isTouchRandom = false;

oldDirection = DIRECTION_RIGHT;

snakeLength = 10;

for (int i = 0; i < BLOCK_ROW_NUM; i++) {

for (int j = 0; j < BLOCK_COL_NUM; j++) {

blockStatus[i][j] = new Block();

}

}

blockStatus[BLOCK_ROW_NUM / 2][1].status = true;

blockStatus[BLOCK_ROW_NUM / 2][1].direction = DIRECTION_RIGHT;

blockStatus[BLOCK_ROW_NUM / 2][2].status = true;

blockStatus[BLOCK_ROW_NUM / 2][2].direction = DIRECTION_RIGHT;

blockStatus[BLOCK_ROW_NUM / 2][3].status = true;

blockStatus[BLOCK_ROW_NUM / 2][3].direction = DIRECTION_RIGHT;

headX = BLOCK_ROW_NUM / 2;

headY = 3;

tailX = BLOCK_ROW_NUM / 2;

tailY = 1;

headDirection = DIRECTION_RIGHT;

}

synchronized public static Displayable getInstance() {

if (instance == null) {

Navigator.isNewGame = false;

instance = new NewGame();

}

else if (Navigator.isNewGame) {

Navigator.isNewGame = false;

instance = new NewGame();

}

return instance;

}

public void commandAction(Command command, Displayable displable) {

if (command.getCommandType() == Command.OK) {

isRunning = true;

this.removeCommand(start);

this.removeCommand(back);

this.addCommand(pause);

snakeThread = new Thread(this);

snakeThread.start();

}

else if (command.getCommandType() == Command.STOP) {

isRunning = false;

this.removeCommand(pause);

this.addCommand(start);

this.addCommand(back);

}

else if (command.getCommandType() == Command.BACK) {

Navigator.changeScreen(command.getLabel());

}

}

protected void keyPressed(int keycode) {

if (isRunning) {

switch (keycode) {

case KEY_NUM2:

case -1:

if(headX-1<0){

break;

}

else

if(blockStatus[headX-1][headY].direction==DIRECTION_DOWN&&blockStatus[headX-1][headY].status==true){

break;

}

else{

blockStatus[headX][headY].direction = DIRECTION_UP;

headDirection = DIRECTION_UP;

break;

}

case KEY_NUM4:

case -3:

if(headY-1<0){

break;

}

else

if(blockStatus[headX][headY-1].direction==DIRECTION_RIGHT&&blockStatus[headX][headY-1].status==true){

break;

}

else{

blockStatus[headX][headY].direction = DIRECTION_LEFT;

headDirection = DIRECTION_LEFT;

break;

}

case KEY_NUM6:

case -4:

if(headY+1==BLOCK_COL_NUM){

break;

}

else

if(blockStatus[headX][headY+1].direction==DIRECTION_LEFT&&blockStatus[headX][headY+1].status==true){

break;

}

else{

blockStatus[headX][headY].direction = DIRECTION_RIGHT;

headDirection = DIRECTION_RIGHT;

break;

}

case KEY_NUM8:

case -2:

if(headX+1==BLOCK_ROW_NUM){

break;

}

else

if(blockStatus[headX+1][headY].direction==DIRECTION_UP&&blockStatus[headX+1][headY].status==true){

break;

}

else{

blockStatus[headX][headY].direction = DIRECTION_DOWN;

headDirection = DIRECTION_DOWN;

break;

}

}

}

}

public void paint(Graphics g) {

/**@todo Implement this javax.microedition.lcdui.Displayable abstract method*/ g.setColor(COLOR_PANEL);

g.fillRect(0, 0, this.getWidth(), this.getHeight());

paintBlocks(g);

}

private void paintBlocks(Graphics g) {

for (int i = 0; i < BLOCK_ROW_NUM; i++) {

for (int j = 0; j < BLOCK_COL_NUM; j++) {

if (!blockStatus[i][j].status) {

g.setColor(COLOR_BACKGROUND);

g.fillRect(MARGIN_LEFT + (BLOCK_LENGTH + 1) * j,

MARGIN_TOP + (BLOCK_LENGTH + 1) * i,

BLOCK_LENGTH, BLOCK_LENGTH);

}

else if (blockStatus[i][j].status) {

本文来源:https://www.bwwdw.com/article/z3lm.html

Top