我正在为我的学校项目编写一个连接四人工智能程序。但是,首先,我想模拟6(行)*7(列)上的每一个可能的移动,然后编写极小极大算法来完成板的每个阶段的完美移动。而不是使用
for a in range(7):
place_player_disk()
complete_set.append
if check_win():
continue
for b in legal_move():
place_AI_disk()
complete_set.append
if check_win()
continue
.... #repeat the nested for loop 42 times我想用一种更整洁的方法
state0=[['','','','','','',''],['','','','','','',''],['','','','','','',''],['','','','','','',''],['','','','','','',''],['','','','','','',''],['','','','','','','']]
complete_set=[[],[],[],[],[],[]...]
import copy
def playerplacetoken(perimeter,location):
count=0
for row in range(6):
if perimeter[row][location]=='X' or perimeter[row][location]=='Y':
count+=1
perimeter[5-count][location]='X'
def full(perimeter):
free = []
for column in range(7):
if perimeter[0][column] == '':
free.append(column)
return free
def PlacingCPUToken(perimeter,location):
count=0
for row in range (6):
if perimeter[row][location]=='X' or perimeter[row][location]=='Y':
count+=1
perimeter[5-count][location]='Y'
def CheckP(perimeter):
changerow=[0,1,1]
changecolumn=[1,0,1]
Pwin=False
for col in range(7):
for row in range (6):
for change in range (3):
try:
consecutivecount=0
for nochange in range(4):
if perimeter[row+(changerow[change]*(nochange))] [col+(changecolumn[change]*(nochange))]=='X':
consecutivecount+=1
if consecutivecount==4:
Pwin=True
except:
continue
return Pwin
def CheckC(perimeter):
changerow=[0,1,1]
changecolumn=[1,0,1]
Cwin=False
for col in range(7):
for row in range (6):
for change in range (3):
try:
consecutivecount=0
for nochange in range(4):
if perimeter[row+(changerow[change]*(nochange))][col+(changecolumn[change]*(nochange))]=='Y':
consecutivecount+=1
if consecutivecount==4:
Cwin=True
except:
continue
return Cwin
def recursive(state,move): #state: the state of board, first starts with an empty board and as the function loops, the state changes Move: no of moves taken by both the player and the computer
for a in full(state): #full returns a list of legal moves, which means columns that are not full
state1= copy.deepcopy(state)
playerplacetoken(state1, a)
complete_set[move].append(state1)
if CheckP(state1): #Check p returns boolean, checking if the player has won
continue
for b in full(state1):
state2= copy.deepcopy(state1)
PlacingCPUToken(state2, b)
complete_set[move+1].append(state2)
if CheckC(state2): #Check C checks if the computer wins and return a boolean
continue
while move<44:
move+=2
recursive(state2,move)
recursive(state0,0)但这不能正常工作(我的意思是它没有错误,但结果是不正确的),我真的不知道如何使用递归function.Please帮助!
发布于 2017-06-13 19:30:55
complete_set。return步骤中提取任何内容。正因为如此,在嵌套步骤中计算出来的信息无法传输到调用步骤。
UPDATE:状态确实是通过递归步骤更新的:complete_set[...].append(...)这样做,因为complete_set是全局的。
试着考虑一下您要编写的函数的类型。
例如,它需要一个状态和一个整数深度级别。它返回一个可能的移动列表,如果深度太大,该列表是空的。
您可能真正想要的是一棵移动树,其中列表中的每个元素都是一对:(move, [...])。这个列表包含相同类型的对:在它之后可能有一个子树的移动,等等。叶子有一组空的可能移动。
在构建节点时,可以考虑直接计算实用程序函数的值。
如果你让计算变懒(使用yield和生成器),那么α-beta剪枝也会变得很容易实现。
https://stackoverflow.com/questions/44529644
复制相似问题