Java sleep()和GUI

Java sleep()和GUI,java,multithreading,swing,user-interface,sleep,Java,Multithreading,Swing,User Interface,Sleep,我只是在论坛上搜索了一下,但找不到任何对我有帮助的东西。。我的问题是:我试图创建一个小游戏,在这个游戏中,你必须在你朋友的背上行走才能获胜,当其中一个达到这个目标时,游戏结束。。 下面是我用来解释我的问题的简单代码 我的应用程序中有3个类(属于包代码): 主要 游戏 位置 我的应用程序中有9.png(属于包img): 0.png j1_0.png j1_1.png j1_2.png j1_3.png j2_0.png j2_1.png j2_2.png j2_3.png 两个包都位于sr

我只是在论坛上搜索了一下,但找不到任何对我有帮助的东西。。我的问题是:我试图创建一个小游戏,在这个游戏中,你必须在你朋友的背上行走才能获胜,当其中一个达到这个目标时,游戏结束。。 下面是我用来解释我的问题的简单代码

我的应用程序中有3个类(属于包代码):

  • 主要

  • 游戏

  • 位置

我的应用程序中有9.png(属于包img):

  • 0.png
  • j1_0.png
  • j1_1.png
  • j1_2.png
  • j1_3.png
  • j2_0.png
  • j2_1.png
  • j2_2.png
  • j2_3.png
两个包都位于src根目录下

头等舱:

package code;

public class Main{

    public static Game game;

    public static void main(String[] args){

        game = new Game(8, 8);

    }

}
秒级:

package code;

import javax.swing.JPanel;
import javax.swing.JLabel;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Game extends JFrame{

    private Position j1, j2;
    private JPanel panel;
    private JLabel[][] grid;
    private int largeur, hauteur;

    public Game(int hauteur, int largeur){ // >= 2

        super("Rattrape l'autre");
        this.largeur = largeur;
        this.hauteur = hauteur;
        this.panel = new JPanel(new GridBagLayout());
        this.add(this.panel);
        this.grid = new JLabel[largeur][hauteur];
        int x1 = (int) (Math.random() * largeur), y1 = (int) (Math.random() * hauteur), x2, y2;
        do{
            x2 = (int) (Math.random() * largeur);
            y2 = (int) (Math.random() * hauteur);
        }while(x2 == x1 && y2 == y1);
        this.j1 = new Position(x1, y1, (int) (Math.random() * 4));
        this.j2 = new Position(x2, y2, (int) (Math.random() * 4));
        updatePanel();
        this.setResizable(false);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
        this.addKeyListener(new KeyListener(){

            @Override
            public void keyPressed(KeyEvent e){

                boolean over = false;
                if(e.getKeyCode() == KeyEvent.VK_Z){
                    if(j1.getY() != 0 && !(j1.getY() == j2.getY() + 1 && j1.getX() == j2.getX())){
                        j1.goesUp();
                    }else if(j2.getDirection() == 0 && j1.getY() == j2.getY() + 1 && j1.getX() == j2.getX()){
                        over = true;
                    }
                    j1.turnUp();
                }else if(e.getKeyCode() == KeyEvent.VK_D){
                    if(j1.getX() != largeur - 1 && !(j1.getX() == j2.getX() - 1 && j1.getY() == j2.getY())){
                        j1.goesRight();
                    }else if(j2.getDirection() == 1 && j1.getX() == j2.getX() - 1 && j1.getY() == j2.getY()){
                        over = true;
                    }
                    j1.turnRight();
                }else if(e.getKeyCode() == KeyEvent.VK_S){
                    if(j1.getY() != hauteur - 1 && !(j1.getY() == j2.getY() - 1 && j1.getX() == j2.getX())){
                        j1.goesDown();
                    }else if(j2.getDirection() == 2 && j1.getY() == j2.getY() - 1 && j1.getX() == j2.getX()){
                        over = true;
                    }
                    j1.turnDown();
                }else if(e.getKeyCode() == KeyEvent.VK_Q){
                    if(j1.getX() != 0 && !(j1.getX() == j2.getX() + 1 && j1.getY() == j2.getY())){
                        j1.goesLeft();
                    }else if(j2.getDirection() == 3 && j1.getX() == j2.getX() + 1 && j1.getY() == j2.getY()){
                        over = true;
                    }
                    j1.turnLeft();
                }
                if(e.getKeyCode() == KeyEvent.VK_UP){
                    if(j2.getY() != 0 && !(j2.getY() == j1.getY() + 1 && j2.getX() == j1.getX())){
                        j2.goesUp();
                    }else if(j1.getDirection() == 0 && j2.getY() == j1.getY() + 1 && j2.getX() == j1.getX()){
                        over = true;
                    }
                    j2.turnUp();
                }else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
                    if(j2.getX() != largeur - 1 && !(j2.getX() == j1.getX() - 1 && j2.getY() == j1.getY())){
                        j2.goesRight();
                    }else if(j1.getDirection() == 1 && j2.getX() == j1.getX() - 1 && j2.getY() == j1.getY()){
                        over = true;
                    }
                    j2.turnRight();
                }else if(e.getKeyCode() == KeyEvent.VK_DOWN){
                    if(j2.getY() != hauteur - 1 && !(j2.getY() == j1.getY() - 1 && j2.getX() == j1.getX())){
                        j2.goesDown();
                    }else if(j1.getDirection() == 2 && j2.getY() == j1.getY() - 1 && j2.getX() == j1.getX()){
                        over = true;
                    }
                    j2.turnDown();
                }else if(e.getKeyCode() == KeyEvent.VK_LEFT){
                    if(j2.getX() != 0 && !(j2.getX() == j1.getX() + 1 && j2.getY() == j1.getY())){
                        j2.goesLeft();
                    }else if(j1.getDirection() == 3 && j2.getX() == j1.getX() + 1 && j2.getY() == j1.getY()){
                        over = true;
                    }
                    j2.turnLeft();
                }
                updatePanel();
                if(over){
                    end();
                }

            }

            @Override
            public void keyReleased(KeyEvent e){}

            @Override
            public void keyTyped(KeyEvent e){}

        });

    }

    public void updatePanel(){

        GridBagConstraints c = new GridBagConstraints();
        this.panel.removeAll();
        for(int x = 0; x < largeur; x++){
            for(int y = 0; y < hauteur; y++){
                if(x == j1.getX() && y == j1.getY()){
                    this.grid[x][y] = new JLabel(new ImageIcon(Main.class.getResource("/img/j1_" + j1.getDirection() + ".png")));
                }else if(x == j2.getX() && y == j2.getY()){
                    this.grid[x][y] = new JLabel(new ImageIcon(Main.class.getResource("/img/j2_" + j2.getDirection() + ".png")));
                }else{
                    this.grid[x][y] = new JLabel(new ImageIcon(Main.class.getResource("/img/0.png")));
                }
                c.gridx = x;
                c.gridy = y;
                this.panel.add(this.grid[x][y], c);
            }
        }
        this.panel.revalidate();

    }

    public void end(){

        try{
            Thread.sleep(1000);
        }catch(InterruptedException e){}
        Main.game.dispose();


    }

}
最后,我的问题是:

