2010-03-30 92 views
0

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

(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))))))) 



(
+0

当您尝试运行代码时发生了什么? – 2010-03-30 23:25:06

+0

洗牌现在工作这里是新代码 (定义(Brasse小甲板种子) (限定卡(利弊(brasseAux甲板)甲板)) (情况(> =种子0) [(#T) (洗牌( removeDupC(车卡)卡)( - 种子1))] [(#F) (写卡)])) 我所得到的是即: ((7- C)(9 C)(。 (C.C)(C.C)(5.C)(2.C)(Q.C)(V.C)(7.C)(3.C)(C.C)(C.C.) A)C)(4。C)) 你可以看到有两张牌(7.C)只需要摆脱列表中的车,但我需要卡列表返回完全相同,除了没有车似乎不可能,因为在开始的定义。 – octavio 2010-03-30 23:49:42

回答

2

有一个更好的方式来洗牌这样的甲板。 用你的方法可能会有一组卡保持顺序。

最好循环通过甲板,每张卡片随机放置一次。你会想为此使用一个矢量。作为奖励,它会快得多:)