【问题标题】:Why i cant print the board at the end? (tic tac toe python)为什么我不能在最后打印板? (井字游戏蟒)
【发布时间】:2020-10-15 20:24:46
【问题描述】:

我必须为一个项目制作一个 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()

提前致谢!

【问题讨论】:

    标签: python arrays dictionary turn


    【解决方案1】:

    您正在将新的XO 分配给tablero['algo']。如果游戏没有在此结束,您将tablero 的内容分配给ariarc 等,但仅限于下一个 循环的开始。

    因此,如果游戏确实在该动作之后结束,您将打印尚未更新的旧 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,4,7), (2,5,8), (0,4,8), (2,4,6))):
        juego_terminado = True
    

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

    【讨论】:

    • 非常感谢!我没有意识到这一点,请问您从哪里开始优化代码?我才刚刚开始。提前致谢
    • 实际上,这更适合代码审查网站,但既然你已经在这里了...... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多