[PYTHON] Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken ((1) Implementierung von Blackjack)

Einführung

Ich habe versucht, eine Blackjack-Strategie zu entwickeln, während ich Python studiert und das Lernen gestärkt habe. Es gibt eine Strategie, die auf der Wahrscheinlichkeit einer Grundstrategie basiert, aber ich werde versuchen, sie einzuholen.

Ich werde so vorgehen

  1. Blackjack-Implementierung ← Diesmal hier
  2. In OpenAI-Fitnessumgebung registrieren
  3. Lernen Sie die Blackjack-Strategie mit erweitertem Lernen

Warum Blackjack?

Entwicklungsumgebung

Blackjack Regeln

Blackjack ist ein beliebtes Tischspiel im Casino. Ich werde kurz die Regeln vorstellen.

Grundregel

--Verteilen Sie Karten zwischen Dealern und Spielern

Zu implementierende Blackjack-Regeln

Machen Sie einen Blackjack wie diesen.

--Verwenden Sie 6 Paar Spielkarten --BET-Funktion verfügbar (Der Betrag ist jedoch auf 100 USD festgelegt. Die Rendite wird als Belohnung für die Stärkung des Lernens verwendet.)

Implementierung

Der gesamte Code wird am Ende aufgelistet.

Kartenklasse

Generieren Sie eine Spielkarte. Hier wird definiert, wie die Punkte der speziellen Blackjack-Bildkarten gezählt werden. A ist auch etwas Besonderes, aber hier wird es als ein Punkt erzeugt. Die Punktzahl von A wird unter Berücksichtigung der Punktzahl anderer Hände in der Handklasse bestimmt.


class Card:
    '''
Karte generieren
Zahlen: A, 2-10, J, Q, K.
Ruß: Spaten, Herz, Diamant, Keule
    '''
    SUITS = '♠♥♦♣'
    RANKS = range(1, 14)  #Normaler Rang
    SYMBOLS = "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"
    POINTS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]  #Punkte für Black Jack

    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
        self.index = suit + self.SYMBOLS[rank - self.RANKS[0]]
        self.point = self.POINTS[rank - self.RANKS[0]]

    def __repr__(self):
        return self.index

Deckklasse

Definieren Sie "NUM_DECK = 6" und generieren Sie ein Deck mit 6 Kartensätzen. Das Mischen erfolgt gleichzeitig mit der Deckgenerierung.

class Deck:
    '''
Deck mit gemischten Karten (Deck generieren)
    '''
    def __init__(self):
        self.cards = [Card(suit, rank) \
            for suit in Card.SUITS \
            for rank in Card.RANKS]

        if NUM_DECK > 1:
            temp_cards = copy.deepcopy(self.cards)
            for i in range(NUM_DECK - 1):
                self.cards.extend(temp_cards)
        random.shuffle(self.cards)
・ ・ ・ Abkürzung

Handklasse

Fügen Sie Ihrer Hand Karten hinzu und berechnen Sie Punkte. Das Urteil der weichen Hand (Hand einschließlich A) ist ebenfalls enthalten.

class Hand:
    """
Handklasse
    """
    def __init__(self):
        self.hand = []
        self.is_soft_hand = False

    def add_card(self, card):
        #Der Vorgang des Hinzufügens einer Karte zu Ihrer Hand.
・ ・ ・ Abkürzung

    def check_soft_hand(self):
        #Überprüfen Sie, ob es sich um eine weiche Hand handelt (Hand einschließlich A).
・ ・ ・ Abkürzung

    def sum_point(self):
        #Berechnen Sie die Punkte in Ihrer Hand.
        #Berechnen Sie für weiche Hände sowohl, wenn A 1 ist, als auch, wenn A 11 ist.
・ ・ ・ Abkürzung

    def calc_final_point(self):
        #Berechnen Sie Punkte im Wettbewerb mit dem Händler
        #Gibt den Endpunkt nicht BUST zurück
・ ・ ・ Abkürzung

    def is_bust(self):
        #Bestimmen Sie, ob Ihre Hand BUST ist (mehr als 21)
