J2ME蛇游戏的实现

导入Java . util . random;

导入Java . util . vector;

导入javax . micro edition . LC dui . canvas;

导入javax . micro edition . LC dui . graphics;

公共类SnakeCanvas扩展Canvas实现Runnable {

/**

* java.util.Vector类

*实现List接口,Vector类允许内部存在重复的元素,内部元素有特定的顺序。

*矢量类提供了几组实际可以增加的工作能量。

*/

//实现蛇身的成长,存储蛇身的点。

向量蛇=新向量();

//每个蛇形单元的宽度

private static final int tile size = 5;

//蛇的移动方向

private int方向;

//存储苹果的点。

私点苹果;

//线程睡眠时间来控制snake的速度。

private int sleeptime = 500

//循环标志

布尔tab = true

/**

* SankCanvas构造函数

*功能:绘制初始化蛇

*/

公共SnakeCanvas(){

super();

snake.addElement(new Point(2,5));

snake.addElement(new Point(3,5));

snake.addElement(new Point(4,5));

snake.addElement(new Point(5,5));

snake.addElement(new Point(6,5));

snake.addElement(新点(6,6));

方向=画布。对;

//调用方法绘制苹果。

this.apple =新点()。create point();

//启用线程

新帖(本)。start();

}

受保护的void按键(int keyCode){

super.keyPressed(键码);

int action = this . getgameaction(key code);

//防止蛇倒退

开关(方向){

案例画布。向上:

动作=(动作==画布。往下)?画布。UP:动作;

打破;

案例画布。向下:

动作=(动作==画布。UP)?画布。下:行动;

打破;

案例画布。左侧:

动作=(动作==画布。对吧)?画布。左:动作;

打破;

案例画布。右:

动作=(动作==画布。左)?画布。右:行动;

打破;

}

开关(动作){

案例画布。向上:

方向=画布。向上;

打破;

案例画布。向下:

方向=画布。向下;

打破;

案例画布。左侧:

方向=画布。左;

打破;

案例画布。右:

方向=画布。对;

打破;

}

}

公共无效运行(){

while(tab){

Point head =(Point)snake . element at(snake . size()-1);

//将第二个块的坐标改为第一个块的坐标。

for(int I = 0;我& ltsnake . size()-1;i++){

((点)snake.elementAt(i))。setPoint((Point)snake . element at(I+1));

}

开关(方向){

案例画布。向上:

head . sety(head . gety()-1);

打破;

案例画布。向下:

head . sety(head . gety()+1);

打破;

案例画布。左侧:

head . setx(head . getx()-1);

打破;

案例画布。右:

head . setx(head . getx()+1);

打破;

}

if(head . getx()& lt;0){

System.out.println("蛇头撞墙,游戏结束");

tab = false

} else if(head . gety()& lt;0){

System.out.println("蛇头撞墙,游戏结束");

tab = false

} else if(head . getx()& gt;this.getWidth()){

System.out.println("蛇头撞墙,游戏结束");

tab = false

} else if(head . gety()& gt;this.getHeight()){

System.out.println("蛇头撞墙,游戏结束");

tab = false

}

for(int I = 0;我& ltsnake . size()-1;i++){

if(head . equals((Point)snake . element at(I))){

System.out.println("摸蛇游戏结束");

tab = false

}

}

Point tail =(Point)snake . element at(0);

点零售=空;

if(head.equals(apple)){

开关(方向){

案例画布。向上:

retail = new Point(tail.getX()、tail . gety()-1);

打破;

案例画布。向下:

retail = new Point(tail.getX()、tail . gety()+1);

打破;

案例画布。左侧:

零售=新点(tail.getX()-1,tail . gety());

打破;

案例画布。右:

零售=新点(tail.getX()+1,tail . gety());

打破;

}

snake.insertElementAt(零售,0);

sleeptime * = 0.99

this.apple =新点()。create point();

}

this . repaint();

尝试{

Thread.sleep(睡眠时间);

} catch (InterruptedException e) {

e . printstacktrace();

}

}

}

公共空白油漆(图形g) {

g.setColor(255,255,255);

g.fillRect(0,0,this.getWidth()、this . getheight());

g.setColor(0,0,0);

//画蛇

for(int I = 0;我& ltsnake . size();i++){

Point Point =(Point)snake . element at(I);

g . fill rect(point . getx()* tileSize,point.getY()*tileSize,tile size,tile size);

}

//画苹果

g . fill rect(apple . getx()* tileSize,apple.getY()*tileSize,tile size,tile size);

}

/**

*点类

*

*功能:方便设置坐标点。

*

* @作者管理员

*

*/

类点{

私有int x;

私有int y;

公共点(){

super();

}

公共点(int x,int y){

super();

this.x = x

this.y = y

}

公共点(点点){

super();

this . x = point . getx();

this . y = point . gety();

}

public int getX() {

返回x;

}

public void setX(int x) {

this.x = x

}

public int getY() {

返回y;

}

公共空集合(int y) {

this.y = y

}

公共无效设定点(点){

this . x = point . getx();

this . y = point . gety();

}

/**

*创建点()

*功能:创建随机生成苹果的新点。

* @返回点

*/

公共点createPoint(){

/**

* java.util.Random类

*创建一个新的随机数生成器。

*它将当前时间的毫秒数作为种子。

*可以通过System.currentTimeMillis()获取当前时间的毫秒数。

*/

Random Random = new Random();

/**

* Java . util . random . nextint(int n);

*返回一个伪随机数。

*它是一个均匀分布在0(包括0)和指定值(不包括0)之间的int值,来自该随机数生成器的序列。

*/

返回新点(random.nextInt(48),random . nextint(60));

}

/**

*等式()

*功能:判断两个点对象是否相等。

* @参数点

* @return布尔值

*/

公共布尔等于(点点){

返回this . x = = point . getx()& amp;& ampthis . y = = point . gety();

}

}

}