class TicTacToeBoard: def __init__(self, size): self.size = size # construct a new board that is size by size self.board = [] for i in range(self.size): self.board.append(["_"] * size) def add_X(self, row, col): self.add_mark("X", row, col) def add_O(self, row, col): self.add_mark("O", row, col) def add_mark(self, mark, row, col): if self.board[row][col] != "_": return False else: self.board[row][col] = mark def is_game_over(self): return self.is_full() or self.has_win() def is_full(self): for r in range(self.size): for c in range(self.size): if self.board[r][c] == "_": return False return True def has_win(self): # check the rows for r in range(self.size): if self.is_row_all_mark("X", r) or \ self.is_row_all_mark("O", r): return True # check the columns for c in range(self.size): if self.is_col_all_mark("X", c) or \ self.is_row_all_mark("O", c): return True # check the diagonals if self.is_diagonal_all_mark("X") or \ self.is_diagonal_all_mark("O") or \ self.is_other_diagonal_all_mark("X") or \ self.is_other_diagonal_all_mark("O"): return True return False def is_row_all_mark(self, mark, row): for c in range(self.size): if self.board[row][c] != mark: return False return True def is_col_all_mark(self, mark, col): for r in range(self.size): if self.board[r][col] != mark: return False return True def is_diagonal_all_mark(self, mark): for i in range(self.size): if self.board[i][i] != mark: return False return True def is_other_diagonal_all_mark(self, mark): for i in range(self.size): if self.board[i][self.size - 1 - i] != mark: return False return True def __str__(self): board_string = " " # add the column indices at the top for i in range(self.size): board_string += str(i) + " " board_string += "\n" for i in range(self.size): board_string += str(i) + " " + str(self.board[i]) + "\n" return board_string def play_game(): board = TicTacToeBoard(3) x_turn = True while not board.is_game_over(): print board print if x_turn: print "X's turn" mark = "X" else: print "O's turn" mark = "O" selection = raw_input("Enter-row col: ").split() row = int(selection[0]) col = int(selection[1]) board.add_mark(mark, row, col) # change the turn x_turn = not x_turn print board print if board.has_win(): if x_turn: print "O wins!" else: print "X wins!" else: print "It's a tie!" play_game()