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, recv, send): self.playerTurn = True self.deck = generateDeck() self.playerHand = [] generateHand(self.playerHand, self.deck) self.dealerHand = [] generateHand(self.dealerHand, self.deck) self.recv = recv self.send = send 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 = self.recv("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 self.send("Players hand = " + str(getHandTotal(self.playerHand)) + ": " + handNumbersToCards( self.playerHand) + "\n" + "Dealers hand = ??: " + convertNumberToCard(self.dealerHand[0]) + "??") play = self.recv("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 self.send("Players hand = " + str(getHandTotal(self.playerHand)) + ": " + handNumbersToCards(self.playerHand) + "\n" + "Dealers hand = " + str(getHandTotal(self.dealerHand)) + ": " + handNumbersToCards(self.dealerHand)) if playerWinState == "w": self.send("You won!") # self.writeLedger(ID, 2*bet, True) elif playerWinState == "l": self.send("You busted!") # self.writeLedger(ID, -bet, False) elif dealerWinState == "w": self.send("The Dealer reached 21 before you!") # self.writeLedger(ID, -bet, False) elif dealerWinState == "l": self.send("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(): terminput = lambda message: input(message) termoutput = lambda message: print(message) bj = BlackJack(terminput, termoutput) bj.play_game(100) if __name__ == "__main__": main()