summaryrefslogtreecommitdiff
blob: 2312f033474ba56d5458de8cb71ad645fb920380 (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
(fate_version 1)

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

(local (list card) heart_cards)
(local (list card) spade_cards)
(local (list card) club_cards)
(local (list card) diamond_cards)

(define_sequence generate_card_familly ((string name) ((ptr (list card)) deck))
   (local int i)

   (for (set i 1) (=< (var i) 13) (set i (+ (var i) 1))
      (local card c)

      (set c.number (var i))

      (set c.name
         (text
            (switch (var i)
               (1 Ace)
               (11 Jack)
               (12 Queen)
               (13 Kind)
               (cast string (var i))
            )
            of (var name)
         )
      )

      (set c.score
         (switch (var i)
            (11 10)
            (12 10)
            (13 10)
            (var i)
         )
      )

      (add (var c) (at deck))
   )
)

(visit generate_card_familly Hearts (ptr heart_cards))
(visit generate_card_familly Spades (ptr spade_cards))
(visit generate_card_familly Diamonds (ptr diamond_cards))
(visit generate_card_familly Clubs (ptr club_cards))

(global (list card) deck_template)

(add_all heart_cards deck_template)
(add_all spade_cards deck_template)
(add_all diamond_cards deck_template)
(add_all club_cards deck_template)

(define_sequence shuffle_into_deck
   (
      ((ptr (list card)) cards)
      ((ptr (list card)) deck)
   )

   (while (! (is_empty (at cards)))
      (local int o)
      (local int d)

      (set o (rand 0 (- (size (at cards)) 1)))

      (if_else (is_empty (at deck))
         (set d 0)
         (set d (rand 0 (- (size (at deck)) 1)))
      )

      (add_at (var d) (access (at cards) (var o)) (at deck))
      (remove_at (var o) (at cards))
   )
)

(define_sequence generate_shuffled_deck (((ptr (list card)) result))
   (local (list card) initial_deck)

   (set initial_deck (var deck_template))

   (clear (at result))
   (visit shuffle_into_deck (ptr initial_deck) (var result))
)

(define_sequence draw_a_card (((ptr (list card)) deck) ((ptr card) result))
   (set (at result) (access (at deck) 0))
   (remove_at 0 (at deck))
)

(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) (+ (var card.score) (at result)))
      (if (= (var card.number) 1)
         (set aces_count (+ (var aces_count) 1))
      )
   )

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