Lisp でMancalaゲームを作ろうとしています。AI が人間のプレイヤーと対戦する予定ですが、行き詰まっています。ボードをリストとして表現する方法が見つかりません。私の心の主要な問題は、トークンを移動する方法です。マンカラの遊び方の参考記事はこちら
循環リストについて考えていますが、Lisp でそれを行う方法についての明確なドキュメントが見つかりません。
私の文法について申し訳ありません。英語は私の母国語ではありません。
Lisp でMancalaゲームを作ろうとしています。AI が人間のプレイヤーと対戦する予定ですが、行き詰まっています。ボードをリストとして表現する方法が見つかりません。私の心の主要な問題は、トークンを移動する方法です。マンカラの遊び方の参考記事はこちら
循環リストについて考えていますが、Lisp でそれを行う方法についての明確なドキュメントが見つかりません。
私の文法について申し訳ありません。英語は私の母国語ではありません。
今はルールを読んでいないので (申し訳ありません!)、これは循環データ構造を使用するという考えに対処するためのものです。
データ構造は循環的である必要はありません。ふりをする限り、うまくいきます!mod関数を読んでください。
;; a1 a6 b1 b6
(defparameter *board* '(nil nil nil nil nil nil nil nil nil nil nil nil))
(defun wrap-position (pos)
(mod pos (length *board*)))
(defun push-token (position)
(push t (nth (wrap-position position) *board*)))
(defun pull-token (position)
(let ((contents (nth (wrap-position position) *board*)))
(setf (nth (wrap-position position) *board*) (rest contents))))
(defun print-board ()
(format t "| ~{~10<~a~>~} |~%| ~{~10<~a~>~} |" (reverse (subseq *board* 6))
(subseq *board* 0 6))
*board*)
現在、上記の手法は破壊的です。Lisp の内容がまだわからない場合は、Google で検索するか、stackoveflow で検索してください。適切な説明がいくつかあります。AI が実際のゲームボードに「ダメージを与える」ことで多くの潜在的な動きを「試し」たいと思うかもしれないので、調べる価値があります。非破壊的なアプローチがこれに役立ちます。Lispの驚異的なブックランドには、これに関するいくつかの優れた情報があります。
これは簡単な使用例です
CL-USER> *board*
(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
CL-USER> (push-token 5)
(T)
CL-USER> *board*
(NIL NIL NIL NIL NIL (T) NIL NIL NIL NIL NIL NIL)
CL-USER> (push-token 5)
(T T)
CL-USER> *board*
(NIL NIL NIL NIL NIL (T T) NIL NIL NIL NIL NIL NIL)
CL-USER> (PULL-token 5)
(T)
CL-USER> *board*
(NIL NIL NIL NIL NIL (T) NIL NIL NIL NIL NIL NIL)
...I change the board before doing the next bit...
CL-USER> (print-board)
| NIL NIL NIL NIL NIL NIL |
| NIL NIL NIL NIL NIL (T T T T) |
Sylwester の回答を見て、サブリストをいくつかの石だけに置き換えることができることを確認してください。明らかにプリント基板を変更する必要がありますが、これにより、非常に簡単に操作できる非常に単純なモデルが得られます (これを非破壊にするために必要な大きなステップになる可能性があります)。やってみます!