如何在R中绘制随投掷结果变化的骰子 用于快艇骰子游戏开发
两个思路都可行,更推荐结合两者优势实现,不用提前存储素材,调用灵活且适配你现有的布局需求
首先修正你现有掷骰子函数的语法问题,增加边界校验:
rolls_the_dice <- function(X1 = 5){ if(X1 <= 5 & X1 >= 1){ return(sample(1:6, X1, replace = TRUE)) } else { stop("单次投掷骰子数量需在1-5之间") } }
核心实现逻辑
写一个独立的单个骰子绘制函数,传入点数、绘制起始坐标、骰子尺寸即可直接渲染对应骰子,无需预存素材:
# 单个骰子绘制函数 draw_single_dice <- function(point, x_left, y_bottom, size = 50) { # 绘制骰子外框 rect(xleft = x_left, xright = x_left + size, ybottom = y_bottom, ytop = y_bottom + size, col = "white", border = "black") # 预定义1-6点对应的点位相对坐标(按骰子尺寸比例设置,适配任意大小) point_loc <- list( `1` = matrix(c(0.5, 0.5), ncol = 2), `2` = matrix(c(0.2, 0.8, 0.8, 0.2), ncol = 2, byrow = TRUE), `3` = matrix(c(0.2, 0.8, 0.5, 0.5, 0.8, 0.2), ncol = 2, byrow = TRUE), `4` = matrix(c(0.2, 0.2, 0.2, 0.8, 0.8, 0.2, 0.8, 0.8), ncol = 2, byrow = TRUE), `5` = matrix(c(0.2, 0.2, 0.2, 0.8, 0.5, 0.5, 0.8, 0.2, 0.8, 0.8), ncol = 2, byrow = TRUE), `6` = matrix(c(0.2, 0.2, 0.2, 0.5, 0.2, 0.8, 0.8, 0.2, 0.8, 0.5, 0.8, 0.8), ncol = 2, byrow = TRUE) ) # 计算实际坐标绘制点数 pos <- point_loc[[as.character(point)]] points(x = x_left + pos[,1] * size, y = y_bottom + pos[,2] * size, pch = 19, cex = 2, col = "black") }
再写批量绘制函数,完全适配你第一个思路的5个骰子布局:
# 绘制一次投掷的5个骰子结果 draw_yahtzee_dice <- function(roll_res) { if(length(roll_res) != 5) stop("仅支持绘制5个骰子的投掷结果") # 初始化绘图区域,参数和你现有代码完全对齐 plot(c(0, 200), c(0, 170), type = "n", xlab = "", ylab = "", axes = F, main = "") # 对应你现有代码的5个骰子左下角坐标 dice_pos <- list( c(30, 0), c(0, 100), c(70, 100), c(140, 100), c(120, 0) ) # 循环绘制所有骰子 for (i in 1:5) { draw_single_dice(roll_res[i], dice_pos[[i]][1], dice_pos[[i]][2], size = 50) } }
使用示例
# 投掷骰子 result <- rolls_the_dice() # 绘制结果 draw_yahtzee_dice(result)
方案优势
- 无需预存储任何素材,所有元素按需渲染,修改骰子样式、大小、布局都只需要调整对应参数即可
- 完全兼容你原有布局逻辑,不需要调整位置规划
- 可扩展性强,后续要实现重投指定骰子的功能,只需要重绘对应位置的骰子即可,不需要刷新整个画布
内容的提问来源于stack exchange,提问作者Fern
相关产品推荐
相关产品推荐

