public void playGame() throws Exception {
		Position updatedCell;
		while (!boardState.isGameOver()) {
			if (boardState.getTurn() == TicTacToeBoard.PLAYER_X) {
				updatedCell = playerX.getNextMove(boardState);
				if (isLegalPosition(updatedCell)) {
					boardState.setState(updatedCell.row, updatedCell.col,
							TicTacToeBoard.X);
					cellGrid[updatedCell.row*TicTacToeBoard.SIZE+updatedCell.col].setChosen(true);
				} else {
					throw new Exception("Illegal board position returned");
				}
				boardState.setTurn(TicTacToeBoard.PLAYER_O);
			} else {
				updatedCell = playerO.getNextMove(boardState);
				if (isLegalPosition(updatedCell)) {
					boardState.setState(updatedCell.row, updatedCell.col,
							TicTacToeBoard.O);
					cellGrid[updatedCell.row*TicTacToeBoard.SIZE+updatedCell.col].setChosen(true);
				} else {
					throw new Exception("Illegal board position returned");
				}
				boardState.setTurn(TicTacToeBoard.PLAYER_X);
			}

			displayBoard(boardState);
			turnLabel.setText(turnString[boardState.getTurn()]);
		}

		if (boardState.isWin(TicTacToeBoard.PLAYER_X)) {
			turnLabel.setText("Player X won");
		} else if (boardState.isWin(TicTacToeBoard.PLAYER_O)) {
			turnLabel.setText("Player O won");
		} else {
			// Draw
			turnLabel.setText("Draw");
		}
	}