diff --git a/BlackJack.py b/BlackJack.py index 99f4bd1..e2bc738 100644 --- a/BlackJack.py +++ b/BlackJack.py @@ -84,7 +84,7 @@ def showDeck(deck): class BlackJack: def __init__(self): - self.gameState = INIT + self.gameInSession = False self.playerTurn = True self.deck = generateDeck() random.shuffle(self.deck) @@ -93,12 +93,6 @@ class BlackJack: self.dealerHand = [] self.ledger = Ledger.Ledger() - def getPH(self): - return self.playerHand - - def getDH(self): - return self.dealerHand - def returnCards(self): self.discard.extend(self.playerHand) self.playerHand.clear() @@ -164,30 +158,38 @@ class BlackJack: async def play_game(self, ID, bet, recv, send): - self.gameState = INIT + if self.gameInSession: + await send("Fuck you") + return + else: + self.gameInSession = True + gameState = INIT - while self.gameState != OVER: + while gameState != OVER: - if self.gameState == INIT: + if gameState == INIT: + self.returnCards() playerStats = self.ledger.read(ID) if playerStats is None: self.ledger.write(ID) playerStats = self.ledger.read(ID) self.deal() - + playerWinState = self.checkHandState(self.playerHand) + dealerWinState = self.checkHandState(self.dealerHand) + play = None - self.playerTurn = True playerStood = False dealerStood = False validInput = False - self.gameState = PLAYING + + gameState = CHECKING - elif self.gameState == PLAYING: + elif gameState == PLAYING: await send("Players hand = " + str(getHandTotal(self.playerHand)) + ": " + handNumbersToCards( self.playerHand) + "\n" + "Dealers hand = ??: " + convertNumberToCard(self.dealerHand[0]) + "??") - play = await recv("Hit or Stand? (h/s)") + play = await recv("Hit or Stand?") while not validInput: if play == "h": self.hit() @@ -197,12 +199,12 @@ class BlackJack: playerStood = True validInput = True - self.dealerHitLogic() + dealerStood = self.dealerHitLogic() playerWinState = self.checkHandState(self.playerHand) dealerWinState = self.checkHandState(self.dealerHand) - self.gameState = CHECKING + gameState = CHECKING - elif self.gameState == ENDING: + elif gameState == ENDING: # Players turn self.stand() @@ -215,18 +217,18 @@ class BlackJack: if dealerWinState == "c": dealerWinState = self.compareHands() - self.gameState = CHECKING + gameState = CHECKING - elif self.gameState == CHECKING: + elif gameState == CHECKING: if self.checkGameOver(playerWinState) or self.checkGameOver(dealerWinState): - self.gameState = FINISHED + gameState = FINISHED elif playerStood: - self.gameState = ENDING + gameState = ENDING else: - self.gameState = PLAYING + gameState = PLAYING - elif self.gameState == FINISHED: + elif gameState == FINISHED: await send("Players hand = " + str(getHandTotal(self.playerHand)) + ": " + handNumbersToCards(self.playerHand) + "\n" + "Dealers hand = " + str(getHandTotal(self.dealerHand)) + ": " + handNumbersToCards(self.dealerHand)) @@ -252,4 +254,5 @@ class BlackJack: await send("Shuffling Deck") self.shuffle() - self.gameState = OVER + gameState = OVER + self.gameInSession = False diff --git a/BlackJack2.py b/BlackJack2.py new file mode 100644 index 0000000..337c316 --- /dev/null +++ b/BlackJack2.py @@ -0,0 +1,89 @@ +import random + +""" +Class which describes playing cards +""" +class Card(): + """ + A joker card has value 0 and suit 0 + """ + HEARTS = 1 + DIAMONDS = 2 + SPADES = 3 + CLUBS = 4 + + def __init__(self, value, suit) -> None: + self.value = value + self.suit = suit + + def __str__(self) -> str: + suits = ["J", "♥", "♦", "♠", "♣"] + special_cards = {1: "A", 11: "J", 12: "Q", 13: "K"} + strValue = "" + + if self.value in special_cards.keys(): + strValue = special_cards[self.value] + else: + strValue = str(self.value) + + string = "" + string.format("%s %s", suits[self.suit], strValue) + return string + + + + +""" +Class for interacting with a deck of cards +""" +class Deck(): + def __init__(self) -> None: + self.deck = [] + self.discard = [] + self.joker = False + if self.joker: + self.deck = [x for x in range(0, 52)] + else: + self.deck = [x for x in range(0, 51)] + + def shuffle(self): + random.shuffle(self.deck) + + def take_from_deck(self): + card = self.deck.pop() + return card + + def return_to_deck_top(self, card): + self.deck.insert(0, card) + + def returnToDeckBottom(self, card): + self.deck.append(card) + + def addToDiscard(self, card): + self.discard.insert(0, card) + + def returnFromDiscard(self): + self.returnToDeckTop(self.discard.pop()) + + def __str__(self) -> str: + string = "" + for card in self.deck: + string += convertNumberToCard(card) + return string + +class Hand(): + def __init__(self) -> None: + self.hand = [] + + def sortHand(self): + self.hand.sort() + + def addToHand(self, card): + self.hand.append(card) + + def removeFromHand(self, index): + card = self.hand.remove(index) + return card + + + \ No newline at end of file diff --git a/BlackJackTest.py b/BlackJackTest.py new file mode 100644 index 0000000..2f1ba72 --- /dev/null +++ b/BlackJackTest.py @@ -0,0 +1,271 @@ +import random +import Ledger + +# Game States +INIT = 0 +PLAYING = 1 +ENDING = 2 +FINISHED = 3 +OVER = 5 +CHECKING = 6 + + + +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(): + return [x for x in range(0, 51)] + +def addCardToHand(hand, deck): + card = deck.pop(0) + hand.append(card) + +def generateHand(hand, deck, handSize = 2): + i = 0 + while i < handSize: + addCardToHand(hand, deck) + i += 1 + +def handNumbersToCards(hand): + cards = "" + for card in hand: + cards += convertNumberToCard(card) + return cards + +def getHandTotal(hand): + cardValue = lambda c: min(c % 13 + 1, 10) + i = 0 + aces = 0 + for card in hand: + card = cardValue(card) + if card == 1: + aces += 1 + else: + i += card + + while aces > 0: + if i < 20: + card = 11 + if (i + card) > 21: + card = 1 + i += card + aces -= 1 + return i + +def showDeck(deck): + string = "" + for card in deck: + string += convertNumberToCard(card) + return string + +class BlackJack: + def __init__(self): + self.gameInSession = False + self.playerTurn = True + self.deck = generateDeck() + random.shuffle(self.deck) + self.discard = [] + self.playerHand = [] + self.dealerHand = [] + self.ledger = Ledger.Ledger() + + def returnCards(self): + self.discard.extend(self.playerHand) + self.playerHand.clear() + self.discard.extend(self.dealerHand) + self.dealerHand.clear() + + def deal(self): + generateHand(self.playerHand, self.deck) + generateHand(self.dealerHand, self.deck) + + def shuffle(self): + self.deck.extend(self.discard) + self.discard.clear() + random.shuffle(self.deck) + + 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): + total = getHandTotal(self.dealerHand) + if total > 17: + self.stand() + return True + else: + self.hit() + + + def checkGameOver(self, state): + gameOver = False + if state == "w": + gameOver = True + elif state == "l": + gameOver = True + return gameOver + + def compareHands(self): + dealerTotal = getHandTotal(self.dealerHand) + playerTotal = getHandTotal(self.playerHand) + if dealerTotal < playerTotal: + return "l" + else: + return "w" + + def play_game(self, ID, bet, recv, send): + + if self.gameInSession: + send("Fuck you") + return + else: + self.gameInSession = True + gameState = INIT + + while gameState != OVER: + + if gameState == INIT: + + self.returnCards() + playerStats = self.ledger.read(ID) + if playerStats is None: + self.ledger.write(ID) + playerStats = self.ledger.read(ID) + self.deal() + playerWinState = self.checkHandState(self.playerHand) + dealerWinState = self.checkHandState(self.dealerHand) + + play = None + playerStood = False + dealerStood = False + validInput = False + + gameState = CHECKING + + elif gameState == PLAYING: + + send("Players hand = " + str(getHandTotal(self.playerHand)) + ": " + handNumbersToCards( + self.playerHand) + "\n" + "Dealers hand = ??: " + convertNumberToCard(self.dealerHand[0]) + "??") + play = recv("Hit or Stand?") + while not validInput: + if play == "h": + self.hit() + validInput = True + elif play == "s": + self.stand() + playerStood = True + validInput = True + + dealerStood = self.dealerHitLogic() + playerWinState = self.checkHandState(self.playerHand) + dealerWinState = self.checkHandState(self.dealerHand) + gameState = CHECKING + + elif gameState == ENDING: + + # Players turn + self.stand() + # Dealers turn + dealerStood = self.dealerHitLogic() + # Loop ends when game is over + dealerWinState = self.checkHandState(self.dealerHand) + if dealerStood: + + if dealerWinState == "c": + + dealerWinState = self.compareHands() + gameState = CHECKING + + elif gameState == CHECKING: + + if self.checkGameOver(playerWinState) or self.checkGameOver(dealerWinState): + gameState = FINISHED + elif playerStood: + gameState = ENDING + else: + gameState = PLAYING + + elif gameState == FINISHED: + + send("Players hand = " + str(getHandTotal(self.playerHand)) + ": " + handNumbersToCards(self.playerHand) + + "\n" + "Dealers hand = " + str(getHandTotal(self.dealerHand)) + ": " + handNumbersToCards(self.dealerHand)) + if playerWinState == "w": + send("You won!") + win = (2*bet, 1, 0, ID) + self.ledger.update(ID, win) + elif playerWinState == "l": + send("You busted!") + loss = (-bet, 0, 1, ID) + self.ledger.update(ID, loss) + elif dealerWinState == "w": + send("The Dealer reached 21 before you!") + loss = (-bet, 0, 1, ID) + self.ledger.update(ID, loss) + elif dealerWinState == "l": + send("The Dealer busted before you!") + win = (2*bet, 1, 0, ID) + self.ledger.update(ID, win) + + self.returnCards() + if len(self.deck) < 0.25 * 52: + send("Shuffling Deck") + self.shuffle() + + gameState = OVER + self.gameInSession = False + +def send(str): + return input(str) + +def main(): + + bj = BlackJack() + bj.play_game(12, 100, send, print) + + +if __name__ == "__main__": + main() + diff --git a/Calculator.py b/Calculator.py index bfabc35..37437e0 100644 --- a/Calculator.py +++ b/Calculator.py @@ -127,7 +127,7 @@ class Calculator(discord.ui.View): displayOutput = " ".join(['`', ' ' * padding, f"{self.inputTwo}", f"{funckyDict[self.expression]}", f"{self.inputOne}", "=", f"{self.output}", "`"]) return displayOutput - @discord.ui.button(label="=", style=discord.ButtonStyle.green, row=4) + @discord.ui.button(label="=", style=discord.ButtonStyle.green, row=3) async def equals(self, interaction: discord.Interaction, button: discord.ui.Button): if self.inputTwo is None: diff --git a/__pycache__/BlackJack.cpython-310.pyc b/__pycache__/BlackJack.cpython-310.pyc index 27c3463..5591cd5 100644 Binary files a/__pycache__/BlackJack.cpython-310.pyc and b/__pycache__/BlackJack.cpython-310.pyc differ diff --git a/ledger.db b/ledger.db index 0704eba..552732d 100644 Binary files a/ledger.db and b/ledger.db differ