例如,当玩家1向左看时,他正好在玩家2的上方,而玩家2向下看时,如果玩家1向下移动,它应该赢得比赛,但在显示玩家1向下看后

我尝试了大量的输入o测试,它似乎可以工作,因为当over设置为true时,程序进入updatePanel(),然后启动end(),它应该休眠1秒,然后处理帧。。但它没有,它确实在最后启动了updatePanel(),它更新了j1的值(正如前面的算法,我指的是分配键盘输入函数值的算法,让他向下看),但它没有显示新的网格,所以,我迷失了:p

谢谢你的建议,我希望你能理解这个问题,加上算法简单,不会太长,所以你们应该不难理解:)

应休眠1秒,然后处理框架

您不能在
事件调度线程(EDT)
上使用
Thread.sleep()
。这将导致GUI休眠,这意味着它不会被重新绘制

相反,您需要使用单独的线程,可能是SwingWorker。SwingWorker将允许您使用Thread.sleep(),然后您可以在完成睡眠后发布结果


阅读Swing教程中的章节,了解更多信息和示例。

您写道:另外,算法很简单,不会太长,所以理解起来应该不难。呃,错误的评估:你在上面放了相当多的代码,有很长的if/else链,还有带if的嵌套循环。。。还有大量的局部变量。这样的代码很难读懂。要消化这一点需要付出相当大的努力,然后才能弄清楚你到底需要帮助解决什么问题。你看,这里不是“我们为你调试整个程序”的服务。也许其他人有更多的时间/动机,但如果只有下票,不要惊讶。
加上算法很简单
-算法不相关。执行
updatePanel()
方法时会出现问题。因此,当你在论坛上发布问题时,你会发布代码来演示问题。因此,您需要隔离问题。在这种情况下,只需调用“updatePanel()”方法即可替换所有KeyListener逻辑。换句话说,忘记玩游戏,只是测试游戏结束后会发生什么。这被称为一个。对每个问题使用
SSCCE
,而不是核心代码转储。
package code;

public class Position{

    private int x, y, direction;

    public Position(int x, int y, int direction){

        this.x = x;
        this.y = y;
        this.direction = direction;

    }

    public int getX(){

        return this.x;

    }

    public int getY(){

        return this.y;

    }

    public int getDirection(){

        return this.direction;

    }

    public void goesUp(){

        this.y--;

    }

    public void goesRight(){

        this.x++;

    }

    public void goesDown(){

        this.y++;

    }

    public void goesLeft(){

        this.x--;

    }

    public void turnUp(){

        this.direction = 0;

    }

    public void turnRight(){

        this.direction = 1;

    }

    public void turnDown(){

        this.direction = 2;

    }

    public void turnLeft(){

        this.direction = 3;

    }

}