好吧,这不完全像Simon说的,因为它是基于文本的。这里没有基于视觉线索和/或声音的记忆,只是记住长长的数字序列。我想用我用最少的代码编写的语言,Scheme (w/鸡肉)来做,看看会发生什么。
(use posix)
(use (srfi 1))
(define button-count 4)
(define (clear-screen)
(system "cls"))
(define (make-delay)
(sleep 2))
(define (show-sequence sequence)
(if (not (null? sequence))
(begin
(clear-screen)
(make-delay)
(write (car sequence))
(make-delay)
(show-sequence (cdr sequence)))
(begin
(clear-screen)
(write-line "GO!"))))
(define (show-score score)
(format #t "Your score: ~A~%" score))
(define (get-player-input)
(read-line))
(define (make-sequence length)
(map random (make-list length button-count)))
(define (player-sequence-matches? target-sequence)
(cond
[(null? target-sequence) #t]
[(string=? (get-player-input) (number->string (car target-sequence)))
(player-sequence-matches? (cdr target-sequence))]
[else #f]))
(define (simon-says difficulty)
(let [(current-sequence (make-sequence difficulty))]
(show-sequence current-sequence)
(if (player-sequence-matches? current-sequence)
(+ 1 (simon-says (+ difficulty 1)))
0)))
(define (play-simon-says)
(show-score (simon-says 1)))如果您想在某个Unix上运行它,则需要将(system "cls")更改为(system "clear")。
发布于 2014-12-07 23:57:30
for-each迭代show-sequence中的项,而不是使用递归方法:(定义(显示序列seq) (用于-每个(lambda (x) (清除屏幕)(Make) (display );而不是写(Make)) seq) (显示“GO!\n”)get-player-input完全相同的read-line函数。我直接给read-line打电话。make-sequence的定义非常聪明,但它不是很地道的。由于SRFI 1已加载,我只需使用list-tabulate:(定义(make序列len) ;;not length (列表表len (lambda (_) (随机按钮计数)every简化player-sequence-matches?:(定义(球员序列-比赛?)(每个(lambda (x) (= (string->number (read-line) x)) seq),并且由于鸡有cut内建,您可以进一步简化:(定义(玩家-顺序-匹配?)(每一个(切=(字符串->数字(读行)) <>)https://codereview.stackexchange.com/questions/71954
复制相似问题