使用R中的GUI创建Tic Tac Toe游戏

时间:2011-04-30 02:22:16

标签: r game-engine

我正在尝试使用GUI在R中制作一个简单的Tic Tac Toe游戏,我将使用它而不是AI。设计3x3按钮很容易。困扰我的是下一步。一旦我点击任何按钮,我希望O先出现,然后是X。我应该写什么代码? 请帮助

2 个答案:

答案 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的跟踪可能是最简单的,但您也可以使用% %。