・ ・ ・ Abkürzung

    def deal(self, card):
        #Verarbeitung zum Zeitpunkt des Geschäftsabschlusses
・ ・ ・ Abkürzung

    def hit(self, card):
        #Verarbeitung zum Zeitpunkt des Treffers
・ ・ ・ Abkürzung

Spielerklasse

Hier werden Auswahlmöglichkeiten wie Stand und Hit definiert. Wenn Sie nicht implementierte Aufteilung und Versicherung hinzufügen möchten, klicken Sie hier. Als Bonus habe ich einen automatischen Spielmodus hinzugefügt. Sie können mit der entsprechenden KI spielen, die später beschrieben wird.

class Player:
    def __init__(self):
        self.hand = Hand()
        self.chip = Chip()
        self.done = False  #Flagge, die das Ende des Zuges des Spielers anzeigt
        self.hit_flag = False  #Flag, das angibt, ob der Spieler Treffer ausgewählt hat
        self.is_human = False  # True:Die Leute spielen, falsch:Automatisches Abspielen

    def init_player(self):
        #Initialisieren Sie Ihre Hand und jede Flagge
・ ・ ・ Abkürzung

    def deal(self, card):
        #Bearbeitung am Stand
・ ・ ・ Abkürzung

    def hit(self, card):
        #Verarbeitung zum Zeitpunkt des Treffers
・ ・ ・ Abkürzung

    def stand(self):
        #Bearbeitung am Stand
・ ・ ・ Abkürzung

    def double_down(self, card):
        #Verarbeitung zum Zeitpunkt des Double Down
・ ・ ・ Abkürzung

    def surrender(self):
        #Verarbeitung zum Zeitpunkt der Übergabe
・ ・ ・ Abkürzung

Händlerklasse

Es wäre vielleicht schön gewesen, mit der Spielerklasse zusammen zu sein. Ich dachte, ich brauche eine Methode, die nur für einen Händler gilt, aber ich hatte keine.

Chipklasse

Austausch von Chips nach dem Spiel. Wenn Sie gewinnen, erhalten Sie den doppelten Betrag, den Sie setzen, und wenn Sie verlieren, verfällt der gesamte Betrag. Wenn es sich um ein Unentschieden handelt, wird die Wette unverändert an den Spieler zurückgegeben.

class Chip:
    def __init__(self):
        self.balance = INITIAL_CHIP
        self.bet = 0

    def bet_chip(self, bet):
        self.balance -= bet
        self.bet = bet

    def pay_chip_win(self):
        self.balance += self.bet * 2

    def pay_chip_lose(self):
        self.balance = self.balance

    def pay_chip_push(self):
        self.balance += self.bet

KI-Klasse

Enthält eine geeignete KI für das automatische Spielen. Bonuslevel. Es ist für einen Test vor der Stärkung des Lernens.

class AI:
・ ・ ・ Abkürzung
    def select_random3(self, hand, n):
        if hand < 11:
            selection = 'h'  # hit
        elif hand == 11 and n == 2:
            selection = 'd'  # double down
        elif hand == 16 and n == 2:
            selection = 'r'  # surrender
        elif hand > 17:
            selection = 's'  # stand
        else:
            r = random.randint(0, 1)
            if r > 0.5:
                selection = 'h'  # hit
            else:
                selection = 's'  # stand

        return selection

Spielklasse

Dies ist die Hauptfunktion von Blackjack. Es kann schwierig sein zu sehen, da die anzeigebezogenen Methoden gemischt sind. Es gibt Raum für Verbesserungen. Die Funktion player_step wird auch in der Schrittfunktion des Fitnessstudios verwendet.

class Game:
    def __init__(self):
        self.game_mode = 0  # 0:Warten auf den Start, 1:Im Spiel, 2:Spiel ist aus
        self.deck = Deck()
        self.player = Player()
        self.dealer = Dealer()
        self.judgment = 0  # 1:Win, 0:zeichnen, -1:Verlieren
        self.game_count = 0
        self.start()

        self.message_on = True #self.player.is_human  # True:Zeigen Sie auf der Konsole die Meldung Falsch an:Zeigen Sie keine Nachrichten auf der Konsole an

    def start(self):
        #Mische das Deck, Spieler,Händler initialisieren
