java贪吃蛇动不了
我按网上的一个网页写了一小部分 但是蛇跑不起来 求大神帮我看一下
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());
}
}
}
}