利用J2ME制作的手机游戏----贪吃蛇
在此附上游戏画布的的代码及完成后的产品
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;elseGameConstant.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;成品和源代码在附件里,源代码加密,请详询