· 7 years ago · Mar 04, 2019, 03:12 AM
1import datetime
2import sqlite3
3import requests
4game_state_db = '__HOME__/area.db'
5bet = 5
6#getters and setters for maintaining a global state
7def initialized_game_state():
8 conn = sqlite3.connect(game_state_db)
9 cur = conn.cursor()
10 result = cur.execute('SELECT name FROM sqlite_master WHERE type=\'table\' AND name=\'game_state\'').fetchone()
11 conn.commit()
12 conn.close()
13 return result != None
14def initialize_game_state():
15 conn = sqlite3.connect(game_state_db)
16 cur = conn.cursor()
17 cur.execute('DROP TABLE game_state')
18 cur.execute('CREATE TABLE IF NOT EXISTS game_state (name TEXT, value TEXT)')
19 cur.execute('DELETE FROM game_state WHERE name = \'player_hand\'')
20 cur.execute('DELETE FROM game_state WHERE name = \'dealer_hand\'')
21 cur.execute('DELETE FROM game_state WHERE name = \'score\'')
22 cur.execute('DELETE FROM game_state WHERE name = \'deck_id\'')
23 conn.commit()
24 conn.close()
25def get_game_state():
26 conn = sqlite3.connect(game_state_db)
27 cur = conn.cursor()
28 dealer_hand_string = cur.execute('SELECT * FROM game_state WHERE name = \'dealer_hand\'').fetchone()[1]
29 player_hand_string = cur.execute('SELECT * FROM game_state WHERE name = \'player_hand\'').fetchone()[1]
30 dealer_hand = dealer_hand_string.split(",")
31 player_hand = player_hand_string.split(",")
32 conn.commit()
33 conn.close()
34 return dealer_hand,player_hand
35def set_game_state(player_hand,dealer_hand):
36 dealer_hand_string = ",".join(dealer_hand)
37 player_hand_string = ",".join(player_hand)
38 conn = sqlite3.connect(game_state_db)
39 cur = conn.cursor()
40 cur.execute('DELETE FROM game_state WHERE name = \'player_hand\'')
41 cur.execute('DELETE FROM game_state WHERE name = \'dealer_hand\'')
42 cur.execute('INSERT into game_state VALUES (?,?)',("dealer_hand",dealer_hand_string))
43 cur.execute('INSERT into game_state VALUES (?,?)',("player_hand",player_hand_string))
44 conn.commit()
45 conn.close()
46def set_score(score):
47 conn = sqlite3.connect(game_state_db)
48 cur = conn.cursor()
49 try:
50 cur.execute('UPDATE game_state SET value = ? WHERE name = \'score\'',(str(score),))
51 except:
52 cur.execute('INSERT into game_state VALUES (?,?)',("score",str(score)))
53 conn.commit()
54 conn.close()
55def get_score():
56 conn = sqlite3.connect(game_state_db)
57 cur = conn.cursor()
58 try:
59 score = int(cur.execute('SELECT * FROM game_state WHERE name = \'score\'').fetchone()[1])
60 except:
61 score = 0
62 conn.commit()
63 conn.close()
64 return score
65def set_high_score(highscore):
66 conn = sqlite3.connect(game_state_db)
67 cur = conn.cursor()
68 cur.execute('DELETE FROM game_state WHERE name = \'highscore\'')
69 cur.execute('INSERT into game_state VALUES (?,?)',("highscore",str(highscore)))
70 conn.commit()
71 conn.close()
72def get_high_score():
73 conn = sqlite3.connect(game_state_db)
74 cur = conn.cursor()
75 try:
76 score = int(cur.execute('SELECT * FROM game_state WHERE name = \'highscore\'').fetchone()[1])
77 except:
78 score = 0
79 conn.commit()
80 conn.close()
81 return score
82def get_deck_id():
83 conn = sqlite3.connect(game_state_db)
84 cur = conn.cursor()
85 deckId = cur.execute('SELECT * FROM game_state WHERE name = \'deck_id\'').fetchone()[1]
86 conn.commit()
87 conn.close()
88 return deckId
89def set_deck_id(deck_id):
90 conn = sqlite3.connect(game_state_db)
91 cur = conn.cursor()
92 cur.execute('INSERT into game_state VALUES (?,?)',("deck_id",deck_id))
93 conn.commit()
94 conn.close()
95def deal(deck_id):
96 url = "https://deckofcardsapi.com/api/deck/%s/draw/" % deck_id
97 payload = {'count': 2}
98 r = requests.get(url,params=payload)
99 hand = [card["value"] for card in r.json()["cards"]]
100 return hand
101def hit(hand,deck_id):
102 url = "https://deckofcardsapi.com/api/deck/%s/draw/" % deck_id
103 payload = {'count': 1}
104 r = requests.get(url,params=payload)
105 hand += [card["value"] for card in r.json()["cards"]]
106 return hand
107#sums the cards for keeping score
108def sum_cards(hand):
109 result = 0
110 for card in hand:
111 if card == "JACK" or card == "QUEEN" or card == "KING":
112 result = result + 10
113 elif card == "ACE":
114 if result >= 11:
115 result = result + 1
116 else:
117 result = result + 11
118 else:
119 result = result + int(card)
120 return result
121#pretty_print state of game in lines
122def pretty_print(player_hand,dealer_hand,hidden = False):
123 if hidden: #if the dealer is still hiding his second card
124 ret_lines = ["The dealer is showing"] + [str(dealer_hand[0])]
125 else:
126 ret_lines = ["The dealer is showing"] + [str(dealer_hand)] + [" AND a total of "] + [str(sum_cards(dealer_hand))]
127 ret_lines += ["You have"] + [str(player_hand)] + [" AND a total of "] + [str(sum_cards(player_hand))]
128 return ret_lines
129#determines at the end of the game who won and who lost
130def score_hands(player_hand,dealer_hand ):
131 result = []
132 curr_score = get_score()
133 if sum_cards(player_hand) == 21:
134 curr_score += bet
135 result = pretty_print(player_hand,dealer_hand )
136 result.append("Blackjack! You Win!")
137 elif sum_cards(dealer_hand) == 21:
138 curr_score -= bet
139 result = pretty_print(player_hand,dealer_hand )
140 result.append("Dealer blackjack! You lose!")
141 elif sum_cards(player_hand) > 21:
142 curr_score -= bet
143 result = pretty_print(player_hand,dealer_hand )
144 result.append("Bust! You lose!")
145 elif sum_cards(dealer_hand) > 21:
146 curr_score += bet
147 result = pretty_print(player_hand,dealer_hand )
148 result.append("Dealer bust! You win!")
149 elif sum_cards(player_hand) < sum_cards(dealer_hand):
150 curr_score -= bet
151 result = pretty_print(player_hand,dealer_hand )
152 result.append("Score lower than dealer! You lose!")
153 elif sum_cards(player_hand) > sum_cards(dealer_hand):
154 curr_score += bet
155 result = pretty_print(player_hand,dealer_hand )
156 result.append("Score higher than dealer! You win!")
157 else:
158 result = ["TIE"]
159 set_score(curr_score)
160 high_score = get_high_score()
161 if curr_score > high_score:
162 high_score = curr_score
163 set_high_score(curr_score)
164 result += ["Your current score is: %d" % curr_score]
165 result += ["The high score is: %d" % high_score]
166 result += ["Send a request with the action \"begin\" to play again"]
167 return result
168#ends the turn of a particular game
169def end_turn(player_hand,dealer_hand,deck_id):
170 while sum_cards(dealer_hand) < 17:
171 hit(dealer_hand,deck_id)
172 game_started = False
173 return score_hands(player_hand,dealer_hand)
174#handles requests
175def request_handler(request):
176 action = request['values']['action']
177 game_started = initialized_game_state()
178 if action == 'begin':
179 if 'bet' in request['values']:
180 bet = request['values']['bet']
181 else:
182 return "Please specify a bet"
183 payload = {'deck_count': 1}
184 r = requests.get('https://deckofcardsapi.com/api/deck/new/shuffle/',params=payload)
185 deck_id = r.json()["deck_id"]
186 initialize_game_state()
187 dealer_hand = deal(deck_id)
188 player_hand = deal(deck_id)
189 set_deck_id(deck_id)
190 set_game_state(dealer_hand,player_hand)
191 return get_game_state()
192 #The version of blackjack I am playing only allows a player to hit once
193 if action == 'hit' and game_started:
194 dealer_hand, player_hand = get_game_state()
195 deck_id = get_deck_id()
196 player_hand = hit(player_hand,deck_id)
197 set_game_state(player_hand, dealer_hand)
198 return "\n".join(pretty_print(player_hand,dealer_hand,True))
199 if action == 'stand' and game_started:
200 dealer_hand, player_hand = get_game_state()
201 deck_id = get_deck_id()
202 return "\n".join(end_turn(player_hand, dealer_hand,deck_id))
203 if action == 'quit'and game_started:
204 game_started = False
205 return "successful quit"
206 else:
207 return "This command is invalid for the current game state, please use begin to create a new game"