導入javax . micro edition . lcdui . *;公共類SnakeMIDlet擴展MIDlet {
snake canvas displayable = new snake canvas();
公共SnakeMIDlet() {
Display.getDisplay(this)。setCurrent(可顯示);
} public void startapp(){ } public void pause app(){ } public void destroy app(Boolean undefined){ }//文件名:SnakeCanvas.javapackage snake導入Java . util . *;
導入javax . micro edition . lcdui . *;/**
*貪吃蛇遊戲
*/
公共類SnakeCanvas擴展Canvas實現Runnable{
/* *存儲snake節點的坐標,其中第二個下標是0,代表X坐標,第二個下標是1,代表Y坐標*/
int[][]snake = new int[200][2];
/* *已經使用的節點數*/
int snakeNum
/* *蛇的運動方向,0代表向上,1代表向下,2代表向左,3代表向右*/
int方向;
/*移動方向*/
/* *向上*/
private final int DIRECTION _ UP = 0;
/* *向下*/
private final int DIRECTION _ DOWN = 1;
/* *左側*/
private final int DIRECTION _ LEFT = 2;
/* *右*/
private final int DIRECTION _ RIGHT = 3;/* *遊戲區寬度*/
int寬度;
/* *遊戲區的高度*/
int高度;/* *蛇體單位寬度*/
私有最終字節snake width = 4;/* *是否掛起,true表示掛起*/
boolean isPaused = false
/* *是否正在運行,true表示正在運行*/
布爾isRun = true/* *時間間隔*/
私有final int SLEEP _ TIME = 300
/* *食物的X坐標*/
int foodX
/* *食物的Y坐標*/
int foodY
/* *食物的閃爍控制*/
布爾b =真;
/* *隨機對象*/
Random Random = new Random();
公共SnakeCanvas() {
//初始化
init();
width = this . getwidth();
height = this . get height();
//啟動線程
新帖(本)。start();
}/**
*初始化開始數據
*/
私有void init(){
//初始化節點數
snake num = 7;
//初始化節點數據
for(int I = 0;我& ltsnakeNumi++){
snake[I][0]= 100-snake width * I;
snake[I][1]= 40;
}
//初始化移動方向
方向=方向_右;
//初始化食物坐標
foodX = 100;
foodY = 100;
}受保護的空白油漆(圖形g) {
//清除屏幕
g . set color(0x ffffff);
g.fillRect(0,0,width,height);
g . set color(0);//繪制蛇的身體
for(int I = 0;我& ltsnakeNumi++){
g.fillRect(snake[i][0],snake[i][1],SNAKEWIDTH,snake width);
}
//畫食物
如果(b){
g.fillRect(foodX,foodY,SNAKEWIDTH,snake width);
}
}私有無效移動(int方向){
//蛇會動
for(int I = snake num-1;我& gt0;我- ){
蛇[i][0] =蛇[I-1][0];
蛇[i][1] =蛇[I-1][1];
}//第壹個單元格移動
開關(方向){
案例方向_向上:
snake[0][1]= snake[0][1]-snake width;
打破;
案例方向_向下:
snake[0][1]= snake[0][1]+snake width;
打破;
案例方向_左側:
snake[0][0]= snake[0][0]-snake width;
打破;
案例方向_右:
snake[0][0]= snake[0][0]+snake width;
打破;
}
}
/**
*吃食物,自己成長。
*/
私有void eatFood(){
//確定蛇頭是否與食物重疊。
if(snake[0][0]= = foodX & amp;& ampsnake[0][1] == foodY){
snake num++;
generate food();
}
}
/**
*生產食物
*註意:食物的坐標必須位於屏幕內,不能與蛇身重合。
*/
私有void generateFood(){
while(true){
foodX = math . ABS(random . nextint()%(width-snake width+1))
/snake width * snake width;
foodY = math . ABS(random . nextint()%(height-snake width+1))
/snake width * snake width;
布爾b =真;
for(int I = 0;我& ltsnakeNumi++){
if(foodX = = snake[I][0]& amp;& ampsnake[i][1] == foodY){
b =假;
打破;
}
}
如果(b){
打破;
}
}
}
/**
*判斷遊戲是否結束。
*結束條件:
* 1,蛇頭越界了。
* 2.黑魚摸自己。
*/
私有布爾值isGameOver(){
//邊界辨別
if(snake[0][0]& lt;0 | | snake[0][0]& gt;(width - SNAKEWIDTH) ||
snake[0][1]& lt;0 | | snake[0][1]& gt;(高度-蛇寬)){
返回true
}
//碰到自己
for(int I = 4;我& ltsnakeNumi++){
if(snake[0][0] == snake[i][0]
& amp& ampsnake[0][1]= = snake[I][1]){
返回true
}
}
返回false
}/**
*事件處理
*/
public void key pressed(int key code){
int action = this . getgameaction(key code);
//改變方向
開關(動作){
案例向上:
如果(方向!=方向_向下){
direction = DIRECTION _ UP
}
打破;
案例向下:
如果(方向!= DIRECTION_UP){
方向=方向_向下;
}
打破;
案例左側:
如果(方向!=方向_右){
方向=方向_左;
}
打破;
案例權利:
如果(方向!=方向_左){
方向=方向_右;
}
打破;
案例火災:
//暫停並繼續
isPaused =!isPaused
打破;
}
}/**
*線程方法
*使用精確延遲。
*/
公共無效運行(){
嘗試{
while (isRun) {
//開始時間
long start = system . current time millis();
如果(!isPaused){
//吃食物
eat food();
//移動
移動(方向);
//結束遊戲
if(isGameOver()){
打破;
}
//控制閃爍
b =!b;
}
//重繪
repaint();
long end = system . current time millis();
//延遲
if(end-start & lt;SLEEP_TIME){
thread . SLEEP(SLEEP _ TIME-(end-start));
}
}
}catch(異常e){}
}
}