summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'data/examples/blackjack/cards.fate')
-rw-r--r--data/examples/blackjack/cards.fate116
1 files changed, 116 insertions, 0 deletions
diff --git a/data/examples/blackjack/cards.fate b/data/examples/blackjack/cards.fate
new file mode 100644
index 0000000..2312f03
--- /dev/null
+++ b/data/examples/blackjack/cards.fate
@@ -0,0 +1,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))
+ )
+)