Common lisp 如何在lisp中提取mancala板

Common lisp 如何在lisp中提取mancala板,common-lisp,Common Lisp,我想用Lisp做一个游戏。它将有一个人工智能来对抗人类玩家,但我被卡住了。我找不到将董事会作为列表来表示的方法;我脑海中的主要问题是如何移动代币。这是你的参考资料 我正在考虑一个循环列表,但是我找不到任何关于如何在Lisp中实现这一点的清晰文档 对不起我的语法;英语不是我的母语。现在我还没有阅读规则(对不起!),所以这只是为了说明使用循环数据结构的想法 数据结构不必是循环的。只要你假装它是,它就会工作! 读一读这本书 现在看一下西尔维斯特的答案,你可以用一些石头来替换这些子列表。显然,你需要更

我想用Lisp做一个游戏。它将有一个人工智能来对抗人类玩家,但我被卡住了。我找不到将董事会作为列表来表示的方法;我脑海中的主要问题是如何移动代币。这是你的参考资料

我正在考虑一个循环列表,但是我找不到任何关于如何在Lisp中实现这一点的清晰文档


对不起我的语法;英语不是我的母语。

现在我还没有阅读规则(对不起!),所以这只是为了说明使用循环数据结构的想法

数据结构不必是循环的。只要你假装它是,它就会工作! 读一读这本书


现在看一下西尔维斯特的答案,你可以用一些石头来替换这些子列表。显然,你需要更换印刷电路板,但这给了你一个非常简单的模型,你可以很容易地操作(几乎可以是你所需要的一大步,以使这种非破坏性)。试一试

对不起,我真的不明白怎么玩这个游戏,但我可以考虑一下如何玩棋盘:

(defstruct (mancala-cell
             (:print-object
              (lambda (cell stream)
                (format stream "<stones: ~d>"
                        (length (mancala-cell-stones cell))))))
  (stones nil :type list)
  (next nil))

(defun make-cells ()
  (labels ((%make-cells (head count)
             (let ((next (make-mancala-cell)))
               (setf (mancala-cell-next head) next)
               (if (> count 0) (%make-cells next (1- count)) next))))
    (let* ((first (make-mancala-cell))
           (last (%make-cells first 12)))
      (setf (mancala-cell-next last) first))))