・ ・ ・ Abkürzung

    def reset_game(self):
        # Player,Händlerhand zurücksetzen
・ ・ ・ Abkürzung

    def bet(self, bet):
        #Spieler setzt
・ ・ ・ Abkürzung

    def deal(self, n=2):
        # Player,Karten an Händler austeilen
・ ・ ・ Abkürzung

    def player_turn(self):
        #Spieler ist an der Reihe. Geben Sie die Aktion über die Konsole ein oder entscheiden Sie automatisch mit der entsprechenden KI
・ ・ ・ Abkürzung

    def player_step(self, action):
        # Stand, Hit, Double down,Verarbeitung nach Übergabe
・ ・ ・ Abkürzung

    def show_card(self):
        #Zeigen Sie die Karte an. Die verdeckte Karte des Händlers wird als "?"
・ ・ ・ Abkürzung

    def dealer_turn(self):
        #Händler ist an der Reihe. Ziehe eine Karte, bis du 17 oder mehr Punkte hast
・ ・ ・ Abkürzung

    def open_dealer(self):
        #Öffnen Sie die verdeckte Karte des Händlers
・ ・ ・ Abkürzung

    def judge(self):
        #Urteil über Sieg oder Niederlage
・ ・ ・ Abkürzung

    def pay_chip(self):
        #Chip-Abrechnung
・ ・ ・ Abkürzung

    def check_chip(self):
        #Überprüfen Sie, ob der Besitz des Spielers unter dem Mindesteinsatz (Mindesteinsatzbetrag) liegt.
        #Wenn es unten ist, beenden Sie das Spiel
・ ・ ・ Abkürzung

    def show_judgement(self):
        #Zeigen Sie das Ergebnis von Sieg oder Niederlage
・ ・ ・ Abkürzung

    def ask_next_game(self):
        #Fragen Sie, ob Sie das Spiel fortsetzen möchten
・ ・ ・ Abkürzung

    def check_deck(self):
        #Überprüfen Sie die verbleibende Anzahl von Karten und mischen Sie, wenn es nur wenige gibt
・ ・ ・ Abkürzung

Hauptfunktion

Schreiben Sie die Verarbeitung entlang des Spielflusses in die Hauptfunktion. Wenn Sie dies tun, können Sie mit Blackjack spielen. Apropos, ・ NUM_DECK = 6 # Anzahl der Decks ・ INITIAL_CHIP = 1000 # Anfänglicher Chip ・ MINIMUM_BET = 100 # Mindesteinsatz Es wird gesagt.

def main():
    game = Game()
    game.start()
    while game.game_mode == 1:
        game.reset_game()       #Verschiedene zurücksetzen
        game.bet(bet=100)       #Wette
        game.deal()             #Karten austeilen
        game.player_turn()      #Spieler an der Reihe
        game.dealer_turn()      #Händler ist an der Reihe
        game.judge()            #Urteil über Sieg oder Niederlage
        game.pay_chip()         #Abrechnung von Chips
        game.check_chip()       #Überprüfen Sie das Guthaben des Spielers
        game.ask_next_game()    #Fragen Sie, ob Sie das Spiel fortsetzen möchten
        game.check_deck()       #Überprüfen Sie die Anzahl der verbleibenden Karten

    print("Beenden Sie BlackJack")
    print(str(game.game_count) + "Ich habe die Spielzeiten gespielt")

    return game.player.chip, game.game_count

Ausführungsergebnis

Nach Hit (h) oder Stand (s) oder Double Down (d) oder Surrender (r): Geben Sie Zeichen über die Tastatur ein, um die Spielerauswahl zu bestimmen.


