我正在尝试在R中编写tic-tac-toe - 这是我的两个函数,用于移动和评估所有有效的移动(X是' s,零是O' s和{{ 1}}尚未拍摄):
NA
现在设置一个测试位置,评估所有有效的移动,然后进行这些移动......
move <- function(board,square,mark)
{
if (square < 1 || square > 9 || !is.na(board[square]))
{
return(NA)
}
else
board[square] <- mark
return(board)
}
valid.moves <- function(board)
{
return(which(is.na(board)))
}
...给出了我并不打算的结果:
test.last <- matrix(c(1,1,NA,0,NA,0,NA,0,1),nrow=3)
moves <- valid.moves(test.last)
move(test.last,moves,1)
我希望三个不同的电路板具有相应的有效移动(然后将使用另一个功能评估它是否为获胜位置)并且不是一个具有所有有效移动的电路板马上。
我不想用循环来做这件事但是矢量化不应该一次全部发生在&#39;内部&#39; [,1] [,2] [,3]
[1,] 1 0 1
[2,] 1 1 0
[3,] 1 0 1
功能,但&#39;外部&#39;它 - 所以基本上我想在没有循环的情况下执行以下操作(move
函数来评估位置的格式为eval.pos
):
eval.pos <- function(board){}
如何在没有循环的情况下完成此操作?
答案 0 :(得分:1)
move2 <- function(board, square, mark) {
lapply(square, function(x,i,value) `[<-`(x,i,value), x=board, value=mark)
}
请注意,需要匿名function()
,因为[<-
是原始的。
答案 1 :(得分:1)
在评论中扩展我的建议。如何使用矩阵索引生成移动选项列表:
valid.moves <- function(board)
{
return(which(is.na(board), arr.ind=TRUE))
}
> moves <- valid.moves(test.last)
> moves
row col
[1,] 3 1
[2,] 2 2
[3,] 1 3
> lapply(1:3, function( mv) {start <- test.last
start[matrix(moves[mv,],ncol=2)] <- 1
start})
[[1]]
[,1] [,2] [,3]
[1,] 1 0 NA
[2,] 1 NA 0
[3,] 1 0 1
[[2]]
[,1] [,2] [,3]
[1,] 1 0 NA
[2,] 1 1 0
[3,] NA 0 1
[[3]]
[,1] [,2] [,3]
[1,] 1 0 1
[2,] 1 NA 0
[3,] NA 0 1