2016-11-12 3 views
-1

Я только что искал на форуме, но я не мог найти ничего, что помогло бы мне. Моя проблема в следующем: я пытался создать небольшую игру, в которой вы должны ходить прямо в ваш друг вернулся, чтобы выиграть, игра заканчивается, когда один из них достигает этого. Вот простой код, который я сделал, чтобы объяснить свою проблему.Thread.sleep() и GUI

У меня есть 3 класса в моем приложении (которые входят в код пакета):

  • Главная

  • Gam е

  • Позиция

У меня есть 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(); 


    } 

} 

Третий класс:

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 смотрит вниз.

Я пробовал много ввода o test, и кажется, что он работает, потому что когда over установлен в true, тогда программа переходит в updatePanel(), а затем запускает end(), который должен спать в течение 1 секунды, а затем утилизировать кадр .. но он этого не делает, он запускает updatePanel() в конце, он обновляет значение j1 (как предыдущий алгоритм, я имею в виду тот, который присваивает значения в функции ввода с клавиатуры, заставлял его смотреть вниз), но он не отображает новую сетку, поэтому я потерян: p

Спасибо, что посоветуете. Надеюсь, у вас возникла проблема, плюс алгоритм прост и не так уж и длинный, поэтому вам не должно быть тяжело ребята, чтобы это понять)

+1

Вы писали: * плюс алгоритм прост и не настолько длинный, поэтому его не должно быть трудно понять *. Err, неправильная оценка: у вас есть довольно много кода там, с ** длинными длинными ** if/else цепями и вложенными циклами с if ... и тонной локальными переменными. Такой код ** трудно ** читать. Это потребует ** значительных усилий, чтобы переварить это, и затем понять, с какой именно проблемой вы хотите помочь. Понимаете, это не услуга «Мы отлаживаем вашу всю программу для вас» здесь. Может быть, у какого-то другого человека больше времени/мотивации, но не удивляйтесь, если появятся только – GhostCat

+0

downvotes. – GhostCat

+0

'плюс алгоритм прост - алгоритм не имеет значения. Проблемы возникают при выполнении метода 'updatePanel()'. Поэтому, когда вы публикуете вопрос на форуме, вы отправляете код, который демонстрирует проблему. Поэтому вам нужно изолировать проблему. В этом случае вся ваша логика KeyListener может быть заменена простым вызовом метода updatePanel(). Другими словами, забыть о игре в игру, но просто проверить, что происходит, когда игра закончена. Это называется [SSCCE] (http://sscce.org/). Используйте «SSCCE» с каждым вопросом, а не с базовым дампом вашего кода. – camickr

ответ

0

должен спать в течение 1 секунды, а затем удалять рамку.

Вы не можете использовать Thread.sleep() на Event Dispatch Thread(EDT). Это заставит графический интерфейс спать, что означает, что он не будет перекрашен.

Вместо этого вам нужно использовать отдельную тему, возможно, SwingWorker. SwingWorker позволит вам использовать Thread.sleep(), а затем вы можете публиковать результаты, когда закончите спать.

Для получения дополнительной информации и примеров ознакомьтесь с разделом из учебника Swing по телефону Concurrency.