2011-10-17 37 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

好吧我會嘗試 –

相關問題