Reputation: 161
Alright so I am making a simple Tic Tac Toe program. Right now I am working on checking where the mouse clicked, using MouseListener, and seeing in which 1 of 9 spaces the mouse clicked. I wanted to check to make sure that the rectangle checking was working so everytime the mouse clicked the console would display a String of 9 letters. The letters are e = empty x = X o = O. But it doesnt seem that the rectangle doesn't seem to contain any coordinates . Here is some snippets of code:
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]);
}
So here I check to see if the mouse clicked in 1 of the 9 spaces and I output the "game board" Here is part of TicTacToeLogic so you can have a better understanding:
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;
}
}
}
}
I can't seem to pinpoint what the problem is. When ever i print out board[n] it always comes up as a bunch of e's. Does it have something to do with me calling getWidth and getHeight in the constructor? Thanks in advanced,
Andrew
Upvotes: 1
Views: 648
Reputation: 143144
Your theory that this is caused by calling getWidth and getHeight in the constructor is a good one. You could verify this by checking with a debugger, or even just adding some println or logging statements to see what values those methods are returning.
If that is the problem (and I'm guessing it is) then you could fix it by moving your size calculations to a listener/method that fires on resize.
Upvotes: 2
Reputation: 40811
getWidth()
and getHeight()
will return 0 when you're in the constructor. Those values get set by the LayoutManager when the window gets laid out.
You need to calculate your bounds from within mouseClicked
.
Upvotes: 1