$Ich wette 100
Der Rest$900
Spieler ist an der Reihe
Player : [♠A, ♦9] = [10, 20], soft card : True
Dealer : ♣6, ? = 6
Hit(h) or Stand(s) or Double down(d) or Surrender(r): s
Händler ist an der Reihe
Player : [♠A, ♦9] = 20
Dealer : [♣6, ♥K] = 16
Händler ist an der Reihe
Player : [♠A, ♦9] = 20
Dealer : [♣6, ♥K, ♥3] = 19

Spieler gewinnt

Ballbesitz-Chip des Spielers$1100
Wollen Sie fortfahren? y/n: y
Die Anzahl der verbleibenden Karten beträgt 307

$Ich wette 100
Der Rest$1000
Spieler ist an der Reihe
Player : [♠2, ♥K] = [12], soft card : False
Dealer : ♥3, ? = 3
Hit(h) or Stand(s) or Double down(d) or Surrender(r): h
Spieler ist an der Reihe
Player : [♠2, ♥K, ♥2] = [14], soft card : False
Dealer : ♥3, ? = 3
Hit(h) or Stand(s) or Double down(d) or Surrender(r): h
Spieler ist an der Reihe
Player : [♠2, ♥K, ♥2, ♠Q] = [24], soft card : False
Dealer : ♥3, ? = 3
Player BUST

Spieler verliert

Ballbesitz-Chip des Spielers$1000
Wollen Sie fortfahren? y/n: y
301 Karten übrig

$Ich wette 100
Der Rest$900
Spieler ist an der Reihe
Player : [♥7, ♥5] = [12], soft card : False
Dealer : ♠8, ? = 8
Hit(h) or Stand(s) or Double down(d) or Surrender(r): d
Spieler ist an der Reihe
Player : [♥7, ♥5, ♠8] = [20], soft card : False
Dealer : ♠8, ? = 8
Double Down wurde ausgewählt. Verdoppelte die Wette
Der Rest$800
Händler ist an der Reihe
Player : [♥7, ♥5, ♠8] = 20
Dealer : [♠8, ♥2] = 10
Händler ist an der Reihe
Player : [♥7, ♥5, ♠8] = 20
Dealer : [♠8, ♥2, ♣7] = 17

Spieler gewinnt

Ballbesitz-Chip des Spielers$1200
Wollen Sie fortfahren? y/n: n
295 Karten übrig

Beenden Sie BlackJack
Ich habe das Spiel 3 Mal gespielt

Code

Bewahren Sie es für Ihre Unterlagen auf.

Code unten (zum Vergrößern anklicken)

blackjack.py


import random
import copy


#Konstante
NUM_DECK = 6  #Anzahl der Decks
NUM_PLAYER = 1  #Anzahl der Spieler

INITIAL_CHIP = 1000  #Anfänglicher Chip
MINIMUM_BET = 100


class Card:
    '''
Karte generieren
Zahlen: A, 2-10, J, Q, K.
Ruß: Spaten, Herz, Diamant, Keule
    '''
    SUITS = '♠♥♦♣'
    RANKS = range(1, 14)  #Normaler Rang
    SYMBOLS = "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"
    POINTS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]  #Punkte für Black Jack

    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
        self.index = suit + self.SYMBOLS[rank - self.RANKS[0]]
        self.point = self.POINTS[rank - self.RANKS[0]]

    def __repr__(self):
        return self.index


class Deck:
    '''
Deck mit gemischten Karten (Deck generieren)
    '''
    def __init__(self):
        self.cards = [Card(suit, rank) \
            for suit in Card.SUITS \
            for rank in Card.RANKS]

        if NUM_DECK > 1:
            temp_cards = copy.deepcopy(self.cards)
            for i in range(NUM_DECK - 1):
                self.cards.extend(temp_cards)
        random.shuffle(self.cards)

    def draw(self, n=1):
        '''
Eine Funktion, die die angegebene Anzahl von Blättern vom Deck subtrahiert
        '''
        cards = self.cards[:n]
        del self.cards[:n]  #Lösche die gezogene Karte aus dem Stapel
        return cards

    def shuffle(self):
        '''
Mische das Deck
        '''
        random.shuffle(self.cards)
        return

    def count_cards(self):
        """
Geben Sie die verbleibende Anzahl von Decks zurück
        """
        count = len(self.cards)
        return count


