用python中的参数选择我想要的内容



我有一个函数(它很大,你不需要阅读,尤其是因为它不是英文的,而且它依赖于其他函数(,我把它作为一个参数"strat";。这个功能基本上是人工智能(它是游戏中的机器人,井字游戏(;strat";我想过滤函数的参数。我的意思是,这个函数有6";可能性";通过选择不同的策略,我想缩小这些范围。如果strat="basic",那么它将只读取参数3、5和6,但如果我写"normal",它将读取所有内容。这意味着函数接收参数并按顺序进行,它会检查第一个满足要求的参数,如果没有,它会跳到下一个。这可能会让人感到困惑,但我会举一个例子,不要担心函数,只需要使用#number

def chose(tab,n,strat):
#1 Victory
if strat != 'basic':
if identificar_tuplos_pertencentes(obter_coluna(tab, 1), n) is True:
if obter_coluna(tab, 1)[0] == n and obter_coluna(tab, 1)[1] == n and obter_coluna(tab, 1)[2] == 0:
return marcar_posicao(tab,n,7)
elif obter_coluna(tab, 1)[0] == n and obter_coluna(tab, 1)[1] == 0 and obter_coluna(tab, 1)[2] == n:
return marcar_posicao(tab,n,4)
elif obter_coluna(tab, 1)[0] == 0 and obter_coluna(tab, 1)[1] == n and obter_coluna(tab, 1)[2] == n:
return marcar_posicao(tab,n,1)

elif identificar_tuplos_pertencentes(obter_coluna(tab, 2), n) is True:
if obter_coluna(tab, 2)[0] == n and obter_coluna(tab, 2)[1] == n and obter_coluna(tab, 2)[2] == 0:
return marcar_posicao(tab,n,8)
elif obter_coluna(tab, 2)[0] == n and obter_coluna(tab, 2)[1] == 0 and obter_coluna(tab, 2)[2] == n:
return marcar_posicao(tab,n,5)
elif obter_coluna(tab, 2)[0] == 0 and obter_coluna(tab, 2)[1] == n and obter_coluna(tab, 2)[2] == n:
return marcar_posicao(tab,n,2)        

elif identificar_tuplos_pertencentes(obter_coluna(tab, 3), n) is True:
if obter_coluna(tab, 3)[0] == n and obter_coluna(tab, 3)[1] == n and obter_coluna(tab, 3)[2] == 0:
return marcar_posicao(tab,n,9)
elif obter_coluna(tab, 3)[0] == n and obter_coluna(tab, 3)[1] == 0 and obter_coluna(tab, 3)[2] == n:
return marcar_posicao(tab,n,6)
elif obter_coluna(tab, 3)[0] == 0 and obter_coluna(tab, 3)[1] == n and obter_coluna(tab, 3)[2] == n:
return marcar_posicao(tab,n,3)

#Determinar Linhas
elif identificar_tuplos_pertencentes(obter_linha(tab, 1), n) is True:
if obter_linha(tab, 1)[0] == n and obter_linha(tab, 1)[1] == n and obter_linha(tab, 1)[2] == 0:
return marcar_posicao(tab,n,3)
elif obter_linha(tab, 1)[0] == n and obter_linha(tab, 1)[1] == 0 and obter_linha(tab, 1)[2] == n:
return marcar_posicao(tab,n,2)
elif obter_linha(tab, 1)[0] == 0 and obter_linha(tab, 1)[1] == n and obter_linha(tab, 1)[2] == n:
return marcar_posicao(tab,n,1)

elif identificar_tuplos_pertencentes(obter_linha(tab, 2), n) is True:
if obter_linha(tab, 2)[0] == n and obter_linha(tab, 2)[1] == n and obter_linha(tab, 2)[2] == 0:
return marcar_posicao(tab,n,6)
elif obter_linha(tab, 2)[0] == n and obter_linha(tab, 2)[1] == 0 and obter_linha(tab, 2)[2] == n:
return marcar_posicao(tab,n,5)
elif obter_linha(tab, 2)[0] == 0 and obter_linha(tab, 2)[1] == n and obter_linha(tab, 2)[2] == n:
return marcar_posicao(tab,n,4)

elif identificar_tuplos_pertencentes(obter_linha(tab, 3), n) is True:
if obter_linha(tab, 3)[0] == n and obter_linha(tab, 3)[1] == n and obter_linha(tab, 3)[2] == 0:
return marcar_posicao(tab,n,9)
elif obter_linha(tab, 3)[0] == n and obter_linha(tab, 3)[1] == 0 and obter_linha(tab, 3)[2] == n:
return marcar_posicao(tab,n,8)
elif obter_linha(tab, 3)[0] == 0 and obter_linha(tab, 3)[1] == n and obter_linha(tab, 3)[2] == n:
return marcar_posicao(tab,n,7)

#Determinar nas diagonais
elif identificar_tuplos_pertencentes(obter_diagonal(tab, 1), n) is True:
if obter_diagonal(tab, 1)[0] == n and obter_diagonal(tab, 1)[1] == n and obter_diagonal(tab, 1)[2] == 0:
return marcar_posicao(tab,n,9)
elif obter_diagonal(tab, 1)[0] == n and obter_diagonal(tab, 1)[1] == 0 and obter_diagonal(tab, 1)[2] == n:
return marcar_posicao(tab,n,5)
elif obter_diagonal(tab, 1)[0] == 0 and obter_diagonal(tab, 1)[1] == n and obter_diagonal(tab, 1)[2] == n:
return marcar_posicao(tab,n,1)

elif identificar_tuplos_pertencentes(obter_diagonal(tab, 2), n) is True:
if obter_diagonal(tab, 2)[0] == n and obter_diagonal(tab, 2)[1] == n and obter_diagonal(tab, 2)[2] == 0:
return marcar_posicao(tab,n,3)
elif obter_diagonal(tab, 2)[0] == n and obter_diagonal(tab, 2)[1] == 0 and obter_diagonal(tab, 2)[2] == n:
return marcar_posicao(tab,n,5)
elif obter_diagonal(tab, 2)[0] == 0 and obter_diagonal(tab, 2)[1] == n and obter_diagonal(tab, 2)[2] == n:
return marcar_posicao(tab,n,7)


#2 Block

elif strat != 'basic':   
if identificar_tuplos_nao_pertencentes(obter_coluna(tab, 1), n) is True:
if obter_coluna(tab, 1)[0] == -n and obter_coluna(tab, 1)[1] == -n and obter_coluna(tab, 1)[2] == 0:
return marcar_posicao(tab,n,7)
elif obter_coluna(tab, 1)[0] == -n and obter_coluna(tab, 1)[1] == 0 and obter_coluna(tab, 1)[2] == -n:
return marcar_posicao(tab,n,4)
elif obter_coluna(tab, 1)[0] == 0 and obter_coluna(tab, 1)[1] == -n and obter_coluna(tab, 1)[2] == -n:
return marcar_posicao(tab,n,1)

elif identificar_tuplos_nao_pertencentes(obter_coluna(tab, 2), n) is True:
if obter_coluna(tab, 2)[0] == -n and obter_coluna(tab, 2)[1] == -n and obter_coluna(tab, 2)[2] == 0:
return marcar_posicao(tab,n,8)
elif obter_coluna(tab, 2)[0] == -n and obter_coluna(tab, 2)[1] == 0 and obter_coluna(tab, 2)[2] == -n:
return marcar_posicao(tab,n,5)
elif obter_coluna(tab, 2)[0] == 0 and obter_coluna(tab, 2)[1] == -n and obter_coluna(tab, 2)[2] == -n:
return marcar_posicao(tab,n,2)

elif identificar_tuplos_nao_pertencentes(obter_coluna(tab, 3), n) is True:
if obter_coluna(tab, 3)[0] == -n and obter_coluna(tab, 3)[1] == -n and obter_coluna(tab, 3)[2] == 0:
return marcar_posicao(tab,n,9)
elif obter_coluna(tab, 3)[0] == -n and obter_coluna(tab, 3)[1] == 0 and obter_coluna(tab, 3)[2] == -n:
return marcar_posicao(tab,n,6)
elif obter_coluna(tab, 3)[0] == 0 and obter_coluna(tab, 3)[1] == -n and obter_coluna(tab, 3)[2] == -n:
return marcar_posicao(tab,n,3)

elif identificar_tuplos_nao_pertencentes(obter_linha(tab, 1), n) is True:
if obter_linha(tab, 1)[0] == -n and obter_linha(tab, 1)[1] == -n and obter_linha(tab, 1)[2] == 0:
return marcar_posicao(tab,n,3)
elif obter_linha(tab, 1)[0] == -n and obter_linha(tab, 1)[1] == 0 and obter_linha(tab, 1)[2] == -n:
return marcar_posicao(tab,n,2)
elif obter_linha(tab, 1)[0] == 0 and obter_linha(tab, 1)[1] == -n and obter_linha(tab, 1)[2] == -n:
return marcar_posicao(tab,n,1)

elif identificar_tuplos_nao_pertencentes(obter_linha(tab, 2), n) is True:
if obter_linha(tab, 2)[0] == -n and obter_linha(tab, 2)[1] == -n and obter_linha(tab, 2)[2] == 0:
return marcar_posicao(tab,n,6)
elif obter_linha(tab, 2)[0] == -n and obter_linha(tab, 2)[1] == 0 and obter_linha(tab, 2)[2] == -n:
return marcar_posicao(tab,n,5)
elif obter_linha(tab, 2)[0] == 0 and obter_linha(tab, 2)[1] == -n and obter_linha(tab, 2)[2] == -n:
return marcar_posicao(tab,n,4)

elif identificar_tuplos_nao_pertencentes(obter_linha(tab, 3), n) is True:
if obter_linha(tab, 3)[0] == -n and obter_linha(tab, 3)[1] == -n and obter_linha(tab, 3)[2] == 0:
return marcar_posicao(tab,n,9)
elif obter_linha(tab, 3)[0] == -n and obter_linha(tab, 3)[1] == 0 and obter_linha(tab, 3)[2] == -n:
return marcar_posicao(tab,n,8)
elif obter_linha(tab, 3)[0] == 0 and obter_linha(tab, 3)[1] == -n and obter_linha(tab, 3)[2] == -n:
return marcar_posicao(tab,n,7)

elif identificar_tuplos_nao_pertencentes(obter_diagonal(tab, 1), n) is True:
if obter_diagonal(tab, 1)[0] == -n and obter_diagonal(tab, 1)[1] == -n and obter_diagonal(tab, 1)[2] == 0:
return marcar_posicao(tab,n,9)
elif obter_diagonal(tab, 1)[0] == -n and obter_diagonal(tab, 1)[1] == 0 and obter_diagonal(tab, 1)[2] == -n:
return marcar_posicao(tab,n,5)
elif obter_diagonal(tab, 1)[0] == 0 and obter_diagonal(tab, 1)[1] == -n and obter_diagonal(tab, 1)[2] == -n:
return marcar_posicao(tab,n,1)

elif identificar_tuplos_nao_pertencentes(obter_diagonal(tab, 2), n) is True:
if obter_diagonal(tab, 2)[0] == -n and obter_diagonal(tab, 2)[1] == -n and obter_diagonal(tab, 2)[2] == 0:
return marcar_posicao(tab,n,3)
elif obter_diagonal(tab, 2)[0] == -n and obter_diagonal(tab, 2)[1] == 0 and obter_diagonal(tab, 2)[2] == -n:
return marcar_posicao(tab,n,5)
elif obter_diagonal(tab, 2)[0] == 0 and obter_diagonal(tab, 2)[1] == -n and obter_diagonal(tab, 2)[2] == -n:
return marcar_posicao(tab,n,7)


#3 Center
elif tab[1][1] == 0:
return marcar_posicao(tab,n,5)

#4 Opposite Corner
elif strat != 'basic':
if tab[0][0] != -n and tab[2][2] == 0:
return marcar_posicao(tab,n,9)
elif tab[0][2] != -n and tab[2][0] == 0:
return marcar_posicao(tab,n,7)
elif tab[2][0] != -n and tab[0][2] == 0:
return marcar_posicao(tab,n,3)
elif tab[2][2] != -n and tab[0][0] == 0:
return marcar_posicao(tab,n,1)

#5 Empty Corner
elif tab[0][0] == 0:
return marcar_posicao(tab,n,1)
elif tab[0][2] == 0:
return marcar_posicao(tab,n,3)
elif tab[2][0] == 0:
return marcar_posicao(tab,n,7)
elif tab[2][2] == 0:
return marcar_posicao(tab,n,9)

#6 What's left
elif tab [0][1] == 0:
return marcar_posicao(tab,n,2)
elif tab [1][0] == 0:
return marcar_posicao(tab,n,4)
elif tab [1][2] == 0:
return marcar_posicao(tab,n,6)
elif tab [2][1] == 0:
return marcar_posicao(tab,n,8) 

看到这里,如果我写下";选择(tab,n,'basic'(,而tab和n与此无关。在本例中,函数将跳过数字1和2,然后转到3,如果3不起作用,则它将跳过数字4,然后转到5,如果必要,则转到6;elif strat!='basic’:";在数字之前,但它不起作用,我不知道为什么。如果我strat=='basic',这是有效的,但如果strat=='normal',那么它就不起作用。这特别烦人,因为在我的实际代码中,strat可以是3种不同的东西。我希望你能理解我的问题。提前感谢各位!

更好的方法可能是将操作定义为函数,然后将这些操作存储在列表中,例如

def action_any_empty(board):
...
def action_empty_corner(board):
...
def action_opposite_corner(board):
...
easy =   [action_any_empty]
medium = [action_empty_corner] + easy
hard =   [action_opposite_corner] + medium
strats={"easy":easy,"medium":medium,"hard":hard}
for action in strats[difficulty]:
move = action(board)
if move:
return move

将它们作为类而不仅仅是函数可能会更好,然后它们都可以从某个父"操作"类继承,并且对它们进行迭代更安全。

相关内容

最新更新