【问题标题】:tic tac toe 4x4 python井字游戏 4x4 蟒蛇
【发布时间】:2015-10-02 12:05:05
【问题描述】:

我正在使用 minmax 进行 tic tac toe 4x4 工作,算法运行,但什么也没做,我认为问题在于“def ganador”或“def juega_humano”读取输入,我将不胜感激任何帮助,谢谢

PD:对不起我的泰山英语

#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

【问题讨论】:

  • 欢迎来到 StackOverflow!首先,如果您可以edit 您的问题正确缩进您的代码,那就太好了。特别是在python中,很难判断错误是否与缩进有关。
  • 我看到的第一个问题是你的函数没有缩进。在每个 def 语句之后,您应该有缩进。我无法将缩进作为评论发布,因此我将其作为答案发布。

标签: python tic-tac-toe


【解决方案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 only 是否包含有效输入,您应该对照有效字符串列表检查它,如下所示:

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 语句可能会让您走很长一段路。)

【讨论】:

  • 更新:我刚刚看到您关于退出 0 和有效单元格 1-16 的评论,并且在将其用作索引之前从输入中减去 1。因此,请忽略我关于接受“16”作为输入会在以后给您带来 IndexError 的评论;在您的情况下实际上并非如此,您应该检查0 &lt;= casilla &lt;= 16。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
相关资源
最近更新 更多