You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言新手求助:滑梯梯子游戏模拟进阶实现指导

滑梯梯子游戏(Chutes and Ladders)R语言模拟实现

需求说明

  • 实现滑梯梯子游戏的单玩家模拟,输出每轮详细过程(轮次、起始位置、骰子点数、落地位置、滑梯/梯子触发情况、最终位置)
  • 估算单玩家10轮后的平均位置
  • 多次模拟后计算位置方差,并绘制分布直方图

完整实现代码

# 定义滑梯与梯子的位置映射:键为触发位置,值为跳转后的目标位置
chutes_ladders <- c(
  # 梯子(低位跳高位)
  "1" = 38, "4" = 14, "9" = 31, "21" = 42, "28" = 84, "36" = 44,
  "51" = 67, "71" = 91, "80" = 100,
  # 滑梯(高位跳低位)
  "16" = 6, "47" = 26, "49" = 11, "56" = 53, "62" = 19, "64" = 60,
  "87" = 24, "93" = 73, "95" = 75, "99" = 78
)

# 单玩家指定轮数模拟函数
simulate_single_game <- function(max_turns = 10, max_position = 100, n_sides_die = 6) {
  # 初始化数据框存储每轮记录
  game_log <- data.frame(
    turn_num = integer(),
    start_pos = integer(),
    die_roll = integer(),
    land_pos = integer(),
    trigger = character(),
    end_pos = integer(),
    stringsAsFactors = FALSE
  )
  
  position <- 0  # 初始位置(起点)
  
  for (turn in 1:max_turns) {
    start_pos <- position
    die_roll <- sample.int(n_sides_die, 1)
    land_pos <- start_pos + die_roll
    
    # 处理到达/超过终点的情况
    if (land_pos >= max_position) {
      end_pos <- max_position
      trigger <- "到达终点"
    } else {
      # 检查是否触发滑梯或梯子
      if (as.character(land_pos) %in% names(chutes_ladders)) {
        end_pos <- chutes_ladders[as.character(land_pos)]
        trigger <- ifelse(end_pos > land_pos, paste0("梯子→", end_pos), paste0("滑梯→", end_pos))
      } else {
        end_pos <- land_pos
        trigger <- NA_character_
      }
    }
    
    # 写入本轮记录
    game_log <- rbind(game_log, data.frame(
      turn_num = turn,
      start_pos = start_pos,
      die_roll = die_roll,
      land_pos = land_pos,
      trigger = trigger,
      end_pos = end_pos,
      stringsAsFactors = FALSE
    ))
    
    # 更新当前位置
    position <- end_pos
    
    # 到达终点则提前终止游戏
    if (position >= max_position) break
  }
  
  return(game_log)
}

# 示例:运行一次10轮模拟
single_game_result <- simulate_single_game()
print(single_game_result, row.names = FALSE)

输出说明

运行代码后会生成结构化的轮次记录,格式与你预期一致:

turn_num start_pos die_roll land_pos   trigger end_pos
        1         0        1        1 梯子→38      38
        2        38        4       42      <NA>      42
        3        42        1       43      <NA>      43
        4        43        2       45      <NA>      45
        5        45        5       50      <NA>      50
        6        50        3       53      <NA>      53
        7        53        6       59      <NA>      59
        8        59        2       61      <NA>      61
        9        61        3       64 滑梯→60      60
       10        60        3       63      <NA>      63

统计分析:多次模拟计算指标与绘图

# 设置模拟次数(建议10000次以上保证统计稳定性)
n_simulations <- 10000

# 批量模拟,收集每局10轮后的最终位置
final_positions <- replicate(n_simulations, {
  game <- simulate_single_game()
  tail(game$end_pos, 1)
})

# 计算统计量
mean_position <- mean(final_positions)
var_position <- var(final_positions)

cat("10轮后平均位置:", round(mean_position, 2), "\n")
cat("位置方差:", round(var_position, 2), "\n")

# 绘制位置分布直方图
hist(final_positions, 
     main = "10轮后玩家位置分布",
     xlab = "最终位置",
     ylab = "模拟次数",
     col = "lightblue",
     breaks = seq(0, 100, 5))

关键提示

  • 滑梯/梯子的位置映射可根据实际游戏规则调整,代码中使用经典版规则
  • 模拟函数内置终点判断,到达100后会提前结束游戏
  • 批量模拟使用replicate实现,高效且结果可靠

内容的提问来源于stack exchange,提问作者sid more

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:10:19