私は Clojure を学んでいて、単純な三目並べ (またはモーピオン) を実装しようとしています。しかし、私はref/atom/agentを避けるために一生懸命働いています...
イベント駆動型ではないため、コンソール アプリケーションで簡単に実行できることがわかっているため、新しいボード値をいつ渡すかを正確に知ることができます。つまり
- 私のボードはベクトルのベクトルになります ([[:circle 0 :cross][:any :circle :empty][:cross :none :none]] :circle と :cross の値のみが重要です)
- ボードを取り、文字列を返す単純なテキストベースのメソッドがあります
しかし、グラフィカルなパネルを実装したいときはいつでも、どうすれば同じことができるのだろうと思います。例えば :
javax.swing.JPanel のインスタンスを作成しています (ここで使用されている他のメソッドは気にしないでください):
(defn make-board-panel "Builds the board JPanel, whose state is given by board argument, and turn-piece argument (must be either :circle or :cross, I mean the next value to set in the board)." [board turn-piece] {:pre ['morpion.core/is-board? board, 'morpion.core/is-a-player-piece? turn-piece]} (proxy [JPanel MouseListener] [] (paintComponent [g] (proxy-super paintComponent g) (paint-board-lines g) (paint-board board g) ) (mouseClicked [e] (if (and (abs-coord-in-cell? (.getX e)) (abs-coord-in-cell? (.getY e))) (let [cell-x (abs-coord-to-rel (.getX e)) cell-y (abs-coord-to-rel (.getY e))] ;; Here I compute the new board value ) nil ;; Here I wish I could return the new board value to the caller of make-board-panel, but this seems impossible ! ) ) (mouseEntered [e]) (mouseExited [e]) (mousePressed [e]) (mouseReleased [e]) ) )
- しかし、状態変数を導入しない限り、 Panel の mouseClicked イベントからボードの新しい値を取得する方法はないようです。
回避策はありますか:
私の完全なプロジェクトのソース:
(イグラペンチンのコメントのおかげで改善しようとしましたが、まだ失敗しています。)