0

私は 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 イベントからボードの新しい値を取得する方法はないようです。

回避策はありますか:

私の完全なプロジェクトのソース:

(イグラペンチンのコメントのおかげで改善しようとしましたが、まだ失敗しています。)

4

1 に答える 1

2
(defn make-board-panel
 [board turn-piece output-fn]
 (proxy [JPanel MouseListener] []
   ;; ...
   (mouseClicked [e]
     (when (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
          (output-fn new-board-value))))
    ;; ...
    ))
于 2013-08-27T16:08:21.840 に答える