tic tac toe 4x4 python

时间:2015-10-02 02:47:46

标签: python tic-tac-toe

我正在使用minmax运行4x4 tic tac toe,algorythm运行,但什么也没做,我认为问题是在“def ganador”或“def juega_humano”阅读输入,我会非常感谢任何帮助,谢谢

PD:对不起我的tarzan english

#the lines for win
def ganador(tablero):
  lineas = [[0,1,2,3], [4,5,6,7], [8,9,10,11], [12,13,14,15], [0,4,8,12], [1,5,9,13], [2,6,10,14], [3,7,11,15], [0,5,10,15], [3,6,9,12]]
  ganador = 0
  for linea in lineas:
      if tablero[linea[0]] == tablero[linea[1]] and tablero[linea[0]] == tablero[linea[2]] and tablero[linea[0]] == tablero[linea[3]] and tablero[linea[0]] != 0:
          ganador = tablero[linea[0]]
   return ganador

def ver_tablero(tablero):
for i in range(0,4):
    for j in range(0,4):
        if tablero[i*4+j] == MAX:
            print 'X',
        elif tablero[i*4+j] == MIN:
            print 'O',
        else:
            print '.',

    print ''
def juega_humano(tablero):
  ok=False
  while not ok:
    casilla = input ("Casilla?")
    # 0 to exit, 1-16 for cells defined with "range" in another place
    if str(casilla) in '012345678910111213141516' and (len(str(casilla))<= 2)   and tablero[casilla-1] == 0:
        if casilla == 0:
            sys.exit(0)
        tablero[casilla-1]=MIN
        ok=True
  return tablero
def juega_ordenador(tablero):
  global jugada_maquina
  punt = minimax(tablero[:], MAX)
  tablero[jugada_maquina] = MAX
  return tablero
if __name__ == "__main__":
  print 'Introduce casilla o 0 para terminar'
  tablero = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  while (True):
    ver_tablero(tablero)
    tablero = juega_humano(tablero)
    if game_over(tablero):
        break
    tablero = juega_ordenador(tablero)
    if game_over(tablero):
        break

1 个答案:

答案 0 :(得分:1)

我能看到的第一个问题是你的函数没有缩进。在每个def语句之后,你应该有缩进。例如,这是错误的:

def ganador(tablero):
lineas = [[0,1,2,3], [4,5,6,7], [8,9,10,11], [12,13,14,15], [0,4,8,12], [1,5,9,13], [2,6,10,14], [3,7,11,15], [0,5,10,15], [3,6,9,12]]
ganador = 0
for linea in lineas:
    if tablero[linea[0]] == tablero[linea[1]] and tablero[linea[0]] == tablero[linea[2]] and tablero[linea[0]] == tablero[linea[3]] and tablero[linea[0]] != 0:
        ganador = tablero[linea[0]]

return ganador

这是正确的:

def ganador(tablero):
    lineas = [[0,1,2,3], [4,5,6,7], [8,9,10,11], [12,13,14,15], [0,4,8,12], [1,5,9,13], [2,6,10,14], [3,7,11,15], [0,5,10,15], [3,6,9,12]]
    ganador = 0
    for linea in lineas:
        if tablero[linea[0]] == tablero[linea[1]] and tablero[linea[0]] == tablero[linea[2]] and tablero[linea[0]] == tablero[linea[3]] and tablero[linea[0]] != 0:
            ganador = tablero[linea[0]]

    return ganador

为您的整个代码执行此操作,并查看是否可以解决您的问题。如果没有,看看你是否可以缩小它:你刚发布的代码量非常大(两个全屏),大多数人都不想滚动整个事情。如果你可以将其缩小到“好吧,这就是出错的功能”,那么更多的人可能会帮助你找到解决方案。

注意:当我说“这是正确的”时,我只是说缩进。我实际上没有查看你的程序的逻辑;你的错误仍然存​​在我所知道的ganador功能。)

编辑:在你的逻辑中发现了一个问题。这条线不符合你的想法:

if str(casilla) in '012345678910111213141516' and # ... rest of line left out

如果casilla为91,则为真,因为字符串“91”可以在您正在检查的字符串中找到。如果要检查casilla 是否包含有效输入,则应根据有效字符串列表进行检查,如下所示:

if str(casilla) in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15'] and # ... rest of line left out

(请注意,我省略了'16':如果您接受'16'作为有效输入,那么您将在某个时刻出现IndexError。)

虽然有更好的方法来进行此项检查。当你真的只想知道它是否在0到15之间时,为什么还要把它转换为字符串呢?就这样做:

if 0 <= casilla <= 15 and # ... rest of line left out

我稍后可能会给你更多的帮助,但现在已经够了。正确缩进您的功能,看看您的问题是否消失。如果没有,请尝试缩小范围,然后使用缩小的代码发布新问题。

(提示缩小范围:在所有地方粘贴print语句,打印出您在代码中不同位置获得的值,并查看它们对您是对还是错。好的调试器甚至更好,但是如果你没有调试器,print语句会带你走很长的路。)