首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >西蒙在计划中说

西蒙在计划中说
EN

Code Review用户
提问于 2014-12-07 16:11:05
回答 1查看 152关注 0票数 6

好吧,这不完全像Simon说的,因为它是基于文本的。这里没有基于视觉线索和/或声音的记忆,只是记住长长的数字序列。我想用我用最少的代码编写的语言,Scheme (w/鸡肉)来做,看看会发生什么。

代码语言:javascript
复制
(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")

EN

回答 1

Code Review用户

回答已采纳

发布于 2014-12-07 23:57:30

  1. 理想情况下,我想使用术语或终端机或类似的,以清除终端,而不炮击。唉,似乎鸡没有一个鸡蛋,无论是术语或终止。(它确实有一个用来诅咒的蛋,但我认为它太重了,不能只清理一个码头。)
  2. 我可能会使用for-each迭代show-sequence中的项,而不是使用递归方法:(定义(显示序列seq) (用于-每个(lambda (x) (清除屏幕)(Make) (display );而不是写(Make)) seq) (显示“GO!\n”)
  3. 不太喜欢制作与get-player-input完全相同的read-line函数。我直接给read-line打电话。
  4. 您对make-sequence的定义非常聪明,但它不是很地道的。由于SRFI 1已加载,我只需使用list-tabulate:(定义(make序列len) ;;not length (列表表len (lambda (_) (随机按钮计数)
  5. 您可以使用SRFI 1's every简化player-sequence-matches?:(定义(球员序列-比赛?)(每个(lambda (x) (= (string->number (read-line) x)) seq),并且由于鸡有cut内建,您可以进一步简化:(定义(玩家-顺序-匹配?)(每一个(切=(字符串->数字(读行)) <>)
  6. 为了计算总分,我宁愿累积分数,也不愿使用递归来保持分数。像这样:(定义(西蒙-说困难)(让循环(难度)(分数0)) (定义seq (制造顺序难度))(显示序列seq) (如果(玩家-序列-匹配)?(环(add1难度) (add1分数)这种方式,函数完全是尾递归的.
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/71954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档