class Hand:
    """
Handklasse
    """
    def __init__(self):
        self.hand = []
        self.is_soft_hand = False

    def add_card(self, card):
        self.hand.append(card)

    def check_soft_hand(self):
        """
Überprüfen Sie, ob es sich um eine weiche Hand handelt (Hand einschließlich A).
        """
        hand_list = []
        for i in range(len(self.hand)):
            hand_list.append(self.hand[i].point)
        hand_list.sort()  #Sortieren Sie Ihre Hand in aufsteigender Reihenfolge

        if hand_list[0] == 1 and sum(hand_list[1:]) < 11:  #Mit einer weichen Hand
            self.is_soft_hand = True
        else:
            self.is_soft_hand = False

    def sum_point(self):
        """
Gibt den Gesamtwert der Punkte zurück
        """
        self.check_soft_hand()
        hand_list = []

        for i in range(len(self.hand)):
            hand_list.append(self.hand[i].point)
        hand_list.sort()  #Sortieren Sie Ihre Hand in aufsteigender Reihenfolge
        s1 = 0  #Anfangswert beim Zählen von A als 1
        for i in range(len(self.hand)):
            s1 += self.hand[i].point

        if self.is_soft_hand == True:  #Mit einer weichen Hand
            s2 = 11  #Zähle das erste A als 11
            for i in range(len(hand_list)-1):
                s2 += hand_list[i+1]
            s = [s1, s2]
        else:
            s = [s1]

        return s

    def calc_final_point(self):
        """
Gibt den Endpunkt nicht BUST zurück
        """
        temp_point = self.sum_point()
        if max(temp_point) > 22:
            p = temp_point[0]  #Wenn der mit den größeren Punkten BUST ist, der mit den kleineren Punkten
        else:
            p = max(temp_point)
        return p

    def is_bust(self):
        """

        """
        if min(self.sum_point()) > 21:  #Wenn der kleinere Punkt 21 überschreitet
            return True
        else:
            return False

    def deal(self, card):
        """
Fügen Sie die ausgegebene Karte Ihrer Hand hinzu
        """
        for i in range(len(card)):
            self.add_card(card[i])

    def hit(self, card):
        #Schlagen Sie einen nach dem anderen
        if len(card) == 1:
            self.add_card(card[0])
        else:
            print("Die Anzahl der Karten ist falsch")


class Player:
    def __init__(self):
        self.hand = Hand()
        self.chip = Chip()
        self.done = False  #Flagge, die das Ende des Zuges des Spielers anzeigt
        self.hit_flag = False  #Flag, das angibt, ob der Spieler Treffer ausgewählt hat
        self.is_human = True  # True:Die Leute spielen, falsch:Automatisches Abspielen

    def init_player(self):
        self.hand = Hand()
        self.done = False
        self.hit_flag = False

    def deal(self, card):
        self.hand.deal(card)

    def hit(self, card):
        #Füge deiner Karte 1 Karte hinzu
        self.hand.hit(card)
        self.hit_flag = True

    def stand(self):
        #Ende der Runde
        self.done = True

    def double_down(self, card):
        #Verdoppeln Sie den Einsatz und treffen Sie nur einmal, um den Zug zu beenden
        self.chip.balance -= self.chip.bet
        self.chip.bet = self.chip.bet * 2
        self.hand.hit(card)
        self.done = True  #Machen Sie es sich zur Regel, dass Sie nach dem Double-Down nur einmal treffen können

    def surrender(self):
        #Halbieren Sie den Einsatz (geben Sie die Hälfte des Einsatzes zurück) und beenden Sie den Zug
        # self.chip.balance += int(self.chip.bet / 2)
        self.chip.bet = int(self.chip.bet / 2)
        self.chip.balance += self.chip.bet
        self.done = True

    def insurance(self):
        #Nicht implementiert
        pass

    def split(self):
        #Nicht implementiert
        pass