(defstruct (mancala-board
             (:print-object
              (lambda (board stream)
                (loop :for i :from 0 :below 12
                   :for cell := (mancala-board-cells board)
                   :then (mancala-cell-next cell)
                   :do (princ (case i
                                (6 #\Newline) (0 "") (otherwise #\-))
                              stream)
                   (princ cell stream)))))
  (cells (make-cells) :type mancala-cell))

(print (make-mancala-board))
;; <stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>
;; <stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>-<stones: 0> 
(defstruct(mancala单元
(:打印对象)
(λ(细胞流)
(格式化流“”
(长度(曼卡拉细胞结石细胞()())))
(无:类型列表)
(次为零)
(取消生成单元格()
(标签(%)生成单元格(人头计数)
(让((下一步(生成mancala单元)))
(setf(曼卡拉细胞下一个头部)下一个)
(如果(>计数0)(%make cells next(1-count))next)
(让*((首先(制作mancala单元))
(最后一个(%将单元格设为前12个)))
(setf(mancala单元倒数第二个)第一个)
(defstruct(曼卡拉董事会)
(:打印对象)
(lambda(板流)
(循环:对于i:从0:低于12
:对于单元:=(曼卡拉板单元板)
:然后(曼卡拉单元格下一个单元格)
:do(普林斯)(案例一)
(6#\Newline)(0“”)(否则#\-)
(溪流)
(主细胞流(()())))
(单元(生成单元):mancala单元类型)
(打印(制作mancala板))
;; -----
;; ----- 
那么这里还有一个例子:

(defstruct (mancala-cell
             (:print-object
              (lambda (cell stream)
                (format stream "<stones: ~d>"
                        (mancala-cell-stones cell)))))
  (stones 4 :type fixnum))

(defconstant +null-cell+ (make-mancala-cell))

(deftype mancala-grid () '(array mancala-cell (12)))

(defun make-cells ()
  (loop
     :for i :from 0 :below 12
     :with result := (make-array
                      12 :element-type 'mancala-cell
                      :initial-element +null-cell+)
     :do (setf (aref result i) (make-mancala-cell))
     :finally (return result)))

(defstruct (mancala-board
             (:print-object
              (lambda (board stream)
                (loop :for i :from 0 :below 12
                   :for cell :across (mancala-board-cells board)
                   :do (princ (case i
                                (6 #\Newline) (0 "") (otherwise #\-))
                              stream)
                   (princ cell stream)))))
  (cells (make-cells) :type mancala-grid))

(defun map-cells-in-range (function board &key (start 0) (end 12))
  (loop
     :for i :from start :below end
     :with board := (mancala-board-cells board)
     :collect (funcall function (aref board (mod i 12)))))

(defun fold-cells-in-range (function board &key (start 0) (end 12))
  (loop
     :for i :from start :below (1- end)
     :with board := (mancala-board-cells board)
     :for cell := (aref board (mod i 12))
     :for result := (funcall
                     function
                     (aref board (mod i 12))
                     (aref board (mod (1+ i) 12)))
     :then (funcall function result (aref board (mod (1+ i) 12)))
     :finally (return result)))

(fold-cells-in-range
 (lambda (a b)
   (+ (mancala-cell-stones b)
      (if (integerp a) a (mancala-cell-stones a))))
 (make-mancala-board))                  ; 48
(defstruct(mancala单元
(:打印对象)
(λ(细胞流)
(格式化流“”
(曼卡拉细胞结石细胞(()()))
(第4类:fixnum)
(反常量+空单元格+(生成mancala单元格))
(deftype mancala grid()'(数组mancala单元格(12)))
(取消生成单元格()
(环路
:对于i:从0:低于12
:结果:=(生成数组)
12:元素类型“mancala单元”
:初始元素+空单元格+)
:do(setf(aref结果i)(生成曼卡拉单元))
:finally(返回结果)))
(defstruct(曼卡拉董事会)
(:打印对象)
(lambda(板流)
(循环:对于i:从0:低于12
:对于单元:交叉(曼卡拉板单元板)
:do(普林斯)(案例一)
(6#\Newline)(0“”)(否则#\-)
(溪流)
(主细胞流(()())))
(单元格(生成单元格):类型mancala grid))
(定义范围内的地图单元格(功能板和键(开始0)(结束12))
(环路
:对于i:从开始:在结束下方
:带板:=(曼卡拉板单元板)
:collect(funcall功能(aref板(mod i 12俬俬俬俬俬)
(取下范围内的折叠单元(功能板和键(开始0)(结束12))
(环路
:对于i:从开始:以下(1-结束)
:带板:=(曼卡拉板单元板)
:对于单元:=(aref板(模块i 12))
:对于结果:=(funcall)
功能
(aref董事会(mod i 12))
(aref委员会(mod(1+i)12)))
:然后(funcall函数结果(aref板(mod(1+i)12)))
:finally(返回结果)))
(在范围内折叠细胞
(lambda(a-b)
(+(曼卡拉细胞结石b)
(if(整合素a)a(曼卡拉细胞结石a)))
(制作曼卡拉董事会);48

我会使用14个fixnum的数组。指数0-5是A的坑,6是A的篮。7-12是球员B的篮筐,13是B的篮筐。您可以使用复制数组执行minimax


如果你想要列表,我会把A和B的列表分开,或者交错排列。你也可以列出14个缺点。

是的,是这样的,我想试试。现在我知道了,但在这种情况下,它是顺时针的,我需要逆时针的,也许一些相反的应该可以工作。是的!现在修复了:)如果我错了,请纠正我,但这其中的关键是mod函数right?,在这种情况下,“种子”(代币)的传递由列表长度的mod加上井中种子的数量给出。读一下规则,也许你能理解我,用外语表达我的想法对我来说有点困难。剩下的部分我会除法。例如,7/3=2,剩余1。“剩余”位是mod返回的值。方便的是,我们可以用它来包装一个数字,当它达到电路板的长度时。所以1/12=0 r1,2/12=0 r2,11/12=0 r3,12/12=1 r0,13/12=1 r1…看看当我们得到12时,余数如何“包装”回0。这就是诀窍。我没有在刚才使用的换行位置函数(长度板)中写入'12',以防您想要尝试更改板的长度:)同时推送令牌和拉取令牌当前仅添加或删除一个令牌从长远来看肯定更好,我编辑了我的答案,以将人们指向此处。
(defstruct (mancala-cell
             (:print-object
              (lambda (cell stream)
                (format stream "<stones: ~d>"
                        (length (mancala-cell-stones cell))))))
  (stones nil :type list)
  (next nil))

(defun make-cells ()
  (labels ((%make-cells (head count)
             (let ((next (make-mancala-cell)))
               (setf (mancala-cell-next head) next)
               (if (> count 0) (%make-cells next (1- count)) next))))
    (let* ((first (make-mancala-cell))
           (last (%make-cells first 12)))
      (setf (mancala-cell-next last) first))))

(defstruct (mancala-board
             (:print-object
              (lambda (board stream)
                (loop :for i :from 0 :below 12
                   :for cell := (mancala-board-cells board)
                   :then (mancala-cell-next cell)
                   :do (princ (case i
                                (6 #\Newline) (0 "") (otherwise #\-))
                              stream)
                   (princ cell stream)))))
  (cells (make-cells) :type mancala-cell))

(print (make-mancala-board))
;; <stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>
;; <stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>-<stones: 0>-<stones: 0> 
(defstruct (mancala-cell
             (:print-object
              (lambda (cell stream)
                (format stream "<stones: ~d>"
                        (mancala-cell-stones cell)))))
  (stones 4 :type fixnum))

(defconstant +null-cell+ (make-mancala-cell))

(deftype mancala-grid () '(array mancala-cell (12)))

(defun make-cells ()
  (loop
     :for i :from 0 :below 12
     :with result := (make-array
                      12 :element-type 'mancala-cell
                      :initial-element +null-cell+)
     :do (setf (aref result i) (make-mancala-cell))
     :finally (return result)))

(defstruct (mancala-board
             (:print-object
              (lambda (board stream)
                (loop :for i :from 0 :below 12
                   :for cell :across (mancala-board-cells board)
                   :do (princ (case i
                                (6 #\Newline) (0 "") (otherwise #\-))
                              stream)
                   (princ cell stream)))))
  (cells (make-cells) :type mancala-grid))

(defun map-cells-in-range (function board &key (start 0) (end 12))
  (loop
     :for i :from start :below end
     :with board := (mancala-board-cells board)
     :collect (funcall function (aref board (mod i 12)))))

(defun fold-cells-in-range (function board &key (start 0) (end 12))
  (loop
     :for i :from start :below (1- end)
     :with board := (mancala-board-cells board)
     :for cell := (aref board (mod i 12))
     :for result := (funcall
                     function
                     (aref board (mod i 12))
                     (aref board (mod (1+ i) 12)))
     :then (funcall function result (aref board (mod (1+ i) 12)))
     :finally (return result)))

(fold-cells-in-range
 (lambda (a b)
   (+ (mancala-cell-stones b)
      (if (integerp a) a (mancala-cell-stones a))))
 (make-mancala-board))                  ; 48