我对Python有些新手,这是一个功课问题,所以我不会感谢任何答案,只是建议帮助我理解。我正在编写一个游戏程序,它可以相互演绎两种不同的策略 - 贪婪策略和放大策略,我已将其作为函数编写。我有一个游戏功能需要通过我的贪婪和放大功能,以及游戏板。我需要能够先将战略功能放在首位。到目前为止,我只能把它放到我贪婪策略的第一位。
def game(P1,P2,board):
P1 = 0
P2 = 0
for x in range(len(board)):
if x%2 == 0:
move = greedy(board)
P1 += board[move]
board.remove(board[move])
else:
move = zoomin(board)
P2 += board[move]
board.remove(board[move])
if P1 > P2:
return 1
elif P1 == P2:
return 0.5
else:
return 0
这个策略总是假设P1是贪婪的功能,但我需要能够先玩。我以为我可以传递函数,所以我的调用将是
game(greedy,zoomin,board)
但我不确定如何实际实现它,以便它可以识别谁在先玩。
提前感谢您的帮助!
编辑:
以下是我的贪婪和zoomin功能:
def greedy(board):
if board[0] > board[len(board)-1]:
#returns position of first item
return 0
elif board[len(board)-1] > board[0]:
#returns position of last item
return len(board)-1
else:
#if board[-1] == board[0]
return 0
def zoomin(board):
if len(board)%2 == 0:
evens = 0
odds = 0
for x in range(len(board)):
if x%2 ==0:
evens += board[x]
else:
odds += board[x]
if evens > odds:
return 0
else:
return len(board)-1
else:
#choose the larger value (greedy)
if board[0] < board[len(board)-1]:
return len(board)-1
else:
return 0
答案 0 :(得分:4)
这不是你问题的直接答案(因为senshin已经回答了),但我想指出你可以通过使用数组来减少代码重复。例如,像这样:
def game(players, board):
scores = [0] * len(players)
while i in range(len(board))
p = i % len(players)
move = players[p](board)
scores[p] += board[move]
del board[move] # <-- This is also a faster and more fail-safe version of your "board.remove(board[move])"
return scores
然后,您可以将此功能称为game([greedy, zoomin], board)
。还要注意它是如何扩展到任意数量的玩家,尽管这可能对你没有用。 :)
答案 1 :(得分:2)
您需要稍微重写game
功能。请注意,您的game
函数接受P1
和P2
,但您没有对它们执行任何操作 - 您会立即将0
分配给它们。
解决此问题的正确方法是让game
函数接受两个策略,可以是greedy
或zoomin
,也可以是其他任何后来提出来。
def game(strategy1, strategy2, board):
您还需要将函数体中的greedy
和zoomin
的显式调用替换为(例如move = greedy(board)
),并调用传递给函数的策略 - 例如{ {1}}。
然后,为了让move = strategy1(board)
先播放,greedy
播放第二,您可以致电:
zoomin
或者如果你想先game(greedy, zoomin, board)
和zoomin
秒,你可以打电话:
greedy
正如您所看到的,游戏顺序取决于您将两种策略传递到函数中的顺序。如果需要澄清,请告诉我。