2011-04-30 9 views
0

GUIを使ってRで単純なTic Tac Toeゲームを作ろうとしています。 3x3ボタンを設計するのは簡単です。私を悩ましているのは次のステップです。一度ボタンをクリックすると、Oが最初に来て、Xが来るようにします。どのようなコードを書くべきですか? HELP PLEASEGUIを使ってTic Tac Toeゲームを作成するR

+0

は多分設計するためにあなたのコードを掲載することにより起動します。

install.packages("gWidgetsWWW2", repos="http://R-Forge.R-project.org")

C)ここで

load_app("tic-tac-toe.r") 

でアプリを実行するスクリプトです3 x 3ボタン。 – Chase

+0

実際、私はこのレベルの対話性を備えたグラフを作っていきたいと思っています –

+0

[あなたは何を試しましたか?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) –

答えて

0

グラフとのやりとりの例については、sudokuパッケージのplaySudoku関数のコードを見てください。 TeachingDemosパッケージにはインタラクティブグラフィックスのいくつかの例があります。

クリックした場所とXまたはOを追加するテキスト関数を指定するためにロケータ関数を使用するのと同じくらい簡単かもしれません.X vs. Oを追跡するのはおそらくifとelseを使用すると最も簡単ですが、 %%。

2

私は最近、素晴らしい新しいRookパッケージを使用してローカルWebアプリケーションを作成するパッケージであるgWidgetsWWW2に取り組んでいます。 gWidgetsWWW2パッケージはキャンバスパッケージを使用し、基本グラフィックスでtic-tac-toeを実行する場合に使用するlocator()関数の機能を模倣できるイベントハンドラを備えています。また、gWidgetsRGtk2を使用して以下のように少し変更してこれを行うこともできます。 a)のものとして保存

に実行するには、次のスクリプトの

は、あなたが必要となり、チック・タック・toe.r

b)はgWidgetsWWW2をインストールすると言います。今のところ唯一の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" 
関連する問題