J2ME蛇游戏的实现
导入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();
}
}
}