为什么我最后不能印制电路板? 井字蟒

问题描述

我必须为一个项目编写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,abd))
        break
    elif juego_terminado == True:
        print('{} gano'.format(player))
        print('|{}|{}|{}|\n- - - -\n|{}|{}|{}|\n- - - -\n|{}|{}|{}|'.format(ari,abd))
        
        
              
    turn += 1

    
    
  tateti()

谢谢!

解决方法

您正在将新的XO分配给tablero['algo']。如果游戏没有到此结束,则将tablero的内容分配给ariarc等,但只在 next 的开头循环。

因此,如果游戏在该移动之后确实结束,则打印旧的ariarc等,它们尚未更新以反映最新的移动。

当然,您还应该修复许多其他问题(可以避免很多重复),但是游戏确实可以正常工作。

一些建议:

我会用一个简单的清单来处理董事会。 tablero = [" "] * 9创建九个空格字符的列表。这样就可以进行很多简化。例如,要印刷电路板,您只需完成

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,7),(2,5,6))):
    juego_terminado = True

我还没有实际测试过,所以如果您遇到问题,请告诉我。