本题要求输入一个井字棋的当前状态,系统输出玩家x当前状态下所能采取的动作以及相应的得分,例如输入:['x','o',2,3,4,5,6,7,8],表示玩家x和玩家o各下了一颗棋子,则系统输出:
[(2, 0), (3, 1), (4, 1), (5, 0), (6, 1), (7, 0), (8, 0)]
表示玩家x若在3或4或6处落子,则能取胜。
注意:
1. 输入的棋面必须是该轮到x落子了(本题假设玩家x是先手)
2. 本题以玩家x为视角,因此x胜得1分,o胜得-1分,平局0分
你需要完成以下多个函数。
你需要完成以下多个函数,接口定义如下:
判断当前盘面s是否是终局(任意一方获胜或平局则返回True,否则返回False)
def terminal_test(s):
返回当前盘面s,玩家min(本题指玩家o)行动下的得分
def minValue(s):
返回当前盘面s,玩家max(本题指玩家x)行动下的得分
def maxValue(s):
返回当前盘面s,采取动作a后的状态。注意:
1. 你需要根据盘面情况自行判断当前玩家是x还是o
2. 不能直接修改s,需要另外生成一个新的状态(盘面),因为对于s的修改在函数返回后仍然是有效的
def result(s,a):
裁判测试程序样例:
def actions(s):
a = []
for i in range(9):
if s[i] in list(range(9)):
a.append(i)
return a
def utility(s):
win = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
for r in win:
if s[r[0]] == s[r[1]] == s[r[2]] == 'x':
return 1
if s[r[0]] == s[r[1]] == s[r[2]] == 'o':
return -1
return 0
def miniMaxDecision(s):
c = []
for a in actions(s):
v = minValue(result(s,a))
c.append((a,v))
print(c)
_,bestAction = max(enumerate(c),key=lambda x: x[1][1])
return bestAction
if __name__ == '__main__':
#例如, 输入['x','o',2,3,4,5,6,7,8]
str = input("")
s = eval(str)
miniMaxDecision(s)
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
['x','o',2,3,4,5,6,7,8]
输出样例:
在这里给出相应的输出。例如:
[(2, 0), (3, 1), (4, 1), (5, 0), (6, 1), (7, 0), (8, 0)]
示例:
def terminal_test(s):
win = [(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)]
for r in win:
if s[r[0]] == s[r[1]] == s[r[2]] == 'x' or s[r[0]] == s[r[1]] == s[r[2]] == 'o':
return True
flag = 0
for i in range(9):
if s[i] in range(9):
flag += 1
if flag == 0:
return True
else:
return False
def minValue(s):
if terminal_test(s):
return utility(s)
else:
v = float('inf')
for a in actions(s):
v = min(v, maxValue(result(s, a)))
return v
def maxValue(s):
if terminal_test(s):
return utility(s)
else:
v = float('-inf')
for a in actions(s):
v = max(v, minValue(result(s, a)))
return v
def result(s, a):
temp = {}
x = 0
o = 0
for i in range(9):
if s[i] == 'x':
x += 1
elif s[i] == 'o':
o += 1
temp[i] = s[i]
if x > o:
temp[a] = 'o'
elif x == o:
temp[a] = 'x'
return temp