首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案中的3-堆Nim游戏

方案中的3-堆Nim游戏
EN

Stack Overflow用户
提问于 2015-09-24 12:54:42
回答 1查看 336关注 0票数 0

我的代码不能正常工作,有人能指出我哪里出了错吗?提前谢谢。

下面是我的代码:

代码语言:javascript
复制
(define play-with-turns
  (lambda (game-state player)
    (display-game-state game-state)
    (cond ((over? game-state) 
           (announce-winner player))
          ((equal? player 'human)  
           (play-with-turns (human-move game-state) 'computer))
          ((equal? player 'computer)  
           (play-with-turns (computer-move game-state) 'human))
          (else  
           (error "player wasn't human or computer:" player)))))

(define computer-move
  (lambda (game-state)
    (let ((pile (if (> (size-of-pile game-state 1) 0)
                    1
                    2)))
      (display "I take 1 coin from pile ")
      (display pile)
      (newline)

      (remove-coins-from-pile game-state 1 pile))))

(define prompt
  (lambda (prompt-string)
    (newline)
    (display prompt-string)
    (newline)
    (read)))

(define human-move
  (lambda (game-state)
    (let ((p (prompt "Which pile will you remove from?")))
      (let ((n (prompt "How many coins do you want to remove?")))
        (remove-coins-from-pile game-state n p)))))

(define over?
  (lambda (game-state)
    (= (total-size game-state) 0)))

(define announce-winner
  (lambda (player)
    (if (equal? player 'human) 
        (display "You lose. Better luck next time.")
        (display "You win. Congratulations."))))

(define remove-coins-from-pile
  (lambda (game-state num-coins pile-number)
    (cond ((= pile-number 1)
           (make-game-state (- (size-of-pile game-state 1)
                               num-coins) 
                            (size-of-pile game-state 2)
                            (size-of-pile game-state 3)))
          ((= pile-number 2)
           (make-game-state (size-of-pile game-state 1)
                            (- (size-of-pile game-state 2)
                               num-coins)
                            (size-of-pile game-state 3)))
          ((= pile-number 3)
           (make-game-state (size-of-pile game-state 1)
                            (size-of-pile game-state 2)
                            (- (size-of-pile game-state 3)
                               num-coins))))))

(define exponent-of-in
  (lambda (n int)
    (if (= (remainder int n) 0)
        (+ 1 (exponent-of-in n (quotient int n)))
        0)))

(define make-game-state
  ;Returns a game state with n coins in the first pile
  ;m coins in the second pile, and k coins in the third pile.
  (lambda (n m k)
    (lambda (x)
      (cond ((= x 1) n)
            ((= x 2) m)
            ((= x 3) k)))))



(define size-of-pile
  ;Returns an integer equal to the number of coins in
  ;pile pile-number of the game-state.
  (lambda (game-state pile-number)
    (game-state pile-number)))

;; Utilities

(define display-game-state
  (lambda (game-state)
    (newline)
    (newline)
    (display "    Pile 1: ")
    (display (size-of-pile game-state 1))
    (newline)
    (display "    Pile 2: ")
    (display (size-of-pile game-state 2))
    (newline)
    (display "    Pile 3: ")
    (display (size-of-pile game-state 3))
    (newline)
    (newline)))

(define total-size
  (lambda (game-state)
    (+(+ (size-of-pile game-state 1)
         (size-of-pile game-state 2)) (size-of-pile game-state 3))))

示例输出:

代码语言:javascript
复制
(play-with-turns (make-game-state 5 9 8) 'human)


    Pile 1: 5
    Pile 2: 9
    Pile 3: 8


Which pile will you remove from?
1

How many coins do you want to remove?
2


    Pile 1: 4
    Pile 2: 9
    Pile 3: 8

I take 1 coin from pile 1


    Pile 1: 3
    Pile 2: 9
    Pile 3: 8


Which pile will you remove from?
2

How many coins do you want to remove?
2


    Pile 1: 2
    Pile 2: 7
    Pile 3: 8

I take 1 coin from pile 1


    Pile 1: 1
    Pile 2: 7
    Pile 3: 8


Which pile will you remove from?
2

How many coins do you want to remove?
2


    Pile 1: 1
    Pile 2: 5
    Pile 3: 8

I take 1 coin from pile 1


    Pile 1: 0
    Pile 2: 5
    Pile 3: 8
EN

回答 1

Stack Overflow用户

发布于 2015-09-24 13:31:54

首先要做的是:我强烈建议您遵循中概述的设计食谱。首先,您的函数可以真正使用一行的目的语句。接下来,你真的真的需要这些函数的测试用例。我强烈怀疑您的remove-coins-from-pile函数有问题。

我在您的代码中发现了至少一个bug,您可以通过一组良好的测试用例轻松地捕获这些bug。如果你使用的是一种学生语言,你应该能够通过书写来测试,例如:

代码语言:javascript
复制
(check-expect ((remove-coins-from-pile (make-game-state 3 9 7) 5 2) 3) 172)

请注意,此测试用例实际上是错误的;您必须修复它。

如果您使用的是完整的#lang球拍语言,则需要添加

代码语言:javascript
复制
(require rackunit)

然后使用check-equal?进行测试:

代码语言:javascript
复制
(check-equal? ((remove-coins-from-pile (make-game-state 3 9 7) 5 2) 3) 172)

老实说,有人把你引向了一种基于函数的方法(游戏状态被表示为一个函数),这使得测试比其他方法更加困难;如果你有一个“游戏状态”结构,你可以通过编写以下代码来一次性测试整个游戏状态,例如,

代码语言:javascript
复制
(check-equal? (remove-coins-from-pile (make-game-state 3 9 7) 5 2)
              (make-game-state 17 27 0))

我猜这是一位非常喜欢函数的讲师的作业。好吧,老实说,我真的很喜欢函数,但它们不适合在这种情况下进行测试。

有关更多详细信息,请再次参考“如何设计程序”文本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32753623

复制
相关文章

相似问题

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