0
我正在用java編寫一個簡單的TicTacToe遊戲。 基本實現完成。 Player vs Player是完美無缺的。模擬鼠標點擊板內(JPanel)
但現在,當我實施AI時,我遇到了一個問題。 我已經計算了計算機的移動,但是我無法讓計算機單擊JPanel上的[使用(x,y)座標]位置。
我見過機器人類,但它沒有點擊所需的地方,似乎點擊窗外。
下面是代碼,它借鑑了JPanel中板:
private class Board extends JPanel{
/**
*
*/
private static final long serialVersionUID = 1L;
public Board(){
this.setSize(new Dimension(board_width, board_height));
this.setPreferredSize(new Dimension(board_width, board_height));
this.setBackground(new Color(0x84ACFF));
this.setOpaque(true);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
//g.setColor(new Color(0xf9d1af));
g.setColor(Color.white);
g.drawLine((board_width/3), 0, (board_width/3), board_height);
g.drawLine((board_width/3)*2, 0, (board_width/3)*2, board_height);
g.drawLine(0, (board_height/3), (board_width), (board_height/3));
g.drawLine(0, (board_height/3)*2, (board_width), (board_height/3)*2);
g.finalize();
}
}
而這裏的MouseListener我與JPanel的使用:
@Override
public void mousePressed(MouseEvent e) {
Graphics g = this.getGraphics();
int X = e.getX();
int Y = e.getY();
//JOptionPane.showMessageDialog(null, e.getXOnScreen()+":"+e.getYOnScreen());
int block_x = board_width/3;
int block_y = board_height/3;
X = X/block_x;
Y = Y/block_y;
//For array Assignment
Click_X = Y;
Click_Y = X;
//Keep copy of the originals
Orig_X = X;
Orig_Y = Y;
//------------------------------------------
// Assign to array & Draw
//------------------------------------------
if (computer){
if (start.equals("Computer")){
if (game_board[Click_X][Click_Y] != ' ') return;
moves++;
game_board[Click_X][Click_Y] = Cross;
drawCross(((X+1)*block_x)+25, ((Y+1)*block_y)+25, 50, 50, g);
dcsn = new Decision(game_board, moves);
}
else{
if (game_board[Click_X][Click_Y] != ' ') return;
moves++;
game_board[Click_X][Click_Y] = Nought;
drawNought(((X+1)*block_x), ((Y+1)*block_y), 50, 50, g);
dcsn = new Decision(game_board, moves);
}
}
else{
if (start.equals("Human")){
if (game_board[Click_X][Click_Y] != ' ') return;
moves++;
game_board[Click_X][Click_Y] = Cross;
drawCross(((X+1)*block_x)+25, ((Y+1)*block_y)+25, 50, 50, g);
dcsn = new Decision(game_board, moves);
}
else{
if (game_board[Click_X][Click_Y] != ' ') return;
moves++;
game_board[Click_X][Click_Y] = Nought;
drawNought(((X+1)*block_x), ((Y+1)*block_y), 50, 50, g);
dcsn = new Decision(game_board, moves);
}
}
switch (dcsn.gameOver()){
case "X":
JOptionPane.showMessageDialog(null,"X has won!");
break;
case "O":
JOptionPane.showMessageDialog(null,"O has won!");
break;
case "draw":
JOptionPane.showMessageDialog(null,"Draw!");
break;
case " ":
break;
}
switchTurn();
}
現在我該如何使電腦點擊計算的位置? 任何想法?
這裏是鏈接到完整的源代碼: Download Source
否則很難重現的情況。
1)你爲什麼不只需添加一個MouseListener的每一個細胞?會讓事情變得更容易和更清晰(你不需要機器人類)。 2)請考慮發佈[MCVE](http://stackoverflow.com/help/mcve)(或[SSCCE](http://sscce.org/)),我無法重現您的問題。 3)不應該'Click_X = Y; Click_Y = X;'是'Click_X = X; Click_Y = Y;'? –
你可以創建一個'assignToArrayAndDraw()'方法,你可以通過'mousePressed()'方法或者你的AI調用。 –
@LuxxMiner:不,Click_X = Y是可以的,因爲我需要[(00),(01),(02)]格式的內容,用於存儲十字節/十進制數組。 – Priyabrata