所以我为我的课程编写了一个可怜的'Snake'克隆。我们(模糊地)指示我们应该如何构建程序,在测试我的代码后,我认为actionPerformed将无法正常工作。
这里有一些似乎没有正常工作的测试代码,我会尝试解释什么不起作用。
public static void main(String[] args) {
Game Snake = new Game(20, 20);
Canvas p = new Canvas(Snake, 20);
Snake.setUpdatable(p);
Snake.setFruit(new Fruit(10, 15));
System.out.println(Snake.getSnake().getPieces());
Snake.actionPerformed(null);
System.out.println(Snake.getSnake().getPieces());
Snake.actionPerformed(null);
System.out.println(Snake.getSnake().getPieces());
}
上面的代码应该用20x20画布创建一个新的蛇游戏,它由actionPerformed方法更新。
在蛇中,蛇从一个区块开始并长到三个,之后只有在蛇消耗水果后它才会生长。
这是actionPerformed方法
public void actionPerformed(ActionEvent ae) {
if (!continue) {
return;
} else {
this.Snake.move();
if (this.Snake.collides(this.fruit) == true) {
Snake.grow();
this.setFruit(new Fruit(new Random().nextInt(width), new Random().nextInt(height)));
}
if (this.Snake.collidesWithItself() == true) {
continue = false;
}
this.setDelay(500); //Timer
this.updatable.update();//updates ui
}
}
actionListener在Game类的构造函数的末尾添加为:
addActionListener(this);
我为启动实际事件的Game类声明了我的变量。现在它完美地工作,直到我尝试从主方法再次回忆动作:
System.out.println(Snake.getSnake().getPieces());
Snake.actionPerformed(null);
System.out.println(Snake.getSnake().getPieces());
Snake.actionPerformed(null);
System.out.println(Snake.getSnake().getPieces());
Snake.actionPerformed(null);
System.out.println(Snake.getSnake().getPieces());
它打印:(蛇的每个槽的X,Y坐标 - 蛇默认向南行进)
[(10,10)] //CORRECT - before call
[(10,10), (10,11)] //CORRECT - the Snake.actionPerformed(null) call
[(10,10), (10,11)] //NOPE
[(10,10), (10,11)] //NOPE
而不是:
[(10,10)]
[(10,10), (10,11)]
[(10,10), (10,11), (10,12)]
[(10,11), (10,12), (10,13)]
为什么每当我尝试循环actionPerformed时它甚至不会改变蛇的碎片的坐标?我很抱歉,如果我的问题很荒谬,我是一个新手,我已经尝试了很多东西,但我无法理解这一点。