🃏 Created blackjack game

This commit is contained in:
NikolajDanger
2020-07-28 01:58:04 +02:00
parent 5c31877656
commit 3db053be12
69 changed files with 530 additions and 24 deletions

View File

@ -1,2 +1,3 @@
from .money import checkBalance, giveMoney
from .trivia import triviaCountPoints, triviaStart, triviaOtherThing
from .money import checkBalance, giveMoney, addMoney
from .trivia import triviaCountPoints, triviaStart, triviaOtherThing
from .blackjack import shuffle, blackjackStart, blackjackPlayerDrawHand, blackjackContinue, blackjackFinish, blackjackHit, blackjackStand

301
funcs/games/blackjack.py Normal file
View 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

View File

@ -0,0 +1,41 @@
import json
from PIL import Image
def drawImage(channel):
with open("resources/games/games.json", "r") as f:
data = json.load(f)
if data["blackjack games"][channel]["all standing"] == False:
dealerHand = drawHand(data["blackjack games"][channel]["dealer hand"],True)
else:
dealerHand = drawHand(data["blackjack games"][channel]["dealer hand"],False)
table = Image.open("resources/games/blackjackTable.png")
table.paste(dealerHand,(800,20),dealerHand)
for x in range(len(data["blackjack games"][channel]["user hands"])):
userHand = drawHand(list(data["blackjack games"][channel]["user hands"].values())[x]["hand"],False)
table.paste(userHand,(32+(384*x),700),userHand)
table.save("resources/games/tables/blackjackTable"+channel+".png")
return
def drawHand(hand, dealer):
length = len(hand)
background = Image.new("RGBA", (691+(125*(length-1)),1065),(0,0,0,0))
if dealer:
img = Image.open("resources/games/cards/"+hand[0].upper()+".png")
background.paste(img,(0,0),img)
img = Image.open("resources/games/cards/red_back.png")
background.paste(img,(125,0),img)
else:
for x in range(length):
img = Image.open("resources/games/cards/"+hand[x].upper()+".png")
background.paste(img,(x*125,0),img)
w, h = background.size
return background.resize((int(w/4),int(h/4)))

View File

@ -3,7 +3,9 @@ import json
from funcs import logThis
def checkBalance(user):
with open("resources/games.json", "r") as f:
user = user.lower()
logThis("checking "+user+"'s account balance")
with open("resources/games/games.json", "r") as f:
data = json.load(f)
if user in data["users"]:
@ -11,7 +13,9 @@ def checkBalance(user):
else: return 0
def addMoney(user,amount):
with open("resources/games.json", "r") as f:
user = user.lower()
logThis("adding "+str(amount)+" to "+user+"'s account")
with open("resources/games/games.json", "r") as f:
data = json.load(f)
if user in data["users"]:
@ -20,11 +24,11 @@ def addMoney(user,amount):
else:
data["users"][user] = amount
with open("resources/games.json", "w") as f:
with open("resources/games/games.json", "w") as f:
json.dump(data,f,indent=4)
def giveMoney(user,targetUser,amount):
with open("resources/games.json", "r") as f:
with open("resources/games/games.json", "r") as f:
data = json.load(f)
if user in data["users"]:

View File

@ -6,8 +6,8 @@ from . import money
from funcs import logThis
def triviaStart(channel : str):
with open("resources/games.json", "r") as f:
triviaFile = json.load(f)
with open("resources/games/games.json", "r") as f:
triviaFile = json.load(f)
logThis("Trying to find a trivia question for "+channel)
@ -22,7 +22,7 @@ def triviaStart(channel : str):
correctAnswer = answers.index(data["results"][0]["correct_answer"]) + 97
triviaFile["trivia questions"][channel] = {"answer" : str(chr(correctAnswer)),"players" : {}}
with open("resources/games.json", "w") as f:
with open("resources/games/games.json", "w") as f:
json.dump(triviaFile,f,indent=4)
replacements = {"&#039;": "\'",
@ -45,7 +45,7 @@ def triviaStart(channel : str):
return "There's already a trivia question going on. Try again in like, a minute", "", ""
def triviaOtherThing(user : str, channel : str, command : str):
with open("resources/games.json", "r") as f:
with open("resources/games/games.json", "r") as f:
data = json.load(f)
if command in ["a","b","c","d"]:
@ -55,7 +55,7 @@ def triviaOtherThing(user : str, channel : str, command : str):
data["trivia questions"][channel]["players"][user] = command
with open("resources/games.json", "w") as f:
with open("resources/games/games.json", "w") as f:
json.dump(data,f,indent=4)
return "Locked in "+user+"'s answer"
@ -67,7 +67,7 @@ def triviaOtherThing(user : str, channel : str, command : str):
return "I didn't quite understand that"
def triviaCountPoints(channel : str):
with open("resources/games.json", "r") as f:
with open("resources/games/games.json", "r") as f:
data = json.load(f)
logThis("Counting points for question in "+channel)