求java snake编程,有评论。

J2ME蛇源代码-大约200行,包括详细的评论包蛇;导入javax . micro edition . midlet . *;

导入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){}

}

}