【问题标题】:scheme homework Blackjack shuffle计划作业二十一点洗牌
【发布时间】:2011-02-02 16:56:22
【问题描述】:

所以我需要做一个二十一点模拟器游戏,但似乎无法弄清楚洗牌有什么问题。它应该从牌堆中随机取出一张牌,然后将其放在牌堆的顶部。最后将其从其余部分中删除。所以:

(ace)(2)(3)(4)(5)...(k)
如果随机卡是 5
(5)(ace)(2)(3)(4)(5)...(k)
然后它会删除第二个 5
(5)(ace)(2)(3)(4)(6)...(k)

代码如下:

    (define deck '((A . C) (2 . C) (3 . C) (4 . C) (5 . C) (6 . C) (7 . C) (8 . C) (9 . C) (10 . C) (V . C) (Q . C) (K . C)))

;auxilliary function for shuffle let you randomly select a card.
(define shuffAux
  (lambda (t)
    (define cardR
  (lambda (t)  (list-ref t (random 13))))
    (cardR t)))

;auxilliary function used to remove the card after the car to prevent
you from removing the randomly selected from the car(begining of the deck).
(define (removeDupC card deck)
      (delete card (cdr deck))
      )

(define shuffle2ndtry
  (lambda (deck seed)
    (define do-shuffle
      (lambda (deck seed)
        (if (> seed 0)(
        (cons (shuffAux deck) deck)
        (removeDupC (car deck)  deck)
        (- 1 seed))
        (write deck)   
        )
      )
      )
    (do-shuffle deck seed)))

(define (shuffle deck seed)
  (define cards (cons (shuffAux deck) deck))
  (write cards)
  (case (> seed 0)
   [(#t)
        (removeDupC (car cards) (cdr cards)) 
        (shuffle cards (- seed 1))]
   [(#f) (write cards)]))

(define random
 (let ((seed 0) (a 3141592653)
  (c 2718281829) (m (expt 2 35)))
  (lambda (limit)
   (cond 
   ((and (integer? limit))
    (set! seed (modulo (+ (* seed a) c) m))
    (quotient (* seed limit) m))
   (else
   (/ (* limit (random 34359738368))
   34359738368))))))


;function in which  you can delete an element from the list.
(define delete
  (lambda (item list)
    (cond
     ((equal? item (car list)) (cdr list))
     (else (cons (car list) (delete item (cdr list)))))))



(

【问题讨论】:

  • 尝试运行代码时发生了什么?
  • shuffle 现在在这里工作是新代码 (define (brasse deck seed) (define cards (cons (brasseAux deck) deck)) (case (>= seed 0) [(#t) ( shuffle (removeDupC (car cards) cards) (- seed 1))] [(#f) (write cards)])) 我得到的是: ((7 . C) (9 . C) (10 . C) (8.C) (6.C) (5.C) (2.C) (Q.C) (V.C) (7.C) (3.C) (K.C) (A.C) (4 . C)) 如您所见,有两张卡片 (7 . C) 只需要摆脱列表中的汽车,但我需要卡片列表返回完全相同的内容,除非没有汽车,这似乎是不可能的,因为在开头定义。

标签: scheme blackjack


【解决方案1】:

有一种更好的方法可以像这样洗牌。 使用您的方法,可能会有一组卡片保持有序。

最好在牌组中循环,并为每张牌随机交换位置。你会想为此使用一个向量。作为奖励,它会更快:)

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 2020-06-18
    • 2019-06-03
    • 2018-04-02
    • 2016-04-12
    • 2011-01-25
    • 2018-09-10
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多