在此附上游戏画布的的代码及完成后的产品
package com.xiang.game.graph;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.TextField;
import com.xiang.game.api.object.Crawler;
import com.xiang.game.api.object.SingleNode;
import com.xiang.game.api.object.Snake;
import com.xiang.game.api.object.SnakeInit;
import com.xiang.game.util.GameConstant;
import com.xiangqi.control.Navigator;
public class MyCanvas extends Canvas implements CommandListener {
private Snake snake;
private Crawler crawler;
private static Displayable instance;
//0表示还在游戏,1表示游戏失败结束,2表示游戏成功结束
private int gameover = 0;
TextField url = null;
Gauge volume = null;
private String gameoveralert = "";
synchronized public static Displayable getInstance() {
if (instance == null) {
instance = new MyCanvas();
}
return instance;
}
private MyCanvas() {
if(this.getWidth()/10 > this.getHeight()/10)
GameConstant.mapSize = this.getHeight()/10;
else
GameConstant.mapSize = this.getWidth()/10;
setTitle("游戏");
addCommand(new Command("规则介绍", Command.HELP, 1));
addCommand(new Command("返回", Command.BACK, 1));
setCommandListener(this);
snake = SnakeInit.init();
crawler = new Crawler(snake);
//启动多线程
drawSnakeByThread();
}
public void commandAction(Command c, Displayable d) {
Navigator.flow(c.getLabel());
}
protected void keyPressed(int keyCode) {
if(gameover!=1){
if(getGameAction(keyCode) == Canvas.UP || getGameAction(keyCode) == Canvas.DOWN
|| getGameAction(keyCode) == Canvas.LEFT || getGameAction(keyCode) == Canvas.RIGHT)
if(!SnakeInit.ifGoingTouchTheSide(getGameAction(keyCode), snake)){
//判断蛇不能往身体的反方向行走,true为反方向行走
snake = SnakeInit.eatOrGo(snake, crawler, getGameAction(keyCode));
}else{
//碰到边界游戏结束
gameover = 1;
}
repaint();
}
}
protected void paint(Graphics g) {
if(gameover == 0){
g.setColor(255, 255, 255);
g.fillRect(0,0,this.getWidth(),this.getHeight());
g.setColor(0, 0, 0);
for (int i = 0; i < GameConstant.mapSize + 1; i++) {
// 绘制X线
g.drawLine(0, i * GameConstant.singleSize, GameConstant.mapSize * GameConstant.singleSize, i
* GameConstant.singleSize);
// 绘制Y线
g.drawLine(i * GameConstant.singleSize, 0, i * GameConstant.singleSize, GameConstant.mapSize
* GameConstant.singleSize);
}
g.setColor(140, 101, 240);
SingleNode[] snakeTemplate = snake.getSnakeTemplate();
for (int i = 0; i < snakeTemplate.length; i++) {
SingleNode singleNode = snakeTemplate[i];
g.fillRect(singleNode.getxCoordinate() * 10 + 1, singleNode.getyCoordinate() * 10 + 1, 10 - 1, 10 - 1);
}
g.fillRect(crawler.getxCoordinate() * 10 + 1, crawler.getyCoordinate() * 10 + 1, 10 - 1, 10 - 1);
}else {
g.drawString(gameoveralert, 50, 50, 0);
}
}
public void drawSnakeByThread(){
Thread backgroundThread = new Thread(
new Runnable() {
public void run() {
while(gameover == 0){
if(!SnakeInit.ifGoingTouchTheSide(SnakeInit.getDirectionByNode(snake), snake)){
//判断蛇不能往身体的反方向行走,true为反方向行走
// snake = SnakeInit.eatOrGo(snake, crawler, SnakeInit.getDirectionByNode(snake));
int direction = SnakeInit.getDirectionByNode(snake);
if(!SnakeInit.getIfGostraight(direction, snake)){
if(SnakeInit.ifTouchTheCrawler(snake, crawler, direction)){
snake = SnakeInit.eat(direction,snake);
crawler = new Crawler(snake);
}else {
snake = SnakeInit.move(direction, snake);
}
}else{
if(SnakeInit.ifTouchTheCrawler(snake, crawler, direction)){
snake = SnakeInit.eat(direction,snake);
}else{
//如果为反方向,则直接保持前进方向,不做任何操作,由多线程操作移动
// snake = SnakeInit.goStraight(snake);
}
}
repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(snake.getSnakeTemplate().length == GameConstant.maxLength) gameover = 2;
}else{
//碰到边界游戏结束
gameover = 1;
}
}
if(gameover == 1){
gameoveralert = "游戏失败,下次再努力!";
}else if(gameover == 2){
gameoveralert = "恭喜你,成功过关!";
}
repaint();
}
}
);
backgroundThread.start();
}
}
不懂得请详询 QQ:526151410;成品和源代码在附件里,源代码加密,请详询