我怎么能预测一个简单的纸牌游戏的结果?

机器算法验证 r 可能性 游戏
2022-03-26 15:42:37

我想预测一个简单的纸牌游戏的结果,平均判断一个游戏会持续多长时间。

我的“简单”游戏是;

  • 牌从随机牌组发给 n 名玩家(通常为 2-4)
  • 每个玩家得到五张牌
  • 将牌堆顶的牌翻开
  • 每个玩家轮流放置相同面值的牌(即 1-10、J、Q、K、A)、相同花色(即红心、方块、黑桃、梅花)或任何花色的魔法牌(一个千斤顶)
  • 如果玩家可以放一张牌,他们就可以,否则他们必须从牌堆中取出一张牌
  • 轮流继续游戏,直到除一名玩家以外的所有玩家都没有剩余牌

我猜我可以编写代码来玩一个神话游戏并报告结果,然后运行该代码数千次。

有没有人这样做?他们能推荐做类似工作的代码吗(我最喜欢的语言是 R,但什么都可以)?有没有更好的办法 ?

1个回答

最简单的方法就是多次模拟游戏。下面的 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") 
}

一些评论

  1. 您需要为魔术卡和套装添加几行,但数据结构已经存在。我想你不想要一个完整的解决方案?;)
  2. 要估计平均游戏时长,只需将上述代码放在一个函数中并多次调用即可。
  3. 当玩家拿到一张牌时,我发现与其动态增加一个向量,不如创建一个足够的稀疏数据框更容易。在这种情况下,每个玩家都有一个包含 52 行的数据框,他们永远不会填充(除非是 1 人游戏)。
  4. 这个游戏有一点策略元素。如果您可以玩多张牌,您应该怎么做。例如,如果出现 7H,而您手中有 7S、8H 和 JC。这三张牌都是“可玩的”。