r如何在TIC-TAC-TOE游戏中定义[]功能?面向对象的编程



我想编程一个tic-tac-toe游戏。

print(state)
1 | 2 | 3
---------
4 | 5 | 6
---------
7 | 8 | 9

以及如何定义[]函数,以使以下代码起作用:

state[5] <- "x"
state
1 | 2 | 3
---------
4 | x | 6
---------
7 | 8 | 9

以下是我的完整代码:

state <- as.character(c(1:9))
ttt<-function(state=NULL)
{
  if(is.null(state)==TRUE)
    state<-character(9)
  state<-as.character(state)
  rtrn<-list()
  class(rtrn)<-"ttt"
  rtrn$state<-state
  return(rtrn)
}
state<-ttt(state)
print.ttt<-function(ttt)
{
  state<-ttt$state
  print(cat(state[1]," | ",state[2]," | ",state[3],"n",state[4]," | ",state[5]," | ",state[6],"n",state[7]," | ",state[8]," | ",state[9],"n",sep=""))
}
state

print功能工作。是的。但是

state[2]<-"x"  ##this code do not work, I don't know how to program [] function in this case

正如我在评论中提到的那样,而不是编码您自己的自定义[[<-方法,我们只能从字符矢量类中制作您的ttt类继承方法。我已经简化了您的代码:

ttt <- function(state) {
    if (missing(state)) {
        state <- as.character(1:9)
    }
    class(state) <- c(class(state), "ttt")
    return(state)
}

关键的新部分是class(state) <- c(class(state), "ttt"),我们不替换为旧类,我们只是添加。我们仍将提供我们自己的print.ttt方法,但是我们不提供的任何功能都将落后于character默认值。

print.ttt <- function(ttt) {
    seps <- rep(c(" | ", " | ", "n"), 3)
    cat(as.vector(rbind(ttt, seps)), sep = "")
    invisible(ttt)
}

我也简化了一些打印。现在让我们看看它的工作原理:

> game <- ttt()
> game
1 | 2 | 3
4 | 5 | 6
7 | 8 | 9
> game[5] <- 'x'
> game
1 | 2 | 3
4 | x | 6
7 | 8 | 9
> game[1] <- 'o'
> game
o | 2 | 3
4 | x | 6
7 | 8 | 9

最新更新