为什么我最后不能打印电路板? (井字游戏 python)
Why i cant print the board at the end? (tic tac toe python)
我必须为一个项目制作一个 Tictactoe,虽然我知道代码不好,但我看不出错误是什么,如果我打印密钥,则值已分配给字典对于最后一次播放,它正确地告诉我是 X 还是 O,但该值未在棋盘的最后一次打印中表示。
def tateti():
juego_terminado = False
first_player = 'X'
second_player = 'O'
turn = 0
tablero = {'ArribaIzquierda' : ' ','ArribaCentro' : ' ', 'ArribaDerecha' : ' ',
'CentroIzquierda' : ' ', 'CentroCentro' : ' ', 'CentroDerecha' : ' ',
'AbajoIzquierda' : ' ', 'AbajoCentro' : ' ','AbajoDerecha' : ' '}
#Loop principal
#Instrucciones
print('Para jugar, usa el numepad como si fuera el tablero de tateti\no elegi una posicion en el tablero con las primeras dos iniciales de la fila\ny la primer letra de la posicion dentro de la fila.\nPor ejemplo para ponerla arriba al centro es: arc (AR-riba C-entro). \n\n')
print('TA TE TI')
while juego_terminado == False:
abd = tablero['AbajoDerecha']
arc = tablero['ArribaCentro']
ard = tablero['ArribaDerecha']
cei = tablero['CentroIzquierda']
cec = tablero['CentroCentro']
ced = tablero['CentroDerecha']
ari = tablero['ArribaIzquierda']
abi = tablero['AbajoIzquierda']
abc = tablero['AbajoCentro']
#Separando los turnos
if turn % 2 == 0:
player = first_player
else:
player = second_player
print('|{}|{}|{}|\n- - - -\n|{}|{}|{}|\n- - - -\n|{}|{}|{}|'.format(ari, arc, ard, cei, cec, ced, abi, abc, abd))
#Pedirle al jugador donde quiero poner su figura
jugada = str(input('¿Donde queres poner la {}?: '.format(player)))
#Asignando cruz o cicedulo al dicecionario
if jugada == 'ari' or jugada == '7':
if tablero['ArribaIzquierda'] == ' ':
tablero['ArribaIzquierda'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'arc' or jugada == '8':
if tablero['ArribaCentro'] == ' ':
tablero['ArribaCentro'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'ard' or jugada == '9':
if tablero['ArribaDerecha'] == ' ':
tablero['ArribaDerecha'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'cei' or jugada == '4':
if tablero['CentroIzquierda'] == ' ':
tablero['CentroIzquierda'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'cec' or jugada == '5':
if tablero['CentroCentro'] == ' ':
tablero['CentroCentro'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'ced' or jugada == '6':
if tablero['CentroDerecha'] == ' ':
tablero['CentroDerecha'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'abi' or jugada == '1':
if tablero['AbajoIzquierda'] == ' ':
tablero['AbajoIzquierda'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'abc' or jugada == '2':
if tablero['AbajoCentro'] == ' ':
tablero['AbajoCentro'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'abd' or jugada == '3' :
if tablero['AbajoDerecha'] == ' ':
tablero['AbajoDerecha'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
else:
print('Jugada invalida, por favor realice una jugada valida')
continue
#Condiciones para ganar
if tablero['AbajoDerecha'] == tablero['AbajoCentro'] and tablero['AbajoCentro'] == tablero['AbajoIzquierda'] and tablero['AbajoDerecha'] != ' ' :
juego_terminado = True
elif tablero['CentroDerecha'] == tablero['CentroCentro'] and tablero['CentroCentro'] == tablero['CentroIzquierda'] and tablero['CentroDerecha'] != ' ' :
juego_terminado = True
elif tablero['ArribaDerecha'] == tablero['ArribaCentro'] and tablero['ArribaCentro'] == tablero['ArribaIzquierda'] and tablero['ArribaDerecha'] != ' ':
juego_terminado = True
elif tablero['ArribaDerecha'] == tablero['CentroCentro'] and tablero['CentroCentro'] == tablero['AbajoIzquierda'] and tablero['ArribaDerecha'] != ' ':
juego_terminado = True
elif tablero['ArribaIzquierda'] == tablero['CentroCentro'] and tablero['CentroCentro'] == tablero['AbajoDerecha'] and tablero['ArribaIzquierda'] != ' ':
juego_terminado = True
elif tablero['ArribaDerecha'] == tablero['CentroDerecha'] and tablero['CentroDerecha'] == tablero['AbajoDerecha'] and tablero['ArribaDerecha'] != ' ':
juego_terminado = True
elif tablero['ArribaIzquierda'] == tablero['CentroIzquierda'] and tablero['CentroIzquierda'] == tablero['AbajoIzquierda'] and tablero['ArribaIzquierda'] != ' ':
juego_terminado = True
elif tablero['ArribaCentro'] == tablero['CentroCentro'] and tablero['CentroCentro'] == tablero['AbajoCentro'] and tablero['ArribaCentro'] != ' ':
juego_terminado = True
#Si el tablero esta lleno
if turn == 8 and juego_terminado == False:
print('Empate')
print('|{}|{}|{}|\n- - - -\n|{}|{}|{}|\n- - - -\n|{}|{}|{}|'.format(ari, arc, ard, cei, cec, ced, abi, abc, abd))
break
elif juego_terminado == True:
print('{} gano'.format(player))
print('|{}|{}|{}|\n- - - -\n|{}|{}|{}|\n- - - -\n|{}|{}|{}|'.format(ari, arc, ard, cei, cec, ced, abi, abc, abd))
turn += 1
tateti()
提前致谢!
您正在将新的 X
或 O
分配给 tablero['algo']
。如果游戏没有在这里结束,您将 tablero
的内容分配给 ari
、arc
等,但仅在 next[= 的开始处53=]循环。
因此,如果游戏在该步之后结束,您将打印尚未更新以反映最新步的旧 ari
、arc
等。
当然,还有许多其他问题需要修复(很多重复是可以避免的),但游戏运行正常。
一些建议:
我会使用一个简单的列表来处理董事会。 tablero = [" "] * 9
创建一个包含九个 space 个字符的列表。这允许很多简化。例如,打印电路板,你可以简单地做
print('|{6}|{7}|{8}|\n- - - -\n|{3}|{4}|{5}|\n- - - -\n|{0}|{1}|{2}|'.format(*tablero))
请注意,列表的第一个元素由 0
索引,因此我们需要考虑到这一点。
完成后,您可以创建另一个列表来处理快捷方式:
casillas = ["abi", "abc", "abd", "cei", "cec", "ced", "ari", "arc", "ard"]
现在处理输入要容易得多,因为您可以重复使用相同的代码而不是大量 if/elif
语句:
jugada = input('¿Donde queres poner la {}?: '.format(player)) # input() already returns a str
try: # let's see if player entered a whole number
casilla = int(jugada) - 1 # remember, field 1 is numbered internally as 0
except ValueError: # apparently not
try: # let's see if player entered a valid shortcut
casilla = casillas.index(jugada)
except ValueError: # apparently not
casilla = 9 # let's choose an invalid value, we'll detect that later
现在我们在 casilla
中有了一个数字,让我们看看它是否在范围内,如果在范围内,让我们填写董事会,如果可以的话:
if 0 <= casilla <= 8:
if tablero[casilla] == ' ':
tablero[casilla] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
else:
print('Jugada invalida, por favor realice una jugada valida')
continue
获胜条件也可以简化:
if tablero[0] == tablero[1] == tablero[2] != " " or \
tablero[3] == tablero[4] == tablero[4] != " " or \
tablero[6] == tablero[7] == tablero[8] != " " or \
... etc. ...:
juego_terminado = True
有了理解力,还可以再缩短:
if any(tablero[i] == tablero[j] == tablero[k] != " "
for i,j,k in ((0,1,2), (3,4,5), (6,7,8), (0,3,6), (1,4,7), (2,5,8), (0,4,8), (2,4,6))):
juego_terminado = True
我还没有实际测试过,所以如果你 运行 遇到问题,请告诉我。
我必须为一个项目制作一个 Tictactoe,虽然我知道代码不好,但我看不出错误是什么,如果我打印密钥,则值已分配给字典对于最后一次播放,它正确地告诉我是 X 还是 O,但该值未在棋盘的最后一次打印中表示。
def tateti():
juego_terminado = False
first_player = 'X'
second_player = 'O'
turn = 0
tablero = {'ArribaIzquierda' : ' ','ArribaCentro' : ' ', 'ArribaDerecha' : ' ',
'CentroIzquierda' : ' ', 'CentroCentro' : ' ', 'CentroDerecha' : ' ',
'AbajoIzquierda' : ' ', 'AbajoCentro' : ' ','AbajoDerecha' : ' '}
#Loop principal
#Instrucciones
print('Para jugar, usa el numepad como si fuera el tablero de tateti\no elegi una posicion en el tablero con las primeras dos iniciales de la fila\ny la primer letra de la posicion dentro de la fila.\nPor ejemplo para ponerla arriba al centro es: arc (AR-riba C-entro). \n\n')
print('TA TE TI')
while juego_terminado == False:
abd = tablero['AbajoDerecha']
arc = tablero['ArribaCentro']
ard = tablero['ArribaDerecha']
cei = tablero['CentroIzquierda']
cec = tablero['CentroCentro']
ced = tablero['CentroDerecha']
ari = tablero['ArribaIzquierda']
abi = tablero['AbajoIzquierda']
abc = tablero['AbajoCentro']
#Separando los turnos
if turn % 2 == 0:
player = first_player
else:
player = second_player
print('|{}|{}|{}|\n- - - -\n|{}|{}|{}|\n- - - -\n|{}|{}|{}|'.format(ari, arc, ard, cei, cec, ced, abi, abc, abd))
#Pedirle al jugador donde quiero poner su figura
jugada = str(input('¿Donde queres poner la {}?: '.format(player)))
#Asignando cruz o cicedulo al dicecionario
if jugada == 'ari' or jugada == '7':
if tablero['ArribaIzquierda'] == ' ':
tablero['ArribaIzquierda'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'arc' or jugada == '8':
if tablero['ArribaCentro'] == ' ':
tablero['ArribaCentro'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'ard' or jugada == '9':
if tablero['ArribaDerecha'] == ' ':
tablero['ArribaDerecha'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'cei' or jugada == '4':
if tablero['CentroIzquierda'] == ' ':
tablero['CentroIzquierda'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'cec' or jugada == '5':
if tablero['CentroCentro'] == ' ':
tablero['CentroCentro'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'ced' or jugada == '6':
if tablero['CentroDerecha'] == ' ':
tablero['CentroDerecha'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'abi' or jugada == '1':
if tablero['AbajoIzquierda'] == ' ':
tablero['AbajoIzquierda'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'abc' or jugada == '2':
if tablero['AbajoCentro'] == ' ':
tablero['AbajoCentro'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
elif jugada == 'abd' or jugada == '3' :
if tablero['AbajoDerecha'] == ' ':
tablero['AbajoDerecha'] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
else:
print('Jugada invalida, por favor realice una jugada valida')
continue
#Condiciones para ganar
if tablero['AbajoDerecha'] == tablero['AbajoCentro'] and tablero['AbajoCentro'] == tablero['AbajoIzquierda'] and tablero['AbajoDerecha'] != ' ' :
juego_terminado = True
elif tablero['CentroDerecha'] == tablero['CentroCentro'] and tablero['CentroCentro'] == tablero['CentroIzquierda'] and tablero['CentroDerecha'] != ' ' :
juego_terminado = True
elif tablero['ArribaDerecha'] == tablero['ArribaCentro'] and tablero['ArribaCentro'] == tablero['ArribaIzquierda'] and tablero['ArribaDerecha'] != ' ':
juego_terminado = True
elif tablero['ArribaDerecha'] == tablero['CentroCentro'] and tablero['CentroCentro'] == tablero['AbajoIzquierda'] and tablero['ArribaDerecha'] != ' ':
juego_terminado = True
elif tablero['ArribaIzquierda'] == tablero['CentroCentro'] and tablero['CentroCentro'] == tablero['AbajoDerecha'] and tablero['ArribaIzquierda'] != ' ':
juego_terminado = True
elif tablero['ArribaDerecha'] == tablero['CentroDerecha'] and tablero['CentroDerecha'] == tablero['AbajoDerecha'] and tablero['ArribaDerecha'] != ' ':
juego_terminado = True
elif tablero['ArribaIzquierda'] == tablero['CentroIzquierda'] and tablero['CentroIzquierda'] == tablero['AbajoIzquierda'] and tablero['ArribaIzquierda'] != ' ':
juego_terminado = True
elif tablero['ArribaCentro'] == tablero['CentroCentro'] and tablero['CentroCentro'] == tablero['AbajoCentro'] and tablero['ArribaCentro'] != ' ':
juego_terminado = True
#Si el tablero esta lleno
if turn == 8 and juego_terminado == False:
print('Empate')
print('|{}|{}|{}|\n- - - -\n|{}|{}|{}|\n- - - -\n|{}|{}|{}|'.format(ari, arc, ard, cei, cec, ced, abi, abc, abd))
break
elif juego_terminado == True:
print('{} gano'.format(player))
print('|{}|{}|{}|\n- - - -\n|{}|{}|{}|\n- - - -\n|{}|{}|{}|'.format(ari, arc, ard, cei, cec, ced, abi, abc, abd))
turn += 1
tateti()
提前致谢!
您正在将新的 X
或 O
分配给 tablero['algo']
。如果游戏没有在这里结束,您将 tablero
的内容分配给 ari
、arc
等,但仅在 next[= 的开始处53=]循环。
因此,如果游戏在该步之后结束,您将打印尚未更新以反映最新步的旧 ari
、arc
等。
当然,还有许多其他问题需要修复(很多重复是可以避免的),但游戏运行正常。
一些建议:
我会使用一个简单的列表来处理董事会。 tablero = [" "] * 9
创建一个包含九个 space 个字符的列表。这允许很多简化。例如,打印电路板,你可以简单地做
print('|{6}|{7}|{8}|\n- - - -\n|{3}|{4}|{5}|\n- - - -\n|{0}|{1}|{2}|'.format(*tablero))
请注意,列表的第一个元素由 0
索引,因此我们需要考虑到这一点。
完成后,您可以创建另一个列表来处理快捷方式:
casillas = ["abi", "abc", "abd", "cei", "cec", "ced", "ari", "arc", "ard"]
现在处理输入要容易得多,因为您可以重复使用相同的代码而不是大量 if/elif
语句:
jugada = input('¿Donde queres poner la {}?: '.format(player)) # input() already returns a str
try: # let's see if player entered a whole number
casilla = int(jugada) - 1 # remember, field 1 is numbered internally as 0
except ValueError: # apparently not
try: # let's see if player entered a valid shortcut
casilla = casillas.index(jugada)
except ValueError: # apparently not
casilla = 9 # let's choose an invalid value, we'll detect that later
现在我们在 casilla
中有了一个数字,让我们看看它是否在范围内,如果在范围内,让我们填写董事会,如果可以的话:
if 0 <= casilla <= 8:
if tablero[casilla] == ' ':
tablero[casilla] = player
else:
print('Este posición ya fue ocupada, por favor elegi otra')
continue
else:
print('Jugada invalida, por favor realice una jugada valida')
continue
获胜条件也可以简化:
if tablero[0] == tablero[1] == tablero[2] != " " or \
tablero[3] == tablero[4] == tablero[4] != " " or \
tablero[6] == tablero[7] == tablero[8] != " " or \
... etc. ...:
juego_terminado = True
有了理解力,还可以再缩短:
if any(tablero[i] == tablero[j] == tablero[k] != " "
for i,j,k in ((0,1,2), (3,4,5), (6,7,8), (0,3,6), (1,4,7), (2,5,8), (0,4,8), (2,4,6))):
juego_terminado = True
我还没有实际测试过,所以如果你 运行 遇到问题,请告诉我。