我想编程一个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