-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTicTacToe.py
More file actions
135 lines (113 loc) · 4.9 KB
/
TicTacToe.py
File metadata and controls
135 lines (113 loc) · 4.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# # Tu tarea es escribir un simple programa que simule jugar a tic-tac-toe (nombre en inglés) con el usuario. Para hacerlo más fácil, hemos decidido simplificar el juego. Aquí están nuestras reglas:
# # la maquina (por ejemplo, el programa) jugará utilizando las 'X's;
# # el usuario (por ejemplo, tu) jugarás utilizando las 'O's;
# # el primer movimiento es de la maquina - siempre coloca una 'X' en el centro del tablero;
# # todos los cuadros están numerados comenzando con el 1 (observa el ejemplo para que tengas una referencia)
# # el usuario ingresa su movimiento introduciendo el número de cuadro elegido - el número debe de ser valido, por ejemplo un valor entero mayor que 0 y menor que 10, y no puede ser un cuadro que ya esté ocupado;
# # el programa verifica si el juego ha terminado - existen cuatro posibles veredictos: el juego continua, el juego termina en empate, tu ganas, o la maquina gana;
# # la maquina responde con su movimiento y se verifica el estado del juego;
# # no se debe implementar algún tipo de inteligencia artificial - la maquina elegirá un cuadro de manera aleatoria, eso es suficiente para este juego.
# def print_board(board):
# print("---------")
# print("|", board[1], board[2], board[3], "|")
# print("|", board[4], board[5], board[6], "|")
# print("|", board[7], board[8], board[9], "|")
# print("---------")
# def check_win(board):
# win_combinations = [
# [1, 2, 3], [4, 5, 6], [7, 8, 9], # horizontal
# [1, 4, 7], [2, 5, 8], [3, 6, 9], # vertical
# [1, 5, 9], [3, 5, 7] # diagonal
# ]
# for combination in win_combinations:
# if board[combination[0]] == board[combination[1]] == board[combination[2]] == "X":
# return "X"
# elif board[combination[0]] == board[combination[1]] == board[combination[2]] == "O":
# return "O"
# if " " not in board:
# return "D"
# return "C"
from random import randrange
def display_board(board):
print("+-------" * 3,"+", sep="")
for row in range(3):
print("| " * 3,"|", sep="")
for col in range(3):
print("| " + str(board[row][col]) + " ", end="")
print("|")
print("| " * 3,"|",sep="")
print("+-------" * 3,"+",sep="")
def enter_move(board):
ok = False # suposición falsa - la necesitamos para entrar en el bucle
while not ok:
move = input("Ingresa tu movimiento: ")
ok = len(move) == 1 and move >= '1' and move <= '9' # ¿es valido lo que ingreso el usuario?
if not ok:
print("Movimiento erróneo, ingrésalo nuevamente") # no, no lo es. ingrésalo nuevamente
continue
move = int(move) - 1 # numero de la celda, del 0 al 8
row = move // 3 # fila de la celda
col = move % 3 # columna de la celda
sign = board[row][col] # marca el cuadro elegido
ok = sign not in ['O','X']
if not ok: # esta ocupado, ingresa una posición nuevamente
print("¡Cuadro ocupado, ingresa nuevamente!")
continue
board[row][col] = 'O' # colocar '0' al cuadro seleccionado
def make_list_of_free_fields(board):
free = [] # la lista esta vacía inicialmente
for row in range(3): # itera a través de las filas
for col in range(3): # iitera a través de las columnas
if board[row][col] not in ['O','X']: # ¿Está la celda libre?
free.append((row,col)) # si, agrega una nueva tupla a la lista
return free
def victory_for(board,sgn):
if sgn == "X": # ¿Estamos buscando X?
who = 'me' # Si, es la maquina
elif sgn == "O": # ... ¿o estamos buscando O?
who = 'you' # Si, es el usuario
else:
who = None # ¡No debemos de caer aquí!
cross1 = cross2 = True # para las diagonales
for rc in range(3):
if board[rc][0] == sgn and board[rc][1] == sgn and board[rc][2] == sgn: # check row rc
return who
if board[0][rc] == sgn and board[1][rc] == sgn and board[2][rc] == sgn: # check column rc
return who
if board[rc][rc] != sgn: # revisar la primer diagonal
cross1 = False
if board[2 - rc][2 - rc] != sgn: # revisar la segunda diagonal
cross2 = False
if cross1 or cross2:
return who
return None
def draw_move(board):
free = make_list_of_free_fields(board) # crea una lista de los cuadros vacios o libres
cnt = len(free)
if cnt > 0: # si la lista no esta vacía, elegir un lugar para 'X' y colocarla
this = randrange(cnt)
row, col = free[this]
board[row][col] = 'X'
board = [ [3 * j + i + 1 for i in range(3)] for j in range(3) ] # crear un tablero vacío
board[1][1] = 'X' # colocar la primer 'X' en el centro
free = make_list_of_free_fields(board)
human_turn = True # ¿De quien es turno ahora?
while len(free):
display_board(board)
if human_turn:
enter_move(board)
victor = victory_for(board,'O')
else:
draw_move(board)
victor = victory_for(board,'X')
if victor != None:
break
human_turn = not human_turn
free = make_list_of_free_fields(board)
display_board(board)
if victor == 'you':
print("¡Has ganado!")
elif victor == 'me':
print("¡He ganado!")
else:
print("¡Empate!")