为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我最后无法打印板子?(井字棋蟒蛇)

为什么我最后无法打印板子?(井字棋蟒蛇)

PHP
一只甜甜圈 2023-11-09 21:15:24
我必须为一个项目制作一个 Tictactoe,虽然我知道代码不好,但我看不出错误是什么,该值被分配给字典,如果我打印最后一次播放的密钥正确显示是 X 还是 O,但该值未在电路板的最后一次打印中表示。def tateti():juego_terminado = Falsefirst_player = 'X'second_player = 'O'turn = 0tablero = {'ArribaIzquierda' : ' ','ArribaCentro' : ' ', 'ArribaDerecha' : ' ', 'CentroIzquierda' : ' ', 'CentroCentro' : ' ', 'CentroDerecha' : ' ','AbajoIzquierda' : ' ', 'AbajoCentro' : ' ','AbajoDerecha' : ' '}#Loop principal    #Instruccionesprint('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
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

您正在将新的X或O分配给tablero['algo']。如果游戏没有在这里结束,您可以将 的内容分配tablero给ari、等,但仅在下arc一个循环开始时才分配。


因此,如果游戏在该移动之后结束,您将打印旧的ari、arc等,这些尚未更新以反映最新的移动。


当然,还有许多其他问题需要修复(可以避免大量重复),但游戏确实可以正常运行。


一些建议:


我会使用一个简单的列表来处理董事会。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

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


查看完整回答
反对 回复 2023-11-09
  • 1 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信