我试图在Racket中编写一个简单的tic tac toe游戏,并且无法弄清楚如何在序列中设置值。
我有以下2d字符序列:
(define playing-board '((#\- #\- #\-)
(#\- #\- #\-)
(#\- #\- #\-)))
这是我想要做的事情:
(let ([row (sequence-ref playing-board y)])
(sequence-set? row x #\O)
)
现在考虑一下,即使确实有效,它也只会改变row
和playing-board
。
答案 0 :(得分:1)
列表不能像在Racket中那样进行变异,因此您必须选择可以变异的数据结构,例如vector。例如:
Welcome to Racket v6.4.0.15.
-> (define playing-board (vector (vector #\- #\- #\-)
(vector #\- #\- #\-)
(vector #\- #\- #\-)))
-> (define x 0)
-> (define y 1)
-> (let ([row (vector-ref playing-board y)])
(vector-set! row x #\O))
-> playing-board
'#(#(#\- #\- #\-) #(#\O #\- #\-) #(#\- #\- #\-))
或者,您可以改为返回一个新列表,而不是尝试将其变异。
答案 1 :(得分:1)
Asumu的回答当然是完全正确的。
但是,对于这个问题,我想我可能倾向于使用不可变的 从数字列表到单元格值的哈希值。这为您提供了便利的功能 更新并且可能更好地匹配你的直觉:
#lang racket
(define my-board
(for/hash ([row (in-range 3)]
[col (in-range 3)])
(values (list row col) #\-)))
(hash-ref my-board (list 1 1)) ;; -> #\-
(define updated-board (hash-set my-board (list 1 1) #\X))
(hash-ref updated-board (list 1 1)) ;; -> #\X