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