summaryrefslogtreecommitdiff
blob: 68686503410bdd363ae46b9c68da63ea66cb9028 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
(fate_version 1)

(declare_structure card
   (text name)
   (int number)
   (int score)
)

(local (lambda (list card) (string)) card_generator)

(set! card_generator
   (lambda ( (string family) )
      (map
         (lambda
            (
               (int number)
               (string family)
            )
            (set_fields (default card)
               (number (var number))
               (name
                  (text
                     (switch (var number)
                        (1 Ace)
                        (11 Jack)
                        (12 Queen)
                        (13 Kind)
                        (cast string (var number))
                     )
                     of (var family)
                  )
               )
               (score (clamp 1 number 10))
            )
         )
         (range 1 13 1)
         (var family)
      )
   )
)

(global (list card) deck_template)

(add_all! (eval card_generator Hearts) deck_template)
(add_all! (eval card_generator Spades) deck_template)
(add_all! (eval card_generator Diamonds) deck_template)
(add_all! (eval card_generator Clubs) deck_template)

(define_sequence compute_score (((ptr (list card)) deck) ((ptr int) result))
   (local int aces_count)
   (local int maybe_better_score)

   (set! (at result) 0)

   (foreach (at deck) card
      (set! (at result) (+ card.score (at result)))
      (if (= (var card.number) 1)
         (set! aces_count (+ aces_count 1))
      )
   )

   (while (> aces_count 0)
      (set! maybe_better_score (+ (at result) 10))
      (if (=< maybe_better_score 21)
         (set! (at result) (var maybe_better_score))
      )
      (set! aces_count (- aces_count 1))
   )
)