我将不同意早期的一些海报,并说面向对象的方法在这里是错误的,因为它使事情变得更加复杂。
您所需要的只是跟踪每个玩家的位置,以及一个代表棋盘的向量。如果棋盘位置没有滑槽或梯子,则为 0。如果它包含梯子,则棋盘包含一个正数,表示要向前移动多少个位置。如果它包含一个滑槽,它包含一个负数来让你向后移动。只需跟踪每个玩家的回合数和位置即可。
使用这种方法进行的实际模拟非常简单,几乎可以用任何编程语言进行。我建议使用 R 或 python,但这只是因为这些是我这些天使用最多的。
我没有滑槽和梯子的副本,所以我做了一个小板。您必须放入正确的板:
#!/usr/bin/python
import random, numpy
board = [0, 0, 0, 3, 0, -3, 0, 1, 0, 0]
numplayers = 2
numruns = 100
def simgame(numplayers, board):
winner = -1
winpos = len(board)
pos = [0] * numplayers
turns = 0
while max(pos) < winpos:
turns += 1
for i in range(0, numplayers):
pos[i] += random.randint(1,6)
if pos[i] < winpos:
pos[i] += board[pos[i]]
if pos[i] >= winpos and winner == -1:
winner = i
return (turns, winner)
# simulate games, then extract turns and winners
games = [simgame(numplayers, board) for x in range(numruns)]
turns = [n for (n, w) in games]
winner = [w for (t, w) in games]
pwins = [len([p for p in winner if p == i]) for i in range(numplayers)]
print "runs:", numruns
print "mean(turns):", numpy.mean(turns)
print "sd(turns):", numpy.std(turns)
for i in range(numplayers):
print "Player", (i+1), "won with proportion:", (float(pwins[i])/numruns)