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) {
正在阅读:
J2ME课程设计报告模板07-25
叉车操作培训1(1)05-19
内部控制手册第3部分-内控矩阵(C) - 1,1原油采购业务控制矩阵 -05-13
七年级上学期期中家长会班主任发言稿09-01
磁罗经复习题09-16
2015年湖南移动家客代维人员认证考试A卷(答案)10-21
绿地集团工程管理指导手册封面07-28
6kV油田配电线路中架空绝缘导线的应用09-18
同济桥梁总复习10-23
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 模板
- 课程
- 报告
- 设计
- J2ME