class Dealer:
    def __init__(self):
        self.hand = Hand()

    def init_dealer(self):
        self.hand = Hand()

    def deal(self, card):
        self.hand.deal(card)

    def hit(self, card):
        self.hand.hit(card)


class Chip:
    def __init__(self):
        self.balance = INITIAL_CHIP
        self.bet = 0

    def bet_chip(self, bet):
        #Wenn Sie Chip hängen, reduzieren Sie von Hand
        self.balance -= bet
        self.bet = bet

    def pay_chip_win(self):
        #Wenn Sie gewinnen, erhalten Sie doppelt so viel wie BET
        self.balance += self.bet * 2

    def pay_chip_lose(self):
        #Wenn Sie verlieren, verlieren Sie alle WETTEN
        self.balance = self.balance

    def pay_chip_push(self):
        #Geben Sie beim Zeichnen den Betrag von BET zurück
        self.balance += self.bet


class AI:
    def select_random1(self):
        r = random.randint(0, 1)
        if r > 0.5:
            selection = 'h'  # hit
        else:
            selection = 's'  # stand

        return selection

    def select_random2(self, hand):
        if hand <= 11:
            selection = 'h'
        else:
            r = random.randint(0, 1)
            if r > 0.5:
                selection = 'h'  # hit
            else:
                selection = 's'  # stand

        return selection

    def select_random3(self, hand, n):
        if hand < 11:
            selection = 'h'  # hit
        elif hand == 11 and n == 2:
            selection = 'd'  # double down
        elif hand == 16 and n == 2:
            selection = 'r'  # surrender
        elif hand > 17:
            selection = 's'  # stand
        else:
            r = random.randint(0, 1)
            if r > 0.5:
                selection = 'h'  # hit
            else:
                selection = 's'  # stand

        return selection


