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
相关产品推荐
相关产品推荐

