java贪吃蛇动不了

wea111222333 2015-03-25 09:37:35
我按网上的一个网页写了一小部分 但是蛇跑不起来 求大神帮我看一下


package com.sgu.edu;

import java.awt.BorderLayout;

public class Board extends JFrame {

private JPanel contentPane;

private static final int Width=400; //窗口的宽度和高度
private static final int Height=400;
private static final int TileWidth=15; //每一格的宽度和高度
private static final int TileHeight=15; //在游戏在专门指每一个单元
private static final int Row=15; //游戏盘的行数和列数 Row是行 Column是列
private static final int Column=20;
private static final int XOffset=(Width-Column*TileWidth)/2; //当我们确定游戏盘大笑后
private static final int YOffset=(Height-Row*TileHeight)/2; //也就是蛇运动的区域,这个左上角的坐标叫
//XOffsethe YOffset,他就是左上角粉红色的点
private Snake mSnake; //蛇
private Board mBoard;
private Updater mUpdater; //刷新窗口让蛇动起来


/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Board frame = new Board();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});


}

/**
* Create the frame.
*/
public Board() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setSize(Width,Height);
setVisible(true);
//setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);

mSnake=new Snake(); //实例化蛇
mUpdater=new Updater(mBoard,mSnake);
mUpdater.start();

addWindowListener(new BoardHandler());
addKeyListener(new KeyHandler(mSnake));




}

public void paint(Graphics g){

drawDecoration(g);
drawSnake(g);
}

//画蛇的活动范围
public void drawDecoration(Graphics g){

g.setColor(Color.RED);
g.drawRect(XOffset, YOffset, Column*TileWidth, Column*TileHeight);
}

//画蛇
public void drawSnake(Graphics g){

g.setColor(Color.GREEN);
for(int i=0 ; i<mSnake.getLength() ; i++ ){
//获取蛇的某一节
Body body=mSnake.getBody(i);
//画出蛇的某一节
g.fillRect(body.col*TileWidth+XOffset, body.row*TileHeight+YOffset, TileWidth, TileHeight);
}
}

}

//关闭窗口
class BoardHandler extends WindowAdapter{

public void windowClosing(WindowEvent e){

System.exit(0);
}
}

//键盘监听
class KeyHandler extends KeyAdapter{

private Snake mSnake;
//操控蛇
public KeyHandler(Snake s){

mSnake=s;
}
//对案件进行响应
public void keyPressed(KeyEvent e){

switch(e.getKeyCode()){

case KeyEvent.VK_UP:
mSnake.setDirection(DIRECTION.UP);
break;
case KeyEvent.VK_DOWN:
mSnake.setDirection(DIRECTION.DOWN);
break;
case KeyEvent.VK_LEFT:
mSnake.setDirection(DIRECTION.LEFT);
break;
case KeyEvent.VK_RIGHT:
mSnake.setDirection(DIRECTION.RIGHT);
break;

}


}
}


package com.sgu.edu;

import java.util.ArrayList;
import java.util.List;

enum DIRECTION{

UP,DOWN,LEFT,RIGHT;
}

public class Snake {

private List<Body> mBody;
private DIRECTION mDirection;

//初始化蛇为4节身体 开始方向向右
public Snake(){

mBody=new ArrayList<Body>();
/*mBody.add(new Body(7,4));
mBody.add(new Body(7,3));
mBody.add(new Body(7,2)); //重置功能
mBody.add(new Body(7,1));
mDirection=DIRECTION.RIGHT;*/
reset();

}

//移动
public void move(Board b){

Body head;
Body headold=mBody.get(0); // 表示当前脑袋的对象
//根据方向定蛇头坐标
switch(mDirection)
{
case UP:
head=new Body(headold.row-1,headold.col);
break;
case DOWN:
head=new Body(headold.row+1,headold.col);
break;
case LEFT:
head=new Body(headold.row,headold.col-1);
break;
case RIGHT:
head=new Body(headold.row,headold.col+1);
break;
default:
head=new Body(0,0);
break;
}
mBody.add(0,head); //添加蛇头
mBody.remove(mBody.size()-1); //把尾巴移除



}

//转向
public void setDirection(DIRECTION d){

mDirection=d;
}

//重置
public void reset(){

mBody.clear();
mBody.add(new Body(7,4));
mBody.add(new Body(7,3));
mBody.add(new Body(7,2));
mBody.add(new Body(7,1));
mDirection=DIRECTION.RIGHT;
}

//获取蛇的某一节
public Body getBody(int index){

return mBody.get(index);
}

//获取蛇的长度
public int getLength(){

return mBody.size();
}






}


package com.sgu.edu;

public class Body {

public int row;
public int col;

public Body(int row , int col){

this.row=row;
this.col=col;
}

}


package com.sgu.edu;

public class Updater extends Thread {

private Board mBoard;
private Snake mSnake;

public Updater(Board b , Snake s){

mBoard=b;
mSnake=s;
}

public void run(){

while(true){

mSnake.move(mBoard);
mBoard.repaint();
try{
sleep(500); // 线程暂停500毫秒,
}catch(Exception e){
System.out.println(e.toString());
}
}
}

}
...全文
163 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