r-试图决定谁在模拟游戏中先掷骰子



该代码用于决定谁将是游戏Wazabi(由Gigamic开发的流行游戏)中的第一个玩家。所以你理解了我要做的事情的要点,下面的程序决定谁先去:

  1. 每个玩家都掷一个由三个结果组成的4,6面骰子(三个面有"W",两个面的"C",另一个面的"G",所以你掷W的概率为3/6)。

  2. 掷W最多的玩家获胜。

  3. 在不止一个玩家掷出最高数量的W的情况下,掷出最高数字的玩家重新掷4个骰子,然后具有最高W的玩家成为第一个(这可能会递归发生)。

我在r中设计了下面的代码(尽管很混乱),试图决定这个球员应该是谁,但经过几个小时的尝试和疲惫的大脑,我希望你们中的一个人能帮助我。以下是我的代码在R控制台中的输出:

who_first <- function(){
  dummylist <- c()
  playersdummy <- 1:number_of_players
  first_rolling <- function(players_left=number_of_players){
    for(i in 1:players_left){
      # Random variable where 1, 2 & 3 represents Ws, Cs and Gs respectively.
      die_poss <- c(1, 1, 1, 2, 2, 3)
      die_result <- sample(die_poss, 4, replace=T)
      dummy2 <- 0
      for(j in 1:4){
        if(die_result[j]==1){
          dummy2 <- dummy2 + 1
        }
      }
      dummy3 <- append(dummylist, dummy2, after=i)
      # dummylist stores the number of Ws rolled by each respective player, 
      # i.e. first element says how many Ws 1st player still left in rolled.
      dummylist <<- dummy3 
    }
    dummy4 <- 0
    for(k in 1:players_left){
      if(dummylist[k]==max(dummylist)){
        # dummy4 represents the number of players who rolled the highest number of Ws that roll.
        dummy4 <<- dummy4 + 1 
      }
    }
    return(dummy4)
  }
  while(dummy4 >= 1){
    if(dummy4==1){
      playersdummy <<- playersdummy[(which(dummylist==max(dummylist))==TRUE)]
      return(playersdummy)
    }
    else if(dummy4 > 1){
      dummy5 <- c()
      for(l in 1:length(playersdummy)){
        if(any((playersdummy[l]==which(dummylist==max(dummylist)))==TRUE)){
          dummy6 <- append(dummy5, playersdummy[l], after=l)
          dummy5 <<- dummy6
        }
      }
      # playersdummy becomes the vector containing which players are left in the game, i.e. 2 represents player 2.
      playersdummy <<- dummy5 
      dummylist <<- c()
      first_rolling(length(playersdummy))
    }
  }
}

 who_first()
 [1] 1 2 3 4 5 6 7
 Warning message:
 In max(dummylist) : no non-missing arguments to max; returning -Inf*

number_of_players在另一个函数中被全局定义为游戏中的玩家数量在这个测试中等于7

很明显,我应该返回一个长度为1的向量,其中包含在多次滚动和重新滚动后滚动W最多的玩家的玩家编号。此外,由于我对R还很陌生,我不太确定警告信息是什么意思,如果有人能解释一下会有帮助的话。

下面的代码显然遵循了您的算法,但比您的尝试简单得多。

这个想法很简单:由于C和G的结果没有区别,你可以让它们相同,值为0。将W结果设为1,并将其滚动的次数相加。然后检查是否有赢家,如果没有,只保持最高平局并重复。

看起来,只掷一次骰子会简单得多,在平局的情况下,保持骰子并再次掷骰子。但也许还有更多。

who_first <- function(n) {
  players <- seq_len(n)
  found_winner <- FALSE
  die_poss <- c(rep(c(0, 1), each = 3))
  while (!found_winner) {
    cat("Rolling for players", paste(players, collapse = ", "), "n")
    results <- replicate(length(players), sum(sample(die_poss, 4, replace=T)))
    cat("Players rolled", paste(results, collapse = ", "), "pointsn")
    if (sum(max(results) == results) == 1) {
      found_winner <- TRUE
      winner <- players[which.max(results)]
      cat("Winner is player", winner, "n")
    } else {
      players <- players[max(results) == results]
    }
  }
  invisible(winner)
}

一些运行:

> set.seed(10)
> who_first(7)
Rolling for players 1, 2, 3, 4, 5, 6, 7 
Players rolled 2, 0, 3, 1, 1, 3, 2 points
Rolling for players 3, 6 
Players rolled 2, 2 points
Rolling for players 3, 6 
Players rolled 4, 1 points
Winner is player 3 
> who_first(7)
Rolling for players 1, 2, 3, 4, 5, 6, 7 
Players rolled 0, 2, 1, 1, 0, 3, 1 points
Winner is player 6 
> who_first(7)
Rolling for players 1, 2, 3, 4, 5, 6, 7 
Players rolled 3, 1, 2, 1, 1, 3, 2 points
Rolling for players 1, 6 
Players rolled 0, 3 points
Winner is player 6 

最新更新