Я только что искал на форуме, но я не мог найти ничего, что помогло бы мне. Моя проблема в следующем: я пытался создать небольшую игру, в которой вы должны ходить прямо в ваш друг вернулся, чтобы выиграть, игра заканчивается, когда один из них достигает этого. Вот простой код, который я сделал, чтобы объяснить свою проблему.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
Спасибо, что посоветуете. Надеюсь, у вас возникла проблема, плюс алгоритм прост и не так уж и длинный, поэтому вам не должно быть тяжело ребята, чтобы это понять)
Вы писали: * плюс алгоритм прост и не настолько длинный, поэтому его не должно быть трудно понять *. Err, неправильная оценка: у вас есть довольно много кода там, с ** длинными длинными ** if/else цепями и вложенными циклами с if ... и тонной локальными переменными. Такой код ** трудно ** читать. Это потребует ** значительных усилий, чтобы переварить это, и затем понять, с какой именно проблемой вы хотите помочь. Понимаете, это не услуга «Мы отлаживаем вашу всю программу для вас» здесь. Может быть, у какого-то другого человека больше времени/мотивации, но не удивляйтесь, если появятся только – GhostCat
downvotes. – GhostCat
'плюс алгоритм прост - алгоритм не имеет значения. Проблемы возникают при выполнении метода 'updatePanel()'. Поэтому, когда вы публикуете вопрос на форуме, вы отправляете код, который демонстрирует проблему. Поэтому вам нужно изолировать проблему. В этом случае вся ваша логика KeyListener может быть заменена простым вызовом метода updatePanel(). Другими словами, забыть о игре в игру, но просто проверить, что происходит, когда игра закончена. Это называется [SSCCE] (http://sscce.org/). Используйте «SSCCE» с каждым вопросом, а не с базовым дампом вашего кода. – camickr