我正在尝试使用GUI在R中制作一个简单的Tic Tac Toe游戏,我将使用它而不是AI。设计3x3按钮很容易。困扰我的是下一步。一旦我点击任何按钮,我希望O先出现,然后是X。我应该写什么代码? 请帮助
答案 0 :(得分:2)
我最近一直在研究gWidgetsWWW2,这是一个使用伟大的新Rook软件包编写本地Web应用程序的软件包。 gWidgetsWWW2包使用canvas包并且有一个事件处理程序,允许你模仿locator()函数的功能,你可以使用它来与基本图形进行tic-tac-toe。您也可以使用gWidgetsRGtk2执行此操作,只需稍加修改。
要运行以下脚本,您需要
a)保存为某物,说tic-tac-toe.r
b)安装gWidgetsWWW2。目前仅适用于r-forge:
install.packages("gWidgetsWWW2", repos="http://R-Forge.R-project.org")
c)使用
运行应用程序load_app("tic-tac-toe.r")
这是脚本:
w <- gwindow("Tic-Tac-Toe")
sb <- gstatusbar("Powered by gWidgetsWWW2 and Rook", cont=w)
ghtml("Tic-Tac-Toe, three in a row", cont=w)
## sizing
margin <- 10
sz <- 130
width <- height <- 3*sz + 2 * margin
state <- matrix(character(9), nrow=3)
x_move <- TRUE
sym <- c("o", "x")
f <- tempfile()
cnv <- gcanvas(f, width=width, height=height, cont=w)
make_board <- function() {
## make board
for(i in seq(margin + sz, margin + 2*sz, by=sz)) {
cnv$lines(c(margin, width-margin), c(i, i))
cnv$lines(c(i, i), c(margin, width-margin))
}
}
draw_x <- function(i, j) {
delta <- sz/10
cnv$lines(margin + sz *c(i-1, i) + delta*c(1,-1),
margin + sz *c(j-1, j) + delta*c(1,-1))
cnv$lines(margin + sz *c(i-1, i) + delta*c(1,-1),
margin + sz *c(j, j-1) + delta*c(-1,1))
}
draw_o <- function(i, j) {
cnv$circle(margin + (i-1/2)*sz, margin + (j-1/2)*sz, r = (3/8)*sz)
}
notify_winner <- function(mark) {
if(mark == "x") {
svalue(sb) <- "Congrats, x won"
} else {
svalue(sb) <- "Congrats, o won"
}
}
check_winner <- function() {
## x
is_winner <- function(mark) {
any(colSums(state == mark) == 3) ||
any(rowSums(state == mark) == 3) ||
sum((state == mark)[c(1,5,9)]) == 3 ||
sum((state == mark)[c(3,5,7)]) == 3
}
if(is_winner("x")) {
notify_winner("x")
removeHandler(cnv, cbid)
return(TRUE)
} else if(is_winner("o")) {
notify_winner("o")
removeHandler(cnv, cbid)
return(TRUE)
}
return(FALSE)
}
cbid <- addHandlerClicked(cnv, handler=function(h,...) {
i <- 1 + (h$X - margin) %/% sz
j <- 1 + (h$Y - margin) %/% sz
if(i %in% 1:3 && j %in% 1:3) {
if(state[i,j] == "") {
state[i,j] <<- sym[1 + x_move]
if(x_move) {
draw_x(i,j)
} else {
draw_o(i,j)
}
x_move <<- !x_move
if(!check_winner())
svalue(sb) <- "Click to move"
} else {
svalue(sb) <- "Already selected that cell"
}
}
})
## Start
make_board()
svalue(sb) <- "Click to move"
答案 1 :(得分:0)
查看sudoku包中playSudoku函数的代码,了解与图形交互的一些示例。在TeachingDemos包中还有几个交互式图形的例子。
可能就像使用定位器函数来确定单击的位置和添加X或O的文本函数一样简单。使用if和else跟踪X与O的跟踪可能是最简单的,但您也可以使用% %。