2016-11-12 42 views
-1

我刚刚在论坛上搜索,但我找不到任何帮助我..我的问题是以下几点:我试图创建一个小游戏,你必须在你的朋友为了赢得胜利,游戏结束时,其中一个达到此目的。 这里有一个简单的代码,我用来解释我的问题Thread.sleep()和GUI

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

  • 主要

  • 邯Ë

  • 位置

我在我的应用程序9巴纽(属于在包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(); 


    } 

} 

第三类:

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; 

    } 

} 

最后,我的问题,这是一个:

我想,例如,当玩家1看起来左,他只是在播放器2的顶部,当玩家2向下看时,如果玩家1向下移动,则应该赢得游戏,但在玩家1向下看之后。

我试了很多输入测试,它似乎工作,因为当over设置为true,然后程序进入updatePanel(),然后它启动结束()应睡1秒,然后处置框架..但它没有,它确实在最后启动updatePanel(),它更新了j1的值(正如前面的算法,我是指在键盘输入函数中赋值的那个,使他往下看),但它并没有显示新格的话,我迷路了:p

感谢的意见,我希望你有问题,再加上算法简单,没有那么长,因此不应该对你来说比较难家伙了解它:)

+1

你写道:*加上算法很容易,不那么长,所以它不应该很难理解它*。错误的,错误的评估:你在那里放了大量的代码,用**冗长的if/else链,用if和...嵌套循环以及大量局部变量。这样的代码很难读**。这需要花费相当多的努力来消化,然后确定你需要帮助的问题。你看,这不是一个“我们为你调试你的整个程序”服务。也许一些其他人有更多的时间/动机,但不要惊讶,如果只有 – GhostCat

+0

downvotes进来。 – GhostCat

+0

'加上算法很容易' - 算法是无关紧要的。执行'updatePanel()'方法时会出现问题。因此,当您在论坛上发布问题时,您会发布证明问题的代码。所以你需要隔离问题。在这种情况下,只需调用“updatePanel()”方法即可取代所有KeyListener逻辑。换句话说,忘记玩游戏,只是测试游戏结束时会发生什么。这被称为[SSCCE](http://sscce.org/)。每个问题都使用一个'SSCCE',而不是代码的核心转储。 – camickr

回答

0

应该睡1秒,然后处理帧。

您不能在Event Dispatch Thread(EDT)上使用Thread.sleep()。这将导致GUI进入睡眠状态,这意味着它不会重新绘制。

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

阅读有关Concurrency的Swing教程中的部分以获取更多信息和示例。