求java snake编程,有评论。
导入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){}
}
}