java - 检查点是否包含在矩形内时出错

标签 java logic

好吧,我正在制作一个简单的 Tic Tac Toe 程序。现在我正在检查鼠标点击的位置,使用 MouseListener,并查看鼠标点击了 9 个空间中的哪 1 个。我想检查以确保矩形检查正常工作,因此每次单击鼠标时,控制台都会显示一个由 9 个字母组成的字符串。字母是e = empty 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]);

    }

所以我在这里检查鼠标是否在 9 个空格中的 1 个中单击,然后输出“游戏板”这是 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;
            }
        }
    }
}

我似乎无法确定问题所在。当我打印出 board[n] 时,它总是以一堆 e 的形式出现。跟我在构造函数中调用getWidth和getHeight有关系吗?提前致谢,

安德鲁

最佳答案

您认为这是由在构造函数中调用 getWidth 和 getHeight 引起的,这是一个很好的理论。您可以通过使用调试器进行检查来验证这一点,或者甚至只需添加一些 println 或日志记录语句来查看这些方法返回的值。

如果这是问题所在(我猜是),那么您可以通过将大小计算移至在调整大小时触发的监听器/方法来解决此问题。

关于java - 检查点是否包含在矩形内时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7796466/

相关文章:

java - 将数据从 Android 应用连接并插入到预先存在的 MS SQL 数据库

java - Android SQL 数据库组织

node.js - ".use"在SuperAgent的每个请求上添加逻辑的方法

prolog - 在 Prolog 中定义 Material 条件

c++ - 如何在 C++ 中最好地实现 DPLL?

c++ - 如何实现基于关系矩阵的逻辑

java - RxJava : observeOn, subscribeOn, and doFinally, IO和UI线程切换

java - Delayer 与 Splitter 一起,消息不串行处理

java - 为什么这个带有赋值和相等检查的 if 语句评估为假?

java - 使用JDK 7编译Java 6源文件 : pros and cons