class Game:
    def __init__(self):
        self.game_mode = 0  # 0:Warten auf den Start, 1:Im Spiel, 2:Spiel ist aus
        self.deck = Deck()
        self.player = Player()
        self.dealer = Dealer()
        self.judgment = 0
        self.game_count = 0
        self.start()

        self.message_on = True #self.player.is_human  # True:Zeigen Sie auf der Konsole die Meldung Falsch an:Zeigen Sie keine Nachrichten auf der Konsole an

    def start(self):
        self.deck.shuffle()
        self.game_mode = 1
        self.player = Player()
        self.dealer = Dealer()
        self.game_count = 0

    def reset_game(self):
        self.player.init_player()
        self.dealer.init_dealer()
        self.game_count += 1

    def bet(self, bet):
        self.player.chip.bet_chip(bet=bet)
        if self.message_on:
            print("$" + str(self.player.chip.bet) + "ich wette")
            print("Der Rest$" + str(self.player.chip.balance))

    #Karten austeilen
    def deal(self, n=2):
        '''
Karten austeilen
        '''
        card = self.deck.draw(n)
        self.player.deal(card)
        # print(self.player.hand.hand)

        card = self.deck.draw(n)
        self.dealer.deal(card)
        # print(self.dealer.hand.hand)

        self.judgment = 0   #Urteil über Sieg oder Niederlage
        self.player.done = False
        self.show_card()

    #Spieler ist an der Reihe
    def player_turn(self):
        '''
Spieler an der Reihe
        '''
        if self.player.hand.calc_final_point() == 21:  #Wenn die Summe 21 ist, ist der Händler sofort an der Reihe
            self.player.done = True

        while not self.player.done and not self.player.hand.is_bust():
            if self.player.is_human is True:
                action = input("Hit(h) or Stand(s) or Double down(d) or Surrender(r): ")
            elif self.player.is_human is True and self.player.hit_flag:
                action = input("Hit(h) or Stand(s): ")  #Treffer für Treffer/nur stehen
            else:
                action = AI().select_random3(hand=self.player.hand.calc_final_point(), n=len(self.player.hand.hand))

            self.player_step(action=action)

    def player_step(self, action):
        if action == 'h':  # Hit
            card = self.deck.draw(1)
            self.player.hit(card)
            self.show_card()
            if self.player.hand.calc_final_point() == 21:  #Keine Treffer mehr, wenn die Gesamtpunktzahl 21 erreicht
                self.player.done = True
            if self.player.hand.is_bust():
                self.player.done = True
                self.judgment = -1  #Wenn Spieler BUST, verlieren Sie sofort
                if self.message_on:
                    print("Player BUST")

        elif action == 's':  # Stand
            self.player.stand()

        elif action == 'd' and self.player.hit_flag is False:  # Double down.Ja, wenn Treffer nicht ausgewählt ist
            card = self.deck.draw(1)
            if self.player.chip.balance >= self.player.chip.bet:  #Double Down ist möglich, wenn der Kontostand den Einsatzbetrag übersteigt
                self.player.double_down(card)
                self.show_card()
                if self.message_on:
                    print("Double Down wurde ausgewählt. Verdoppelte die Wette")
                    print("Der Rest$" + str(self.player.chip.balance))
                if self.player.hand.is_bust():
                    self.player.done = True
                    self.judgment = -1  #Wenn Spieler BUST, verlieren Sie sofort
                    if self.message_on:
                        print("Player BUST")
            else:  #Treffen Sie, wenn der Kontostand unter dem Einsatz liegt
                print("Hit, weil es nicht genug Chips gibt")
                self.player.hit(card)
                self.show_card()
                if self.player.hand.calc_final_point() == 21:  #Keine Treffer mehr, wenn die Gesamtpunktzahl 21 erreicht
                    self.player.done = True
                if self.player.hand.is_bust():
                    self.player.done = True
                    self.judgment = -1  #Wenn Spieler BUST, verlieren Sie sofort
                    if self.message_on:
                        print("Player BUST")

        elif action == 'r' and self.player.hit_flag is False:  # Surrender.Ja, wenn Treffer nicht ausgewählt ist
            self.player.surrender()
            self.judgment = -1  #Verloren, weil ich mich für Surrender entschieden habe
            if self.message_on:
                print("Übergabe ausgewählt")

        else:
            if self.message_on:
                print("Wählen Sie die richtige Option")

    def show_card(self):
        '''
Spielerkarte anzeigen
        '''
        if self.message_on:
            print("Spieler ist an der Reihe")
            print("Player : " + str(self.player.hand.hand) + " = " +
                  str(self.player.hand.sum_point()) + ", soft card : " + str(self.player.hand.is_soft_hand))
            print("Dealer : " + str(self.dealer.hand.hand[0].index) +
                  ", ? = " + str(self.dealer.hand.hand[0].point))
        else:
            pass

    def dealer_turn(self):
        '''
Händler ist an der Reihe
        '''
        if self.judgment == -1:
            return
        self.open_dealer()
        while self.dealer.hand.calc_final_point() < 17 and self.judgment == 0:
            card = self.deck.draw(1)
            self.dealer.hit(card)
            self.open_dealer()
        if self.dealer.hand.calc_final_point() > 21:
            self.judgment = 1
            if self.message_on:
                print("Dealer BUST")

    def open_dealer(self):
        '''
Öffne eine Hole Card
        '''
        if self.message_on:
            print("Händler ist an der Reihe")
            print("Player : " + str(self.player.hand.hand) + " = " +
                  str(self.player.hand.calc_final_point()))
            print("Dealer : " + str(self.dealer.hand.hand) + " = " +
                  str(self.dealer.hand.calc_final_point()))
        else:
            pass

    def judge(self):
        '''
Urteil über Sieg oder Niederlage
        '''
        if self.judgment == 0 and self.player.hand.calc_final_point() > \
                self.dealer.hand.calc_final_point():
            self.judgment = 1
        elif self.judgment == 0 and self.player.hand.calc_final_point() < \
                self.dealer.hand.calc_final_point():
            self.judgment = -1
        elif self.judgment == 0 and self.player.hand.calc_final_point() == \
                self.dealer.hand.calc_final_point():
            self.judgment = 0

        if self.message_on:
            self.show_judgement()

    def pay_chip(self):
        previous_chip = self.player.chip.balance
        if self.judgment == 1:  # Player win
            self.player.chip.pay_chip_win()
        elif self.judgment == -1:  # Player lose
            self.player.chip.pay_chip_lose()
        elif self.judgment == 0:  # Push
            self.player.chip.pay_chip_push()
        if self.message_on:
            print("Ballbesitz-Chip des Spielers$" + str(self.player.chip.balance))

        reward = self.player.chip.balance - previous_chip  #In diesem Spiel verdiente Belohnungen
        return reward

    def check_chip(self):
        if self.player.chip.balance < MINIMUM_BET:
            self.game_mode = 2
            if self.message_on:
                print("Das Spiel endet, weil der Chip unter dem Mindesteinsatz liegt")

    def show_judgement(self):
        '''
Anzeige von Sieg oder Niederlage
        '''
        if self.message_on:
            print("")
            if self.judgment == 1:
                print("Spieler gewinnt")
            elif self.judgment == -1:
                print("Spieler verliert")
            elif self.judgment == 0:
                print("zeichnen")
            print("")
        else:
            pass

    def ask_next_game(self):
        '''
Fragen Sie, ob Sie das Spiel fortsetzen möchten
        '''
        if self.player.is_human == True:
            while self.game_mode == 1:
                player_input = input("Wollen Sie fortfahren? y/n: ")
                if player_input == 'y':
                    break
                elif player_input == 'n':
                    self.game_mode = 2
                    break
                else:
                    print('y/Bitte geben Sie n ein')
        else:
            pass  #Fahren Sie mit der automatischen Wiedergabe fort
        print('Die Anzahl der verbleibenden Karten' + str(self.deck.count_cards()))
        print("")

    def check_deck(self):
        '''
Überprüfen Sie die verbleibende Anzahl von Karten und mischen Sie, wenn es nur wenige gibt
        '''
        if self.deck.count_cards() < NUM_PLAYER * 10 + 5:
            self.deck = Deck()
            if self.message_on:
                print("Das Deck wurde initialisiert")
                print('Die Anzahl der verbleibenden Karten' + str(self.deck.count_cards()))
                print("")


