2011-10-17 39 views
1

好吧,我正在制作一个简单的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]); 

    } 

所以我在这里检查,看看是否鼠标在9位和I输出“游戏板”的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; 
      } 
     } 
    } 
} 

我似乎无法找出问题所在。当我打印板[n]时,它总是以一堆e的形式出现。它是否与我在构造函数中调用getWidth和getHeight有关?在先进的感谢,

安德鲁

回答

1

getWidth() and getHeight()将在构造函数中返回0。窗口布局时,这些值由LayoutManager设置。

您需要计算从mouseClicked以内的范围。

+0

谢谢,帮助我解决了问题 –

2

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

如果这是问题(我猜测它是这样),那么你可以通过移动你的尺寸计算到一个侦听器/方法来调整它的大小。

+0

好吧我会尝试 –

相关问题