gpt4 book ai didi

java - 蛇中的线程

转载 作者:行者123 更新时间:2023-11-30 06:49:46 27 4
gpt4 key购买 nike

我正在制作一款像贪吃蛇这样的游戏。我的“开始”按钮有问题。当我开始时,一切都运行良好,但如果我用按钮再次开始游戏,一条新蛇的移动速度会更快,并且每次使用按钮重新启动时,它都会比上一条移动得更快。我不知道代码有什么问题,有人可以解释我的错误吗?

// In Frame class
addButton(buttonPanel, "Start", event ->
{
counter = -1; // resets points counting
area.start(); // area is a JPanel variable in Frame class
area.snake();
});

// In JPanel class
public void start()
{
body.removeAll(body); // ArrayList with snake body elements
add();
body.get(0).setX(300);
body.get(0).setY(300);
repaint();
}

public void snake()
{
Runnable r = () ->
{
try {
while(!isCollided())
{
for(int a=body.size()-1; a>0 ;a--) // Moving elements
{
if(a>0)
{
body.get(a).setX(body.get(a-1).getX());
body.get(a).setY(body.get(a-1).getY());
}
}

body.get(0).move();
double a = Math.abs(((body.get(0).getCenterX())-(food.getRandX()+5)));
double b = Math.abs(((body.get(0).getCenterY())-(food.getRandY()+5)));
if((a<10) && (b<10)) // Eating and growing a snake
{
food.newFood();
add();
}

this.repaint();
Thread.sleep(waiting); // waiting is final int = 100;
}
if(isCollided()) return;
}
catch (InterruptedException e) { return;}

};
Thread t = new Thread(r);
t.start();
}

最佳答案

看起来就像在每次调用 snake() 时,您都会创建一个移动蛇的新线程。我看不到它们被处置在哪里。

解决此问题的方法之一是仅使用一个“移动者”线程。按下按钮后,您可以重置字段(包括蛇)。

这里的技巧是确保你的数据结构(代表蛇和字段)不会同时被两个线程修改(因为你将有一个移动线程和一个 UI 线程处理按钮单击重置该字段)。

可以使用同步来克服这个困难。

private final Object monitor = new Object();

然后在你的移动线程中

while (!isCollided()) {
synchronized (monitor) {
// make all the modifications to the shared data (i.e. the field)
}
...
Thread.sleep(...);
}

并在“新游戏”按钮中单击处理程序:

synchronized (monitor) {
// reset the shared data (the field)
}

重要的是确保synchronized下的代码快速运行。如果您的移动器线程获取了锁,然后在其中工作了几秒钟,那么您的按钮单击处理程序将必须等待所有这些秒,并且您的 UI 将卡住。

关于java - 蛇中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43054457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com