import os from time import sleep as sl from player import HumanPlayer, RandomPcPlayer, GeniusPcPlayer class TicTacToe: def __init__(self): self.board = [' ' for _ in range(9)] # El tablero es representado por una lista self.current_winner = None def print_board(self): for row in [ self.board[ i*3:( i+1 )*3 ] for i in range(3) ]: print('| ' + ' | '.join(row) + ' |') @staticmethod def print_board_nums(): # 0 | 1 | 3 etc number_board = [[str(i+1) for i in range( j*3, (j+1)*3)] for j in range(3)] for row in number_board: print('| ' + ' | '.join(row) + ' |') def available_moves(self): #moves = [] #for (i, spot) in enumerate(self.board): # ['x', 'x', 'o'] --> [(0, 'x'), (1, 'x'), (2, 'o')] # if spot == ' ': # moves.append(i) #return moves return [i for i, spot in enumerate(self.board) if spot == ' '] def empty_squares(self): return ' ' in self.board def num_empty_squares(self): return self.board.count(' ') def make_move(self, square, bando): if self.board[square] == ' ': self.board[square] = bando if self.winner(square, bando): self.current_winner = bando return True return False def winner(self, square, bando): # 3 en fila row_ind = square // 3 row = self.board[row_ind*3 : (row_ind + 1) * 3] if all([spot == bando for spot in row]): return True # 3 en columna col_ind = square % 3 column = [self.board[col_ind + i*3] for i in range(3)] if all([spot == bando for spot in column]): return True # 3 en diagonal if square % 2 == 0: diagonal1 = [self.board[i] for i in [0, 4, 8]] if all([spot == bando for spot in diagonal1]): return True diagonal2 = [self.board[i] for i in [2, 4, 6]] if all([spot == bando for spot in diagonal2]): return True return False def play(game, x_player, o_player, print_game=True): " Retorna el janador del juego o None si es empate" cl = lambda: os.system('clear') if os.name == 'posix' else os.system('cls') if print_game: cl() game.print_board_nums() bando = 'X' while game.empty_squares(): if bando == 'O': cl() square = o_player.get_move(game) else: square = x_player.get_move(game) cl() if game.make_move(square, bando): if print_game: print(bando + f' --> jugada en el cuadarante {square}') game.print_board() print(' ') if game.current_winner: if print_game: print('Victoria para ' + bando) return bando bando = 'O' if bando == 'X' else 'X' if print_game: sl(0.8) #cl() if print_game: print('Empate') if __name__ == '__main__': seguir = True x_wins = 0 o_wins = 0 ties = 0 while seguir: x_player = HumanPlayer('X') o_player = GeniusPcPlayer('O') t = TicTacToe() result = play(t, x_player, o_player, print_game=True) if result == 'X': x_wins += 1 elif result == 'O': o_wins += 1 else: ties += 1 resp = input(f"Estadisticas:\n\'X\' Gano: {x_wins} veces\n\'O\' Gano: {o_wins} veces\n Empates: {ties}\n\nQuieres volver a jugar? (s/n):").upper() if resp in "NO": seguir = False