-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBlackJack2.hs
More file actions
104 lines (81 loc) · 3.14 KB
/
BlackJack2.hs
File metadata and controls
104 lines (81 loc) · 3.14 KB
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
module BlackJack where
import Cards
import Wrapper
import Test.QuickCheck --hiding (shuffle)
--size hand2
-- = size (Add (Card (Numeric 2) Hearts) (Add (Card Jack Spades) Empty)
-- = 1 + size (Add (Card Jack spades) Empty)
-- = 1 + 1 + size (Empty)
-- = 1 + 1 + 0 = 2
aCard1 :: Card
aCard1 = Card King Hearts
aCard2 :: Card
aCard2 = Card (Numeric 9) Diamonds
aHand :: Hand
aHand = Add (aCard1)
(Add aCard2 Empty)
aHand2 = Add (Card Ace Diamonds)
(Add (Card Ace Clubs) Empty)
aHand3 = Add (Card King Hearts)
(Add (Card Ace Clubs)
(Add (Card King Spades) Empty))
--prop_valueRank :: Rank -> Bool
--prop_valueRank a = valueRank (Numeric a) == a || valueRank King == 10 ||
-- valueRank Ace == 11
valueRank :: Rank -> Integer
valueRank (Numeric n) = n
valueRank Ace = 11
valueRank _ = 10
--prop_valueCard (Card a s) = valueCard (Card (Numeric a) Clubs) == a
valueCard :: Card -> Integer
valueCard (Card r s) = valueRank r
numberOfAces :: Hand -> Integer
numberOfAces Empty = 0
numberOfAces (Add (Card Ace suit) hand) = 1 + numberOfAces hand
numberOfAces (Add card hand) = 0 + numberOfAces hand
--Calculates value of a handp1 <+ (p2 <+ p3) == (p1 <+ p2) <+ p3
value :: Hand -> Integer
value Empty = 0
value (Add card hand) | ((valueCard (card) + value hand) > 21)
= valueCard (card)
- (10 * numberOfAces (Add card hand)) + value hand
value (Add card hand) | otherwise = valueCard (card) + value hand
gameOver :: Hand -> Bool
gameOver (Add card hand) = value (Add card hand) > 21
winner :: Hand -> Hand -> Player
winner (Add card1 hand1) (Add card2 hand2)
| gameOver (Add card1 hand1) = Bank
| (value (Add card1 hand1) < value (Add card2 hand2)) &&
(gameOver (Add card2 hand2) == False) = Bank
| otherwise = Guest
--Task C
(<+) :: Hand -> Hand -> Hand
(<+) Empty h2 = h2
(<+) h1 Empty = h1
(<+) (Add c h) h2 = Add c (h <+ h2)
prop_onTopOf_assoc :: Hand -> Hand -> Hand -> Bool
prop_onTopOf_assoc p1 p2 p3 = p1 <+ (p2 <+ p3) == (p1 <+ p2) <+ p3
prop_size_onTopOf :: Hand -> Hand -> Bool
prop_size_onTopOf h1 h2 = ((size h1) + (size h2)) == size (h1 <+ h2)
--Task D
fullDeck :: Hand
fullDeck = (allCardsInSuit Clubs <+
allCardsInSuit Diamonds <+
allCardsInSuit Spades <+
allCardsInSuit Hearts)
allCardsInSuit :: Suit -> Hand
allCardsInSuit s = (Add (Card Ace s)
(Add (Card (Numeric 2) s)
(Add (Card (Numeric 3) s)
(Add (Card (Numeric 4) s)
(Add (Card (Numeric 5) s)
(Add (Card (Numeric 6) s)
(Add (Card (Numeric 7) s)
(Add (Card (Numeric 8) s)
(Add (Card (Numeric 9) s)
(Add (Card (Numeric 10) s)
(Add (Card Jack s)
(Add (Card Queen s)
(Add (Card King s) Empty)))))))))))))
draw :: Hand -> Hand -> Hand
draw h deck |