🃏 Created blackjack game
This commit is contained in:
301
funcs/games/blackjack.py
Normal file
301
funcs/games/blackjack.py
Normal file
@ -0,0 +1,301 @@
|
||||
import random
|
||||
import json
|
||||
import math
|
||||
|
||||
from shutil import copyfile
|
||||
|
||||
from funcs import logThis, replaceMultiple
|
||||
from . import money, blackjackDraw
|
||||
|
||||
deckAmount = 4
|
||||
|
||||
def shuffle():
|
||||
logThis("Shuffling the blackjack deck")
|
||||
|
||||
with open("resources/games/deckofCards.txt","r") as f:
|
||||
deck = f.read()
|
||||
|
||||
allDecks = deck.split("\n") * 4
|
||||
random.shuffle(allDecks)
|
||||
data = "\n".join(allDecks)
|
||||
|
||||
with open("resources/games/blackjackCards.txt","w") as f:
|
||||
f.write(data)
|
||||
|
||||
return
|
||||
|
||||
def calcHandValue(hand : list):
|
||||
logThis("Calculating hand value")
|
||||
values = [0]
|
||||
|
||||
for card in hand:
|
||||
cardValue = card[0]
|
||||
cardValue = replaceMultiple(cardValue,["0","k","q","j"],"10")
|
||||
if cardValue == "a":
|
||||
length = len(values)
|
||||
for x in range(length):
|
||||
values.append(values[x] + 11)
|
||||
values[x] += 1
|
||||
else:
|
||||
for x in range(len(values)):
|
||||
values[x] += int(cardValue)
|
||||
|
||||
values.sort()
|
||||
|
||||
handValue = values[0]
|
||||
for value in values:
|
||||
if value <= 21:
|
||||
handValue = value
|
||||
|
||||
return handValue
|
||||
|
||||
def drawCard():
|
||||
logThis("drawing a card")
|
||||
with open("resources/games/blackjackCards.txt","r") as f:
|
||||
cards = f.read().split("\n")
|
||||
|
||||
drawnCard = cards[0]
|
||||
cards = cards[1:]
|
||||
data = "\n".join(cards)
|
||||
|
||||
with open("resources/games/blackjackCards.txt","w") as f:
|
||||
f.write(data)
|
||||
|
||||
return drawnCard
|
||||
|
||||
def dealerDraw(channel):
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
done = False
|
||||
|
||||
if calcHandValue(data["blackjack games"][channel]["dealer hand"]) < 17:
|
||||
data["blackjack games"][channel]["dealer hand"].append(drawCard())
|
||||
else:
|
||||
done = True
|
||||
|
||||
if calcHandValue(data["blackjack games"][channel]["dealer hand"]) > 21:
|
||||
data["blackjack games"][channel]["dealer busted"] = True
|
||||
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
|
||||
return done
|
||||
|
||||
def blackjackContinue(channel):
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
done = False
|
||||
|
||||
if data["blackjack games"][channel]["open for bets"]:
|
||||
data["blackjack games"][channel]["open for bets"] = False
|
||||
|
||||
|
||||
allStanding = True
|
||||
message = "All players are standing. The dealer now shows his cards and draws."
|
||||
|
||||
if data["blackjack games"][channel]["all standing"]:
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
|
||||
done = dealerDraw(channel)
|
||||
message = "The dealer draws a card."
|
||||
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
for user in data["blackjack games"][channel]["user hands"]:
|
||||
if data["blackjack games"][channel]["user hands"][user]["hit"] == False:
|
||||
data["blackjack games"][channel]["user hands"][user]["standing"] = True
|
||||
|
||||
if data["blackjack games"][channel]["user hands"][user]["standing"] == False:
|
||||
allStanding = False
|
||||
data["blackjack games"][channel]["user hands"][user]["hit"] = False
|
||||
|
||||
if allStanding:
|
||||
data["blackjack games"][channel]["all standing"] = True
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
else:
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
|
||||
blackjackDraw.drawImage(channel)
|
||||
|
||||
if allStanding:
|
||||
if done == False:
|
||||
return message, True, done
|
||||
else:
|
||||
return "The dealer is done drawing cards", True, done
|
||||
else:
|
||||
return "You have 20 seconds to either hit or stand with \"!blackjack hit\" or \"!blackjack stand\". It's assumed you're standing if you don't make a choice.", False, done
|
||||
|
||||
def blackjackHit(channel,user):
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
if data["blackjack games"][channel]["open for bets"] == False:
|
||||
if data["blackjack games"][channel]["user hands"][user]["hit"] == False:
|
||||
if data["blackjack games"][channel]["user hands"][user]["standing"] == False:
|
||||
data["blackjack games"][channel]["user hands"][user]["hand"].append(drawCard())
|
||||
data["blackjack games"][channel]["user hands"][user]["hit"] = True
|
||||
|
||||
handValue = calcHandValue(data["blackjack games"][channel]["user hands"][user]["hand"])
|
||||
|
||||
if handValue == 21:
|
||||
data["blackjack games"][channel]["user hands"][user]["standing"] = True
|
||||
elif handValue > 21:
|
||||
data["blackjack games"][channel]["user hands"][user]["standing"] = True
|
||||
data["blackjack games"][channel]["user hands"][user]["busted"] = True
|
||||
|
||||
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
|
||||
return "accept"
|
||||
else:
|
||||
logThis(user+" is already standing")
|
||||
return "You can't hit when you're standing"
|
||||
else:
|
||||
logThis(user+" has already hit this round")
|
||||
return "You've already hit this round"
|
||||
else:
|
||||
logThis(user+" tried to hit on the first round")
|
||||
return "You can't hit before you see your cards"
|
||||
|
||||
def blackjackStand(channel,user):
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
if data["blackjack games"][channel]["open for bets"] == False:
|
||||
if data["blackjack games"][channel]["user hands"][user]["hit"] == False:
|
||||
if data["blackjack games"][channel]["user hands"][user]["standing"] == False:
|
||||
data["blackjack games"][channel]["user hands"][user]["standing"] = True
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
|
||||
return "accept"
|
||||
else:
|
||||
logThis(user+" is already standing")
|
||||
return "You're already standing"
|
||||
else:
|
||||
logThis(user+" has already hit this round")
|
||||
return "You've already hit this round"
|
||||
else:
|
||||
logThis(user+" tried to stand on the first round")
|
||||
return "You can't stand before you see your cards"
|
||||
|
||||
def blackjackPlayerDrawHand(channel,user,bet):
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
logThis(user+" is trying to join the game in "+channel)
|
||||
|
||||
if channel in data["blackjack games"]:
|
||||
if user not in data["blackjack games"][channel]["user hands"]:
|
||||
if len(data["blackjack games"][channel]["user hands"]) < 5:
|
||||
if data["blackjack games"][channel]["open for bets"]:
|
||||
if money.checkBalance(user) >= bet:
|
||||
money.addMoney(user,-1 * bet)
|
||||
playerHand = [drawCard(),drawCard()]
|
||||
|
||||
handValue = calcHandValue(playerHand)
|
||||
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
if handValue == 21:
|
||||
data["blackjack games"][channel]["user hands"][user] = {"hand":playerHand,"bet":bet,"standing":True,"busted":False,"blackjack":True,"hit":True}
|
||||
else:
|
||||
data["blackjack games"][channel]["user hands"][user] = {"hand":playerHand,"bet":bet,"standing":False,"busted":False,"blackjack":False,"hit":True}
|
||||
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
|
||||
logThis(user+" entered the game")
|
||||
return user+" entered the game"
|
||||
else:
|
||||
logThis(user+" doesn't have enough GwendoBucks")
|
||||
return "You don't have enough GwendoBucks to place that bet"
|
||||
else:
|
||||
logThis("The table is no longer open for bets")
|
||||
return "The table is no longer open for bets"
|
||||
else:
|
||||
logThis("There are already 5 players in the game.")
|
||||
return "There's already a maximum of players at the table."
|
||||
else:
|
||||
logThis(user+" is already in the game")
|
||||
return "You've already entered this game"
|
||||
else:
|
||||
logThis("There is no game going on in "+channel)
|
||||
return "There is no game going on in this channel"
|
||||
|
||||
def blackjackStart(channel:str):
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
logThis("Trying to start a blackjack game in "+channel)
|
||||
|
||||
if channel not in data["blackjack games"]:
|
||||
|
||||
dealerHand = [drawCard(),drawCard()]
|
||||
|
||||
data["blackjack games"][channel] = {"dealer hand": dealerHand,"dealer busted":False,"user hands": {},"open for bets":True,"all standing":False}
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
|
||||
copyfile("resources/games/blackjackTable.png","resources/games/tables/blackjackTable"+channel+".png")
|
||||
|
||||
return "started"
|
||||
else:
|
||||
logThis("There is already a blackjack game going on in "+channel)
|
||||
return "There's already a blackjack game going on. Try again in a few minutes."
|
||||
|
||||
def blackjackFinish(channel):
|
||||
finalWinnings = "*Final Winnings:*\n"
|
||||
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
dealerValue = calcHandValue(data["blackjack games"][channel]["dealer hand"])
|
||||
reason = ""
|
||||
|
||||
for user in data["blackjack games"][channel]["user hands"]:
|
||||
winnings = -1 * data["blackjack games"][channel]["user hands"][user]["bet"]
|
||||
if data["blackjack games"][channel]["user hands"][user]["blackjack"]:
|
||||
reason = "(blackjack)"
|
||||
winnings += math.floor(2.5 * data["blackjack games"][channel]["user hands"][user]["bet"])
|
||||
else:
|
||||
if data["blackjack games"][channel]["user hands"][user]["busted"] == False:
|
||||
if data["blackjack games"][channel]["dealer busted"]:
|
||||
reason = "(dealer busted)"
|
||||
winnings += 2 * data["blackjack games"][channel]["user hands"][user]["bet"]
|
||||
elif calcHandValue(data["blackjack games"][channel]["user hands"][user]["hand"]) > dealerValue:
|
||||
winnings += 2 * data["blackjack games"][channel]["user hands"][user]["bet"]
|
||||
else:
|
||||
reason = "(busted)"
|
||||
|
||||
if winnings < 0:
|
||||
if winnings == -1:
|
||||
finalWinnings += user+" lost "+str(-1 * winnings)+" GwendoBuck "+reason+"\n"
|
||||
else:
|
||||
finalWinnings += user+" lost "+str(-1 * winnings)+" GwendoBucks "+reason+"\n"
|
||||
else:
|
||||
if winnings == 1:
|
||||
finalWinnings += user+" won "+str(winnings)+" GwendoBuck "+reason+"\n"
|
||||
else:
|
||||
finalWinnings += user+" won "+str(winnings)+" GwendoBucks "+reason+"\n"
|
||||
|
||||
netWinnings = winnings + data["blackjack games"][channel]["user hands"][user]["bet"]
|
||||
|
||||
money.addMoney(user,netWinnings)
|
||||
|
||||
with open("resources/games/games.json", "r") as f:
|
||||
data = json.load(f)
|
||||
|
||||
del data["blackjack games"][channel]
|
||||
|
||||
with open("resources/games/games.json", "w") as f:
|
||||
json.dump(data,f,indent=4)
|
||||
|
||||
return finalWinnings
|
Reference in New Issue
Block a user