1

我认为 R 用户能够玩刽子手并制作 R 刽子手游戏很重要。问题是我没有为一般发布做很多情节,所以我不知道如何为用户提供一个独立于平台或 gui 的情节。

在这里您可以下载包含大型词库的完整包:

library(devtools); install_github("hangman", "trinker")

绘图的函数看起来像这样(为了可重复性,我让单词 bank 消失了):

hangman <- function() {
        #x1 <- DICTIONARY[sample(1:nrow(DICTIONARY), 1), 1]
        x1 <- "trapped"
        x <- unlist(strsplit(x1, NULL))
        len <- length(x)
        x2 <- rep("_", len)
        chance <- 0
        win1 <- 0
        win <- win1/len
        wrong <- character()
        right <- character()
        print(x2, quote = FALSE)
        hang.plot <- function(){ #plotting function
                plot.new()
                mtext("HANGMAN", col = "blue", cex=2)    
                mtext(paste(x2, collapse = " "), side = 1, cex=1.5) 
                mtext("wrong", side = 3, cex=1.5,
                          adj = 0, padj = 5, col = "red") 
                text(.015, .8, paste(wrong, collapse = "\n"), offset=.3, 
                         cex=1.5, adj=c(0,1))
                mtext("correct", side = 3, cex=1.5,
                          adj = 1, padj = 5, col = "red")
                text(.96, .8, paste(right, collapse = "\n"), offset=.3, 
                         cex=1.5, adj=c(0,1))
                segments(.365, .77, .365, .83, lwd=2)
                segments(.365, .83, .625, .83, lwd=2)
                segments(.625, .83, .625, .25, lwd=2)
                segments(.57, .25, .675, .25, lwd=2)
                parts <- seq_len(length(wrong))
                if (identical(wrong, character(0))) {
                        parts <- 0
                }
                if (1 %in% parts) {
                        mtext("O", side = 1, cex=4, adj = .365, padj = -7.2)
                        mtext("o o", side = 1, cex=1, adj = .3725, padj = -28.2)
                        mtext("<", side = 1, cex=1, adj = .373, padj = -27.6)
                        mtext("__", side = 1, cex=1, adj = .373, padj = -27.2)
                }
                if (2 %in% parts) {
                        mtext("I", side = 1, cex=4, adj = .375, padj = -6.25)
                        mtext("I", side = 1, cex=4, adj = .375, padj = -5.5)
                        mtext("I", side = 1, cex=4, adj = .375, padj = -4.75)
                }
                if (3 %in% parts) {
                        segments(.37, .57, .45, .63, lwd=7)
                }
                if (4 %in% parts) {
                        segments(.37, .57, .29, .63, lwd=7)
                }
                if (5 %in% parts) {
                        segments(.37, .426, .43, .3, lwd=7)
                        mtext("__", side = 1, cex = 1, adj = .373, 
                                  padj = -27.2, col = "white")
                        mtext("O", side = 1, cex = 1.25, adj = .373, padj = -21.5, 
                                  col="red")
                }
                if (6 %in% parts) {
                        segments(.37, .426, .31, .3, lwd = 7)
                        mtext("o o", side = 1, cex = 1, adj = .3725, 
                                  padj = -28.2, col="white")
                        mtext("x x", side = 1, cex=1, adj = .3725, padj = -28.2)
                        mtext("You Lose", side = 1, cex=8, padj = -3, 
                                  col = "darkgreen")
                        mtext(paste(x2, collapse = " "), side = 1, cex=1.6, col="white") 
                        mtext(paste(x2, collapse = " "), side = 1, cex=1.5, col="white") 
                        mtext(paste(x2, collapse = " "), side = 1, adj = .51, cex=1.6, 
                                  col="white")
                        mtext(paste(x, collapse = " "), side = 1, cex=1.5)
                }
                if (win1 == len) {
                        mtext("WINNER!", side = 1, cex=8, padj = -3, 
                                  col = "green")
                        mtext("WINNER!", side = 1, cex=8, adj = .1, padj = -3.1, 
                                  col = "darkgreen")
                }
        } #end of hang.plot
        guess <- function(){#start of guess function
                cat("\n","Choose a letter:","\n") 
                y <- scan(n=1,what = character(0),quiet=T)
                if (y %in% c(right, wrong)) {
                        stop(paste0("You've already guessed ", y))
                }
                if (!y %in% letters) {
                        stop(paste0(y, " is not a letter"))
                }
                if (y %in% x) {
                        right <<- c(right, y)
                        win1 <<- sum(win1, sum(x %in% y)) 
                        win <<- win1/len 
                        message(paste0("Correct!","\n"))
                } else {
                        wrong  <<- c(wrong, y)
                        chance  <<- length(wrong)
                        message(paste0("The word does not contain ", y, "\n"))
                }
                x2[x %in% right] <<- x[x %in% right]
                print(x2, quote = FALSE)
                hang.plot()
        }#end of guess function
        hang.plot()
        while(all(win1 != len & chance < 6)){ 
                try(guess())
        } 
        if (win == 1) {
                outcome <- "\nCongratulations! You Win!\n"
        } else {
                outcome <- paste("\nSorry. You loose. The word is:", x1, "\n")
        }
        cat(outcome)
}

这在我创建它的 RGUI(在 Windows 中)上看起来很棒,但在 RStudio 中配置错误。如何使代码以一种独立于 gui/平台的方式排列/看起来不错的方式绘制所有内容(我的朋友 bryangoodrich 建议使用网格作为一种可能性)?

4

2 回答 2

1

尝试使用text()而不是mtext(). 必须重新考虑所有坐标。未测试。

于 2012-07-24T16:04:12.143 回答
1

按照艾伦的回答,如果您坚持将头部绘制为字母“O”,那么您需要计算字符的高度,并使用text而不是mtext. 例如,这在 rgui 和 RStudio(在 Windows 上)中都可以将头部附加到第一个segment

plot.new()
segments(0.365, 0.77, 0.365, 0.83, lwd = 2)
text(0.365,0.77-strheight("O", cex=4)/2,"O", cex=4)

调整大小不起作用,但你明白了。

于 2012-07-25T03:56:45.550 回答