/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package tic.tac.toe;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Class to represent the TicTacToe gameboard
*
* @author wolf.posdorfer
* @version 16.06.2011
*/
public class GameBoard {
private int[][] _board;
private int _currentPlayer;
private int _winner;
public GameBoard() {
_board = new int[3][3];
for (int[] x : _board) {
Arrays.fill(x, Mark.BLANK.ordinal());
}
_currentPlayer = Mark.X.ordinal();
_winner = 0;
}
public boolean isGameFinished() {
return _winner != 0;
}
public int getWinner()
{
return _winner;
}
public Mark getMarkAtPos(int x, int y) {
return Mark.valueOf(_board[x][y]);
}
public Mark getCurrentPlayer() {
return Mark.valueOf(_currentPlayer);
}
public void placeMark(int x, int y) {
_board[x][y] = _currentPlayer;
if (didCurrentPlayerWin()) {
_winner = _currentPlayer;
}
if (isBoardFull() && _winner < 1) {
// Setting to Tie
_winner = -1;
}
_currentPlayer = _currentPlayer == 1 ? 2 : 1;
}
/**
* Checks if the Currentplayer has won the game
*
* @return current player won the game?
*/
private boolean didCurrentPlayerWin() {
for (int x = 0; x < 3; x++) {
if (_board[x][0] == _currentPlayer
&& _board[x][1] == _currentPlayer
&& _board[x][2] == _currentPlayer) {
return true;
}
}
for (int y = 0; y < 3; y++) {
if (_board[0][y] == _currentPlayer
&& _board[1][y] == _currentPlayer
&& _board[2][y] == _currentPlayer) {
return true;
}
}
if (_board[0][0] == _currentPlayer && _board[1][1] == _currentPlayer
&& _board[2][2] == _currentPlayer) {
return true;
}
if (_board[2][0] == _currentPlayer && _board[1][1] == _currentPlayer
&& _board[0][2] == _currentPlayer) {
return true;
}
return false;
}
/**
* Checks if the Board is Full
*
* @return board is full?
*/
private boolean isBoardFull() {
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
if (_board[x][y] == 0) {
return false;
}
}
}
return true;
}
/**
* Returns the winning positions in an arraylist of Pairs
* @return ArrayList<Pair> with 3 entries
*/
public Pair[] getWinningPositions()
{
ArrayList<Pair> liste = new ArrayList<Pair>();
if(_winner == -1)
{
// TIE
return null;
}
Mark m = Mark.valueOf(_winner);
for (int x = 0; x < 3; x++) {
if (_board[x][0] == _winner
&& _board[x][1] == _winner
&& _board[x][2] == _winner) {
new Pair(x, 0,m);
liste.add(new Pair(x, 0, m));
liste.add(new Pair(x, 1, m));
liste.add(new Pair(x, 2, m));
return liste.toArray(new Pair[3]);
}
}
for (int y = 0; y < 3; y++) {
if (_board[0][y] == _winner
&& _board[1][y] == _winner
&& _board[2][y] == _winner) {
liste.add(new Pair(0, y, m));
liste.add(new Pair(1, y, m));
liste.add(new Pair(2, y, m));
return liste.toArray(new Pair[3]);
}
}
if (_board[0][0] == _winner && _board[1][1] == _winner
&& _board[2][2] == _winner) {
liste.add(new Pair(0, 0, m));
liste.add(new Pair(1, 1, m));
liste.add(new Pair(2, 2, m));
return liste.toArray(new Pair[3]);
}
if (_board[2][0] == _winner && _board[1][1] == _winner
&& _board[0][2] == _winner) {
liste.add(new Pair(2, 0, m));
liste.add(new Pair(1, 1, m));
liste.add(new Pair(0, 2, m));
return liste.toArray(new Pair[3]);
}
return null;
}
/**
* Checks if the palced move is Valid
* @param x
* @param y
* @return
*/
public boolean isValidMove(Mark markplaced, int x , int y)
{
return _board[x][y] == 0 && _currentPlayer == markplaced.getValue();
}
}