Initial commit
This commit is contained in:
+159
@@ -0,0 +1,159 @@
|
||||
import random
|
||||
|
||||
class Game:
|
||||
def __init__(game, player, phand, dhand):
|
||||
game.player = player
|
||||
game.phand = phand
|
||||
game.dhand = dhand
|
||||
def __str__(game):
|
||||
return f"{game.player} {game.phand}"
|
||||
|
||||
class Player:
|
||||
def __init__(player, name, wins, losses, money, bet):
|
||||
player.name = name
|
||||
player.wins = wins
|
||||
player.losses = losses
|
||||
player.money = money
|
||||
player.bet = bet
|
||||
def __str__(player):
|
||||
return f"{player.name} WL: {player.wins}/{player.losses} | ${player.money}"
|
||||
|
||||
def getgame(activegames, author):
|
||||
gameexists = False
|
||||
i = -1
|
||||
for x in activegames:
|
||||
i += 1
|
||||
if x.player == author:
|
||||
gameexists = True
|
||||
return [gameexists, i]
|
||||
|
||||
def newhand():
|
||||
hand = []
|
||||
hand.append(random.randint(2, 11))
|
||||
hand.append(random.randint(2, 11))
|
||||
return aces(hand)
|
||||
|
||||
def aces(hand):
|
||||
i = 0
|
||||
total = totalhand(hand)
|
||||
if total > 21:
|
||||
for card in hand:
|
||||
if card == 11:
|
||||
hand[i] = 1
|
||||
break
|
||||
i = i + 1
|
||||
return hand
|
||||
|
||||
def totalhand(hand):
|
||||
total = 0
|
||||
for card in hand:
|
||||
total = total + card
|
||||
return total
|
||||
|
||||
def showhand(hand, player, action):
|
||||
strlist = [str(card) for card in hand]
|
||||
handstr = ",".join(strlist)
|
||||
msg = f"> :joker::joker:{player} {action}: __{handstr}__ :joker::joker:\n>\t\t\t\t\tTotal: {totalhand(hand)}"
|
||||
return msg
|
||||
|
||||
def score(dtotal, ptotal):
|
||||
won = False
|
||||
draw = False
|
||||
winmsg = "> :tada: **__YOU WIN!__** :tada:"
|
||||
losemsg = "> :sob: **__You lose__** :sob:"
|
||||
if dtotal > 21 and ptotal <= 21:
|
||||
won = True
|
||||
elif dtotal < 21 and ptotal > 21:
|
||||
won = False
|
||||
elif dtotal < 21 and ptotal < 21:
|
||||
if dtotal > ptotal:
|
||||
won = False
|
||||
elif dtotal < ptotal:
|
||||
won = True
|
||||
elif dtotal == ptotal:
|
||||
draw = True
|
||||
elif dtotal == 21 and ptotal < 21:
|
||||
won = False
|
||||
elif dtotal < 21 and ptotal == 21:
|
||||
won = True
|
||||
elif dtotal == 21 and ptotal > 21:
|
||||
won = False
|
||||
elif dtotal > 21 and ptotal == 21:
|
||||
won = True
|
||||
elif dtotal > 21 and ptotal > 21:
|
||||
draw = True
|
||||
elif dtotal == ptotal:
|
||||
draw = True
|
||||
else: return ["SCORING ERROR", won, draw]
|
||||
|
||||
if won == True:
|
||||
return [winmsg, won, draw]
|
||||
elif draw == True:
|
||||
return ["> :clown: It's a push :clown:", won, draw]
|
||||
else:
|
||||
return [losemsg, won, draw]
|
||||
|
||||
def getstats(player):
|
||||
fn = "stats/"+player+".txt"
|
||||
try:
|
||||
with open(fn, "r") as f:
|
||||
currentstats = f.read().split(",")
|
||||
if len(currentstats) < 5:
|
||||
print("[-] Error parsing player stats")
|
||||
else:
|
||||
stats = Player(currentstats[0], currentstats[1], currentstats[2], currentstats[3], currentstats[4])
|
||||
except FileNotFoundError:
|
||||
initplayer(player)
|
||||
stats = getstats(player)
|
||||
return stats
|
||||
|
||||
def initplayer(player):
|
||||
fn = "stats/"+player+".txt"
|
||||
try:
|
||||
with open(fn, "x") as f:
|
||||
f.write(player+",0,0,100,0")
|
||||
except FileExistsError:
|
||||
print("[-] Error parsing player data!")
|
||||
|
||||
def writestats(player):
|
||||
fn = "stats/"+player.name+".txt"
|
||||
with open(fn, "w") as f:
|
||||
statsline = player.name+","+player.wins+","+player.losses+","+str(player.money)+","+str(player.bet)
|
||||
f.writelines(statsline)
|
||||
|
||||
async def hit(message, currentgame, player):
|
||||
gameover = False
|
||||
if totalhand(currentgame.phand) >= 21:
|
||||
await stand(message, currentgame, player)
|
||||
gameover = True
|
||||
else:
|
||||
currentgame.phand.append(random.randint(2,11))
|
||||
currentgame.phand = aces(currentgame.phand)
|
||||
await message.channel.send(showhand(currentgame.phand, currentgame.player, "drew"))
|
||||
if totalhand(currentgame.phand) > 21:
|
||||
await message.channel.send(f"> :boom: **BUST** :boom:")
|
||||
await stand(message, currentgame, player)
|
||||
gameover = True
|
||||
return gameover
|
||||
|
||||
async def stand(message, currentgame, player):
|
||||
await message.channel.send(showhand(currentgame.dhand, "Dealer", "hand"))
|
||||
if totalhand(currentgame.dhand) >= 17:
|
||||
pass
|
||||
else:
|
||||
while totalhand(currentgame.dhand) < 17:
|
||||
currentgame.dhand.append(random.randint(2,11))
|
||||
currentgame.dhand = aces(currentgame.dhand)
|
||||
await message.channel.send(showhand(currentgame.dhand, "Dealer", "drew"))
|
||||
result = score(totalhand(currentgame.dhand), totalhand(currentgame.phand))
|
||||
player = player
|
||||
if result[1] == True:
|
||||
payout = int(player.money) + int(player.bet)
|
||||
updatedplayer = Player(player.name, str(int(player.wins) + 1), str(player.losses), payout, 0)
|
||||
elif result[1] == False and result[2] == True:
|
||||
updatedplayer = Player(player.name, player.wins, player.losses, player.money, 0)
|
||||
else:
|
||||
payout = int(player.money) - int(player.bet)
|
||||
updatedplayer = Player(player.name, player.wins, str(int(player.losses) + 1), payout, 0)
|
||||
writestats(updatedplayer)
|
||||
await message.channel.send(result[0])
|
||||
Reference in New Issue
Block a user