Existem muitos aspectos a considerar no problema, mas se esquecermos os detalhes podemos propor uma primeira versão do nosso programa:
01.
def
tic_tac_toe_0(n):
02.
# inicializa tabuleiro
03.
# mostra tabuleiro
04.
# define jogador
05.
while
True
:
# não há vencedor ou empate
06.
if
True
:
# humano
07.
# pede jogada
08.
# actualiza tabuleiro
09.
pass
10.
else
:
11.
# define jogada
12.
# actualiza tabuleiro
13.
pass
14.
# mostra tabuleiro
15.
# Vencedor ou empate --> termina
16.
# comuta jogador
17.
# mensagem final
01.
def
tic_tac_toe_1(n):
02.
# inicializa tabuleiro
03.
tabuleiro
=
inicializa_tabuleiro(n)
04.
# mostra tabuleiro
05.
mostra_tabuleiro(tabuleiro)
06.
# define jogador
07.
while
True
:
# não há vencedor ou empate
08.
if
True
:
# humano
09.
# pede jogada
10.
# actualiza tabuleiro
11.
pass
12.
else
:
13.
# define jogada
14.
# actualiza tabuleiro
15.
pass
16.
# mostra tabuleiro
17.
mostra_tabuleiro(tabuleiro)
18.
# Vencedor ou empate --> termina
19.
# comuta jogador
20.
# mensagem final
Começando pela inicialização do tabuleiro, podemos optar pela solução trivial:
01.
def
inicializa_tabuleiro_0(n):
02.
tabuleiro
=
[]
03.
for
i
in
range(n):
04.
# linha i
05.
linha_i
=
[]
06.
for
j
in
range(n):
07.
linha_i
+
=
[
0
]
08.
tabuleiro
+
=
[linha_i]
09.
return
tabuleiro
1.
def
inicializa_tabuleiro(n):
2.
tabuleiro
=
[]
3.
for
i
in
range(n):
4.
# linha i
5.
tabuleiro
+
=
[[
0
]
*
n]
6.
return
tabuleiro
1.
def
inicializa_tabuleiro(n):
2.
return
[[
0
]
*
n
for
i
in
range(n)]
1.
def
mostra_tabuleiro(tabuleiro):
2.
print
(tabuleiro)
1.
def
mostra_tabuleiro(tabuleiro):
2.
for
linha
in
tabuleiro:
3.
for
valor
in
linha:
4.
print
(valor,
' '
,end
=
'')
5.
print
()
1.
def
define_jogador():
2.
import
random
3.
return
random.choice(‘XO')
01.
def
tic_tac_toe_2(n):
02.
# inicializa tabuleiro
03.
tabuleiro
=
inicializa_tabuleiro(n)
04.
# mostra tabuleiro
05.
mostra_tabuleiro(tabuleiro)
06.
# define jogador
07.
jogador
=
define_jogador()
08.
while
True
:
# não há vencedor ou empate
09.
if
jogador
=
=
'X'
:
# humano
10.
# pede jogada
11.
# actualiza tabuleiro
12.
pass
13.
else
:
14.
# define jogada
15.
# actualiza tabuleiro
16.
pass
17.
# mostra tabuleiro
18.
mostra_tabuleiro(tabuleiro)
19.
# Vencedor ou empate --> termina
20.
# comuta jogador
21.
if
jogador
=
=
'X'
:
22.
return
'O'
23.
else
:
24.
return
'X'
25.
# mensagem final
01.
def
pede_jogada(tabuleiro):
02.
jogada
=
eval(input(
'A sua jogada (x,y)?: '
))
03.
while
not
possivel(tabuleiro,jogada):
04.
print
(
'Jogada ilegal...'
)
05.
jogada
=
eval(input(
'A sua jogada (x,y)?: '
))
06.
return
jogada
07.
08.
09.
def
possivel(tabuleiro,jogada):
10.
return
tabuleiro[jogada[
0
]][jogada[
1
]]
=
=
0
01.
def
joga_computador(tabuleiro):
02.
"""Escolha por ordem"""
03.
for
i
in
range(len(tabuleiro)):
04.
for
j
in
range(len(tabuleiro[
0
])):
05.
if
tabuleiro[i][j]
=
=
0
:
06.
return
i,j
07.
08.
def
joga_computador_b(tabuleiro):
09.
import
random
10.
"""Escolha aleatória"""
11.
livres
=
[]
12.
for
i
in
range(len(tabuleiro)):
13.
for
j
in
range(len(tabuleiro[
0
])):
14.
if
tabuleiro[i][j]
=
=
0
:
15.
livres
+
=
[(i,j)]
16.
return
random.choice(livres)
01.
def
tic_tac_toe_3(n):
02.
# inicializa tabuleiro
03.
tabuleiro
=
inicializa_tabuleiro(n)
04.
# mostra tabuleiro
05.
mostra_tabuleiro(tabuleiro)
06.
# define jogador X (humano) ou O (computador)
07.
jogador
=
define_jogador()
08.
while
True
:
# não há vencedor ou empate
09.
if
jogador
=
=
'X'
:
# humano
10.
print
(
'Joga Humano'
)
11.
# pede jogada
12.
jogada
=
pede_jogada(tabuleiro)
13.
# actualiza tabuleiro
14.
else
:
15.
print
(
'Joga computador'
)
16.
# define jogada
17.
jogada
=
joga_computador_b(tabuleiro)
18.
# actualiza tabuleiro
19.
# mostra tabuleiro
20.
mostra_tabuleiro(tabuleiro)
21.
# Vencedor ou empate --> termina
22.
# comuta jogador
23.
jogador
=
comuta_jogador(jogador)
24.
# mensagem final
1.
def
actualiza_tabuleiro(tabuleiro, jogada, jogador):
2.
if
jogador
=
=
'X'
:
3.
tabuleiro[jogada[
0
]][jogada[
1
]]
=
'X'
4.
else
:
5.
tabuleiro[jogada[
0
]][jogada[
1
]]
=
'O'
6.
return
tabuleiro
01.
def
tic_tac_toe_4(n):
02.
# inicializa tabuleiro
03.
tabuleiro
=
inicializa_tabuleiro(n)
04.
# mostra tabuleiro
05.
mostra_tabuleiro(tabuleiro)
06.
# define jogador X (humano) ou O (computador)
07.
jogador
=
define_jogador()
08.
while
True
:
# não há vencedor ou empate
09.
if
jogador
=
=
'X'
:
# humano
10.
print
(
'Joga Humano'
)
11.
# pede jogada
12.
jogada
=
pede_jogada(tabuleiro)
13.
# actualiza tabuleiro
14.
tabuleiro
=
actualiza_tabuleiro(tabuleiro,jogada,jogador)
15.
else
:
16.
print
(
'Joga computador'
)
17.
# define jogada
18.
jogada
=
joga_computador_b(tabuleiro)
19.
# actualiza tabuleiro
20.
tabuleiro
=
actualiza_tabuleiro(tabuleiro,jogada,jogador)
21.
# mostra tabuleiro
22.
mostra_tabuleiro(tabuleiro)
23.
# Vencedor ou empate --> termina
24.
# comuta jogador
25.
jogador
=
comuta_jogador(jogador)
26.
# mensagem final
01.
def
vencedor(tabuleiro,jogador):
02.
return
vence_linhas(tabuleiro,jogador)
or
vence_colunas(tabuleiro, jogador)
or
vence_diagonais(tabuleiro, jogador)
03.
04.
def
vence_linhas(tabuleiro,jogador):
05.
for
i
in
range(len(tabuleiro)):
06.
vence
=
True
07.
for
j
in
range(len(tabuleiro[
0
])):
08.
vence
=
vence
and
(tabuleiro[i][j]
=
=
jogador)
09.
if
vence:
10.
return
True
11.
return
False
12.
13.
def
vence_colunas(tabuleiro,jogador):
14.
for
i
in
range(len(tabuleiro[
0
])):
15.
vence
=
True
16.
for
j
in
range(len(tabuleiro)):
17.
vence
=
vence
and
(tabuleiro[j][i]
=
=
jogador)
18.
if
vence:
19.
return
True
20.
return
False
21.
22.
def
vence_diagonais(tabuleiro,jogador):
23.
vence_1
=
True
24.
vence_2
=
True
25.
# diagonal principal
26.
for
i
in
range(len(tabuleiro)):
27.
vence_1
=
vence_1
and
(tabuleiro[i][i]
=
=
jogador)
28.
vence_2
=
vence_2
and
(tabuleiro[i][len(tabuleiro)
-
1
-
i]
=
=
jogador)
29.
return
vence_1
or
vence_2
1.
def
empate(tabuleiro):
2.
for
i
in
range(len(tabuleiro)):
3.
for
j
in
range(len(tabuleiro[
0
])):
4.
if
tabuleiro[i][j]
=
=
0
:
5.
return
False
6.
return
True
01.
def
tic_tac_toe(n):
02.
# inicializa tabuleiro
03.
tabuleiro
=
inicializa_tabuleiro(n)
04.
# mostra tabuleiro
05.
mostra_tabuleiro(tabuleiro)
06.
# define jogador X (humano) ou O (computador)
07.
jogador
=
define_jogador()
08.
while
True
:
# não há vencedor ou empate
09.
if
jogador
=
=
'X'
:
# humano
10.
print
(
'Joga Humano'
)
11.
# pede jogada
12.
jogada
=
pede_jogada(tabuleiro)
13.
# actualiza tabuleiro
14.
tabuleiro
=
actualiza_tabuleiro(tabuleiro,jogada,jogador)
15.
else
:
16.
print
(
'Joga computador'
)
17.
# define jogada
18.
jogada
=
joga_computador_b(tabuleiro)
19.
# actualiza tabuleiro
20.
tabuleiro
=
actualiza_tabuleiro(tabuleiro,jogada,jogador)
21.
# mostra tabuleiro
22.
mostra_tabuleiro(tabuleiro)
23.
# Vencedor ou empate --> termina
24.
if
vencedor(tabuleiro,jogador)
or
empate(tabuleiro):
25.
break
26.
# comuta jogador
27.
jogador
=
comuta_jogador(jogador)
28.
# mensagem final
29.
print
(
'Finito...'
)
30.
if
empate(tabuleiro):
31.
print
(
'Fica para o próximo jogo!'
)
32.
elif
jogador
=
=
'X'
:
33.
print
(
'Parabéns humanóide!'
)
34.
else
:
35.
print
(
'Parabéns Computador'
)
01.
def
joga_computador_c(tabuleiro):
02.
if
pode_ganhar_computador(tabuleiro):
03.
# joga para aí
04.
pass
05.
elif
pode_ganhar_humano(tabuleiro):
06.
# bloqueia
07.
pass
08.
elif
livre_centro():
09.
# joga centro
10.
pass
11.
elif
livre_canto():
12.
# joga_canto
13.
pass
14.
else
:
15.
# joga
16.
pass