*
# 这里是控制蛇移动的代码
public void move_on()
{
paint p1=new paint();
Fruit fruit=new Fruit();
Snake snake=new Snake();
Move read=new Move();
/*
* 对第一个元素即蛇头进行判断,根据所指方向对x,y坐标进行操作
* 完毕后重绘界面,达到动态移动效果
*/
new Thread(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
while(Snake.life){
switch (Model.snake.get(0).direction) {
case 8:
Model.snake.get(0).point.y+=General.y_height;
p1.repaint();
break;
case 2:
Model.snake.get(0).point.y-=General.y_height;
break;
case 4:
Model.snake.get(0).point.x-=General.x_width;
break;
case 6:
Model.snake.get(0).point.x+=General.x_width;
break;
default:
break;
}
System.err.println(Model.snake.get(0).point.x+" "+Model.snake.get(0).point.y);
//调用绘制方法进行重绘
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// TODO 自动生成的方法存根
p1.repaint();
//对蛇体进行移动操作,即每一个节点都到了前一个节点的位置上
for(int i=1;i<Model.snake.size();i++)
{
Model.snake.get(i).direction=Model.snake.get(i-1).direction;
Model.snake.get(i).point=Model.snake.get(i-1).point;
}
/* 进行完移动操作之后判断一下是否吃到果子
* 如果被吃掉,则把果子的位置和赋值给read,将原头结点的方向赋值给read
* 最后将read插入snake头结点
*/
if(fruit.isEaten())
{
read.point=fruit.location;
read.direction=Model.snake.get(0).direction;
Model.snake.offerFirst(read);
p1.repaint();
}
}//end swing_run
});
/*
* 判断是否撞墙或吃到身体(结束游戏)
*/
snake.isAlive();
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO: handle exception
}
move_on();
}
}
}).start();
}//end move_on`
# 这里是绘制蛇和果子的方法
public void paintComponent(Graphics g)
{
super.paintComponent(g);
System.err.println("调用绘制方法");
snake_paint.drawSnake(g);
/*
* 当蛇长为1(即刚初始化游戏)的时候
* 或判断果子被吃掉后
* 才能绘制果子
*/
if(Snake.Long==1||fruit_paint.isEaten())
{
fruit_paint.drawFruit(g);
}
public void drawSnake(Graphics g)**
{
super.paintComponent(g);
Model model=new Model();
g.setColor(Color.BLACK);
System.err.println("调用绘制蛇体方法");
for(Move r:model.snake)
g.fillRect(r.point.x,r.point.y, General.x_width, General.y_height);
}`
public void drawFruit(Graphics g)
{
g.setColor(Color.RED);
g.fillRect(location.x, location.y, General.x_width,General.y_height);
}
小弟现在面临的问题是:1.绘制方法调用了,但是面板毫无动静,依然是第一次值的位置。看了一下断点和输出,值是传给了绘制方法的。
是不是界面刷新问题?在move_on方法里面新建了一个线程,不知道用对没。
2.有时候值会大于定下的边界(y=700),而继续增加一点,比如到了750才停下,是不是线程冲突的问题?
3.,除了第一次调用绘制方法的时间正确以外,其他的时间都不对,不是每一个switch判定之后马上就调用。而是在判定游戏结束(蛇头位置大于容器边界)之后一直调用。
欢迎选择我的课程,让我们一起见证您的进步~~