From fd204588b7756898f2ad9a269cc2006ed430e3d6 Mon Sep 17 00:00:00 2001 From: BigGamerGary Date: Tue, 22 Nov 2022 11:19:32 +1000 Subject: [PATCH] Importing Blackjact Bot --- BlackJackBot/BJBot.py | 87 ++++++ BlackJackBot/BlackJack.py | 270 ++++++++++++++++++ .../__pycache__/BlackJack.cpython-39.pyc | Bin 0 -> 6527 bytes BlackJackBot/ledger.txt | 4 + 4 files changed, 361 insertions(+) create mode 100644 BlackJackBot/BJBot.py create mode 100644 BlackJackBot/BlackJack.py create mode 100644 BlackJackBot/__pycache__/BlackJack.cpython-39.pyc create mode 100644 BlackJackBot/ledger.txt diff --git a/BlackJackBot/BJBot.py b/BlackJackBot/BJBot.py new file mode 100644 index 0000000..dc94e74 --- /dev/null +++ b/BlackJackBot/BJBot.py @@ -0,0 +1,87 @@ +from discord import * +from discord.ext import commands + +from BlackJack import * + +client = commands.Bot(command_prefix='~~') + + +@client.event +async def on_ready(): + print("Let's pwn some scrubs") + +@client.command() +async def play_game(ctx, arg): + bj = BlackJack() + gameOver = False + playerStood = False + ID = ctx.message.author.id + IDFound = bj.findID(ID)[0] + if IDFound: + playerStats = bj.readLedger(ID)[1:] + playerStats[0] = ID + else: + bj.addToLedger(ID) + playerStats = (ID, 100, 0, 0) + while not gameOver: + playerWinState = bj.checkHandState(bj.playerHand) + dealerWinState = bj.checkHandState(bj.dealerHand) + gameOver = bj.checkGameOver(playerWinState) + if gameOver: + continue + gameOver = bj.checkGameOver(dealerWinState) + if gameOver: + continue + await ctx.send("Players hand = " + str(getHandTotal(bj.playerHand)) + ": " + handNumbersToCards( + bj.playerHand) + "\n" + "Dealers hand = ??: " + convertNumberToCard(bj.dealerHand[0]) + "??") + + await ctx.send("Hit or Stand? (h/s)") + + def check(m): + return m.content in ["h", "s"] and m.channel == ctx.channel + + msg = await client.wait_for('message', check=check) + if msg == "h": + bj.hit() + elif msg == "s": + bj.stand() + playerStood = True + + + playerWinState = bj.checkHandState(bj.playerHand) + gameOver = bj.checkGameOver(playerWinState) + if gameOver: + continue + # Dealers turn + if playerStood: + while dealerWinState == 'c': + # Dealer hits + bj.hit() + # Player stands + bj.stand() + # Loop ends when game is over + dealerWinState = bj.checkHandState(bj.dealerHand) + else: + bj.hit() + dealerWinState = bj.checkHandState(bj.dealerHand) + + gameOver = bj.checkGameOver(dealerWinState) + if gameOver: + continue + await ctx.send("Players hand = " + str(getHandTotal(bj.playerHand)) + ": " + handNumbersToCards(bj.playerHand) + + "\n" + "Dealers hand = " + str(getHandTotal(bj.dealerHand)) + ": " + handNumbersToCards(bj.dealerHand)) + bet = int(arg) + if playerWinState == "w": + await ctx.send("You won!") + bj.writeLedger(ID, 2*bet, True) + elif playerWinState == "l": + await ctx.send("You busted!") + bj.writeLedger(ID, -bet, False) + elif dealerWinState == "w": + await ctx.send("The Dealer reached 21 before you!") + bj.writeLedger(ID, -bet, False) + elif dealerWinState == "l": + await ctx.send("The Dealer busted before you!") + bj.writeLedger(ID, 2*bet, True) + +client.run('ODU0MjE5MDMzNzc0NTIyMzY4.YMgveA.laeIhhccTDvEbU81Y-RjSEMkaEY') diff --git a/BlackJackBot/BlackJack.py b/BlackJackBot/BlackJack.py new file mode 100644 index 0000000..9b8a2df --- /dev/null +++ b/BlackJackBot/BlackJack.py @@ -0,0 +1,270 @@ +import random + + +def convertNumberToCard(cardNumber): + # Cards index from 0 i.e ace is 0, and the highest card value is 51 + if cardNumber <= 12: + cardSuit = "♣" + elif cardNumber <= 25: + cardSuit = "♦" + elif cardNumber <= 38: + cardSuit = "♥" + elif cardNumber <= 51: + cardSuit = "♠" + + cardNumber = cardNumber % 13 + + if cardNumber == 0: + cardNumber = "A" + elif cardNumber == 10: + cardNumber = "J" + elif cardNumber == 11: + cardNumber = "Q" + elif cardNumber == 12: + cardNumber = "K" + else: + cardNumber += 1 + + return "{value}{suit} ".format(value=str(cardNumber), suit=cardSuit) + + +def generateDeck(): + deck = [] + while len(deck) < 52: + newCard = random.randint(0, 51) + if deck.count(newCard) == 0: + deck.append(newCard) + return deck + + +def addCardToHand(hand, deck): + card = deck.pop(0) + hand.append(card) + + +def generateHand(hand, deck): + i = 0 + while i < 2: + addCardToHand(hand, deck) + i += 1 + + +def handNumbersToCards(hand): + cards = "" + for a in hand: + cards += convertNumberToCard(a) + return cards + + +def getHandTotal(hand): + i = 0 + for card in hand: + card = card % 13 + 1 + if card > 10: + card = 10 + if (card == 1) and (i < 20): + card = 11 + if (i + card) > 21: + card = 1 + i += card + return i + + +class BlackJack: + def __init__(self): + self.playerTurn = True + + self.deck = generateDeck() + self.playerHand = [] + generateHand(self.playerHand, self.deck) + self.dealerHand = [] + generateHand(self.dealerHand, self.deck) + + def getPH(self): + return self.playerHand + + def returnCards(self): + self.playerHand.clear() + self.dealerHand.clear() + + def shuffle(self): + self.returnCards() + self.deck = generateDeck() + generateHand(self.playerHand, self.deck) + generateHand(self.dealerHand, self.deck) + + def getDH(self): + return self.dealerHand + + def stand(self): + if self.playerTurn: + self.playerTurn = False + + def hit(self): + if self.playerTurn: + addCardToHand(self.playerHand, self.deck) + self.playerTurn = False + else: + addCardToHand(self.dealerHand, self.deck) + self.playerTurn = True + + def checkHandState(self, hand): + # Check the hand state and return w if game is won, l if lost and c for continue + total = getHandTotal(hand) + + if total == 21: + return "w" + elif total > 21: + return "l" + else: + return "c" + + def dealerHitLogic(self, hand): + total = getHandTotal() + if total > 17: + self.stand() + elif total <= 16: + self.hit() + + + def checkGameOver(self, state): + gameOver = False + if state == "w": + gameOver = True + elif state == "l": + gameOver = True + return gameOver + + def play_game(self, bet): + validInput = False + gameOver = False + playerStood = False + ID = input("ID: (Unique)") + IDFound = self.findID(ID)[0] + if IDFound: + playerStats = self.readLedger(ID)[1:] + playerStats[0] = ID + else: + self.addToLedger(ID) + playerStats = (ID, 100, 0, 0) + + while not gameOver: + playerWinState = self.checkHandState(self.playerHand) + dealerWinState = self.checkHandState(self.dealerHand) + gameOver = self.checkGameOver(playerWinState) + if gameOver: + continue + gameOver = self.checkGameOver(dealerWinState) + if gameOver: + continue + + print("Players hand = " + str(getHandTotal(self.playerHand)) + ": " + handNumbersToCards( + self.playerHand) + "\n" + "Dealers hand = ??: " + convertNumberToCard(self.dealerHand[0]) + "??") + play = input("Hit or Stand? (h/s)") + while not validInput: + if play == "h": + self.hit() + validInput = True + elif play == "s": + self.stand() + validInput = True + playerStood = True + + playerWinState = self.checkHandState(self.playerHand) + gameOver = self.checkGameOver(playerWinState) + if gameOver: + continue + + # Dealers turn + if playerStood: + while dealerWinState == 'c': + # Dealer hits + self.hit() + # Player stands + self.stand() + # Loop ends when game is over + dealerWinState = self.checkHandState(self.dealerHand) + else: + self.hit() + dealerWinState = self.checkHandState(self.dealerHand) + + gameOver = self.checkGameOver(dealerWinState) + if gameOver: + continue + + print("Players hand = " + str(getHandTotal(self.playerHand)) + ": " + handNumbersToCards(self.playerHand) + + "\n" + "Dealers hand = " + str(getHandTotal(self.dealerHand)) + ": " + handNumbersToCards(self.dealerHand)) + if playerWinState == "w": + print("You won!") + self.writeLedger(ID, 2*bet, True) + elif playerWinState == "l": + print("You busted!") + self.writeLedger(ID, -bet, False) + elif dealerWinState == "w": + print("The Dealer reached 21 before you!") + self.writeLedger(ID, -bet, False) + elif dealerWinState == "l": + print("The Dealer busted before you!") + self.writeLedger(ID, 2*bet, True) + + def findID(self, ID): + with open("ledger.txt", "r") as ledger: + IDFound = False + lineNo = 0 + print(ID) + for line in ledger: + print(lineNo) + splitline = line.split(":") + if splitline[0] == ID: + IDFound = True + break + lineNo += 1 + return IDFound, lineNo + + def readLedger(self, ID): + lineNo = self.findID(ID)[1] + with open("ledger.txt", "r") as ledger: + lines = ledger.readlines() + + line = lines[lineNo] + splitLine = line.split(":") + money, wins, losses = int(splitLine[1]), int( + splitLine[2]), int(splitLine[3]) + return [lines, lineNo, money, wins, losses] + + def writeLedger(self, ID, moneyWon, wonAGame): + lines, lineNo, currentMoney, currentWins, currentLosses = self.readLedger( + ID) + updatedMoney = currentMoney + moneyWon + if wonAGame: + updatedWins = currentWins + 1 + updatedLosses = currentLosses + else: + updatedLosses = currentLosses + 1 + updatedWins = currentWins + + with open("ledger.txt", "w") as ledger: + i = 0 + for line in lines: + if i == lineNo: + ledger.write("{ID}:{Money}:{Wins}:{Losses}\n".format( + ID=ID, + Money=updatedMoney, + Wins=updatedWins, + Losses=updatedLosses)) + else: + ledger.write(line) + i += 1 + + def addToLedger(self, ID, starterCash=100): + with open("ledger.txt", "a") as ledger: + ledger.write("{ID}:{Money}:0:0\n".format(ID=ID, Money=starterCash)) + + +def main(): + bj = BlackJack() + bj.play_game(100) + + +if __name__ == "__main__": + main() diff --git a/BlackJackBot/__pycache__/BlackJack.cpython-39.pyc b/BlackJackBot/__pycache__/BlackJack.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10a9810878af0c4ef8605a353460554628be7a5f GIT binary patch literal 6527 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 O6#n`A&$aXDv;P5~S2z&> literal 0 HcmV?d00001 diff --git a/BlackJackBot/ledger.txt b/BlackJackBot/ledger.txt new file mode 100644 index 0000000..631502d --- /dev/null +++ b/BlackJackBot/ledger.txt @@ -0,0 +1,4 @@ +123672601259147265:100:0:0 +123672601259147265:100:0:0 +123672601259147265:100:0:0 +123672601259147265:100:0:0