最简单的方法就是多次模拟游戏。下面的 R 代码模拟单个游戏。
nplayers = 4
#Create an empty data frame to keep track
#of card number, suit and if it's magic
empty.hand = data.frame(number = numeric(52),
suit = numeric(52),
magic = numeric(52))
#A list of players who are in the game
players =list()
for(i in 1:nplayers)
players[[i]] = empty.hand
#Simulate shuffling the deck
deck = empty.hand
deck$number = rep(1:13, 4)
deck$suit = as.character(rep(c("H", "C", "S", "D"), each=13))
deck$magic = rep(c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), each=4)
deck = deck[sample(1:52, 52),]
#Deal out five cards per person
for(i in 1:length(players)){
r = (5*i-4):(5*i)
players[[i]][r,] = deck[r,]
}
#Play the game
i = 5*length(players)+1
current = deck[i,]
while(i < 53){
for(j in 1:length(players)){
playersdeck = players[[j]]
#Need to test for magic and suit also - left as an exercise!
if(is.element(current$number, playersdeck$number)){
#Update current card
current = playersdeck[match(current$number,
playersdeck$number),]
#Remove card from players deck
playersdeck[match(current$number, playersdeck$number),] = c(0,
0, 0)
} else {
#Add card to players deck
playersdeck[i,] = deck[i,]
i = i + 1
}
players[[j]] = playersdeck
#Has someone won or have we run out of card
if(sum(playersdeck$number) == 0 | i > 52){
i = 53
break
}
}
}
#How many cards are left for each player
for(i in 1:length(players))
{
cat(sum(players[[i]]$number !=0), "\n")
}
一些评论
- 您需要为魔术卡和套装添加几行,但数据结构已经存在。我想你不想要一个完整的解决方案?;)
- 要估计平均游戏时长,只需将上述代码放在一个函数中并多次调用即可。
- 当玩家拿到一张牌时,我发现与其动态增加一个向量,不如创建一个足够的稀疏数据框更容易。在这种情况下,每个玩家都有一个包含 52 行的数据框,他们永远不会填充(除非是 1 人游戏)。
- 这个游戏有一点策略元素。如果您可以玩多张牌,您应该怎么做。例如,如果出现 7H,而您手中有 7S、8H 和 JC。这三张牌都是“可玩的”。