该代码用于决定谁将是游戏Wazabi(由Gigamic开发的流行游戏)中的第一个玩家。所以你理解了我要做的事情的要点,下面的程序决定谁先去:
-
每个玩家都掷一个由三个结果组成的4,6面骰子(三个面有"W",两个面的"C",另一个面的"G",所以你掷W的概率为3/6)。
-
掷W最多的玩家获胜。
-
在不止一个玩家掷出最高数量的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