Apuntes_Python/05_diez_proyectos/05-tic_tac_toe/gato.py
2022-12-24 22:41:20 -03:00

116 lines
3.6 KiB
Python

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