Ошибка при проверке, содержится ли точка в прямоугольнике - PullRequest
1 голос
/ 17 октября 2011

Хорошо, поэтому я делаю простую программу Tic Tac Toe. Сейчас я работаю над тем, чтобы проверить, где щелкнула мышь, с помощью MouseListener и выяснил, в каком из 9 пробелов щелкнула мышь. Я хотел убедиться, что проверка прямоугольника работает, поэтому каждый раз, когда мышь щелкает консоль, отображается строка из 9 букв. Буквы e = пустые x = X o = O. Но кажется, что прямоугольник не содержит каких-либо координат. Вот некоторые фрагменты кода:

package com.blackattack.tictactoe;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JPanel;

public class TicTacToePanel extends JPanel implements MouseListener {

    Graphics2D g2d;
    Rectangle[] bounds = new Rectangle[9];
    TicTacToeLogic board = new TicTacToeLogic();
    int STATE = 0;
    final int PLAYING = 0;
    final int LOSS = 1;
    final int WIN = 2;
    Win w = new Win(false, "e");



    public TicTacToePanel() {
        super();
        addMouseListener(this);

        bounds[0] = new Rectangle(0, 0, getWidth()/3, getHeight()/3);
        bounds[1] = new Rectangle(getWidth()/3, 0, getWidth()/3, getHeight()/3);
        bounds[2] = new Rectangle((getWidth()/3)*2, 0, getWidth()/3, getHeight()/3);

        bounds[3] = new Rectangle(0, getHeight()/3, getWidth()/3, getHeight()/3);
        bounds[4] = new Rectangle(getWidth()/3, getHeight()/3, getWidth()/3, getHeight()/3);
        bounds[5] = new Rectangle((getWidth()/3)*2, getHeight()/3, getWidth()/3, getHeight()/3);

        bounds[6] = new Rectangle(0, getHeight()/3, (getWidth()/3)*2, getHeight()/3);
        bounds[7] = new Rectangle(getWidth()/3, (getHeight()/3)*2, getWidth()/3, getHeight()/3);
        bounds[8] = new Rectangle((getWidth()/3)*2, (getHeight()/3)*2, getWidth()/3, getHeight()/3);
    }
//paintComponent would be here
@Override
    public void mouseClicked(MouseEvent e) {
        int x = getX();
        int y = getY();
        if(bounds[0].contains(x, y)) {
            board.changeState(0, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        if(bounds[1].contains(x, y)) {
            board.changeState(1, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        if(bounds[2].contains(x, y)) {
            board.changeState(2, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        if(bounds[3].contains(x, y)) {
            board.changeState(3, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        if(bounds[4].contains(x, y)) {
            board.changeState(4, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        if(bounds[5].contains(x, y)) {
            board.changeState(5, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        if(bounds[6].contains(x, y)) {
            board.changeState(6, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        if(bounds[7].contains(x, y)) {
            board.changeState(7, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        if(bounds[8].contains(x, y)) {
            board.changeState(8, "x");
            w = board.isWin();
            board.aiPlayerChoose();
            w = board.isWin();
        }
        System.out.println(board.board[0] + " " + board.board[1] + " " + board.board[2] + " " + board.board[3] + " " + board.board[4] + " " + board.board[5] + " " + board.board[6] + " " + board.board[7] + " " + board.board[8]);

    }

Итак, здесь я проверяю, щелкнула ли мышь в 1 из 9 пробелов, и вывожу «игровую доску». Вот часть TicTacToeLogic, чтобы вы могли лучше понять:

public class TicTacToeLogic {

    String[] board = { "e", "e", "e", "e", "e", "e", "e", "e", "e" };

    public TicTacToeLogic() {

    }

    public void changeState(int pos, String val) {
        board[pos] = val;
    }

    public void aiPlayerChoose() {
        boolean ready = true;
        while (ready) {
            Random r = new Random();
            int which = r.nextInt(8);
            if (board[which].equals("e")) {
                board[which] = "o";
                ready = false;
            }
        }
    }
}

Я не могу точно определить, в чем проблема. Всякий раз, когда я распечатываю доску [n], она всегда выглядит как куча электронных. Это как-то связано со мной, вызывая getWidth и getHeight в конструкторе? Спасибо заранее,

Andrew

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Ваша теория, что это вызвано вызовом getWidth и getHeight в конструкторе, является хорошей.Вы можете убедиться в этом, проверив с помощью отладчика или даже просто добавив несколько операторов println или logging, чтобы увидеть, какие значения возвращают эти методы.

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

1 голос
/ 17 октября 2011

getWidth() и getHeight() вернут 0, когда вы находитесь в конструкторе. Эти значения устанавливаются LayoutManager при размещении окна.

Вам необходимо рассчитать свои границы в пределах mouseClicked.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...