def main():
    game = Game()
    game.start()
    while game.game_mode == 1:
        game.reset_game()       #Verschiedene zurücksetzen
        game.bet(bet=100)       #Wette
        game.deal()             #Karten austeilen
        game.player_turn()      #Spieler an der Reihe
        game.dealer_turn()      #Händler ist an der Reihe
        game.judge()            #Urteil über Sieg oder Niederlage
        game.pay_chip()         #Abrechnung von Chips
        game.check_chip()       #Überprüfen Sie das Guthaben des Spielers
        game.ask_next_game()    #Fragen Sie, ob Sie das Spiel fortsetzen möchten
        game.check_deck()       #Überprüfen Sie die Anzahl der verbleibenden Karten

    print("Beenden Sie BlackJack")
    print(str(game.game_count) + "Ich habe die Spielzeiten gespielt")

    return game.player.chip, game.game_count


if __name__ == '__main__':
    main()


Am Ende

Ich habe mit Python einen Blackjack gemacht. Ich habe auch versucht, Double Down und Surrender zu implementieren, um der Grundstrategie so nahe wie möglich zu kommen. Ich möchte eines Tages Split hinzufügen. Ich habe die BET-Funktion unter der Annahme hinzugefügt, dass ich lernen werde, aber obwohl ich kein Geld habe, verdoppelt sie sich usw. Es wurden viele Fehler gefunden und es war schwierig, sie zu beheben. (Bitte weisen Sie darauf hin, wenn es noch Fehler gibt)

Registrieren Sie als Nächstes den diesmal erstellten Blackjack als Ihre eigene Umgebung im Fitnessstudio von OpenAI. Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (② Registrieren Sie die Umgebung im Fitnessstudio)

Die Seite, die ich als Referenz verwendet habe

Recommended Posts