[PYTHON] Essayez de faire une stratégie de blackjack en renforçant l'apprentissage ((1) Implémentation du blackjack)

introduction

J'ai essayé de faire une stratégie de blackjack tout en étudiant Python et en renforçant l'apprentissage. Il existe une stratégie basée sur la probabilité d'une stratégie de base, mais je vais essayer de la rattraper.

Je vais procéder comme ça

  1. Implémentation du Blackjack ← Cette fois ici
  2. Inscrivez-vous dans l'environnement de gym OpenAI
  3. Apprenez la stratégie de Blackjack avec un apprentissage amélioré

Pourquoi le blackjack?

--Semble bien étudier la programmation (Les examens de fin d'études des débutants devraient développer le "Blackjack") --Comparer les stratégies post-apprentissage avec les stratégies de base (il existe un repère) --Blackjack je veux aller mieux

Environnement de développement

Règles du Blackjack

Le Blackjack est un jeu de table populaire dans le casino. Je vais brièvement présenter les règles.

règle basique

Règles de Blackjack à mettre en œuvre

Faites un blackjack comme celui-ci.

--Utilisez 6 paires de cartes à jouer --Fonction BET disponible (Cependant, le montant est fixé à 100 $. Le retour sera une récompense pour le renforcement de l'apprentissage.)

la mise en oeuvre

Le code entier est répertorié à la fin.

Classe de carte

Générez une carte à jouer. Comment compter les points des cartes illustrées spéciales de blackjack est défini ici. A est également spécial, mais ici il est généré comme un point. Le score de A est déterminé en considérant le score des autres mains dans la classe Main.


class Card:
    '''
Générer une carte
Numéros: A, 2-10, J, Q, K
Suie: pique, coeurs, diamants, clubs
    '''
    SUITS = '♠♥♦♣'
    RANKS = range(1, 14)  #Rang normal
    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]  #Points pour 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

Classe de pont

Définissez NUM_DECK = 6 et générez un jeu de 6 jeux de cartes à jouer. La lecture aléatoire est effectuée en même temps que la génération de deck.

class Deck:
    '''
Deck avec des cartes mélangées (générer un deck)
    '''
    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)
・ ・ ・ Abréviation

Classe de main

Ajoutez des cartes à votre main et calculez des points. Le jugement de la main douce (main comprenant A) est également inclus.

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

    def add_card(self, card):
        #Le processus d'ajout d'une carte à votre main.
・ ・ ・ Abréviation

    def check_soft_hand(self):
        #Vérifiez s'il s'agit d'une main douce (main comprenant A)
・ ・ ・ Abréviation

    def sum_point(self):
        #Calculez les points dans votre main.
        #Pour les mains douces, calculez à la fois quand A est 1 et quand A est 11.
・ ・ ・ Abréviation

    def calc_final_point(self):
        #Calculez des points en concurrence avec le concessionnaire
        #Renvoie le dernier point pas BUST
・ ・ ・ Abréviation

    def is_bust(self):
        #Déterminez si votre main est BUST (plus de 21)
・ ・ ・ Abréviation

    def deal(self, card):
        #Traitement au moment de la transaction
・ ・ ・ Abréviation

    def hit(self, card):
        #Traitement au moment de la frappe
・ ・ ・ Abréviation

Classe de joueur

Des choix tels que Stand et Hit sont définis ici. Si vous souhaitez ajouter un fractionnement et une assurance non mis en œuvre, cliquez ici. En bonus, j'ai ajouté un mode de jeu automatique. Vous pouvez jouer avec l'IA appropriée décrite plus tard.

class Player:
    def __init__(self):
        self.hand = Hand()
        self.chip = Chip()
        self.done = False  #Drapeau indiquant la fin du tour du joueur
        self.hit_flag = False  #Drapeau indiquant si le joueur a sélectionné Hit
        self.is_human = False  # True:Les gens jouent, faux:Lecture automatique

    def init_player(self):
        #Initialisez votre main et chaque drapeau
・ ・ ・ Abréviation

    def deal(self, card):
        #Traitement au stand
・ ・ ・ Abréviation

    def hit(self, card):
        #Traitement au moment de la frappe
・ ・ ・ Abréviation

    def stand(self):
        #Traitement au stand
・ ・ ・ Abréviation

    def double_down(self, card):
        #Traitement au moment de doubler
・ ・ ・ Abréviation

    def surrender(self):
        #Traitement au moment de la remise
・ ・ ・ Abréviation

Classe de concessionnaire

Cela aurait pu être agréable d'être avec la classe Player. Je pensais que j'avais besoin d'une méthode propre à un concessionnaire, mais je n'en avais pas.

Classe de puce

Échange de jetons après le match. Si vous gagnez, vous recevrez le double du montant que vous avez misé, et si vous perdez, vous perdrez la totalité du montant. S'il s'agit d'un match nul, le pari sera retourné au joueur tel quel.

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

Classe IA

Contient une IA adaptée pour la lecture automatique. Niveau bonus. C'est pour un test avant de renforcer l'apprentissage.

class AI:
・ ・ ・ Abréviation
    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

Classe de jeu

C'est la fonction principale du Blackjack. Cela peut être difficile à voir car les méthodes liées à l'affichage sont mixtes. Il y a place à amélioration. La fonction player_step est également utilisée dans la fonction step du gymnase.

class Game:
    def __init__(self):
        self.game_mode = 0  # 0:En attente de démarrage, 1:En jeu, 2:Jeu terminé
        self.deck = Deck()
        self.player = Player()
        self.dealer = Dealer()
        self.judgment = 0  # 1:Gagner, 0:dessiner, -1:Perdre
        self.game_count = 0
        self.start()

        self.message_on = True #self.player.is_human  # True:Afficher un message sur la console, False:Ne pas afficher de messages sur la console

    def start(self):
        #Mélangez le jeu, Joueur,Initialiser le concessionnaire
・ ・ ・ Abréviation

    def reset_game(self):
        # Player,Réinitialiser la main du concessionnaire
・ ・ ・ Abréviation

    def bet(self, bet):
        #Paris des joueurs
・ ・ ・ Abréviation

    def deal(self, n=2):
        # Player,Distribuer les cartes au concessionnaire
・ ・ ・ Abréviation

    def player_turn(self):
        #Tour du joueur. Entrez l'action depuis la console ou décidez automatiquement avec l'IA appropriée
・ ・ ・ Abréviation

    def player_step(self, action):
        # Stand, Hit, Double down,Traitement selon la reddition
・ ・ ・ Abréviation

    def show_card(self):
        #Affichez la carte. La carte face cachée du croupier est affichée comme "?"
・ ・ ・ Abréviation

    def dealer_turn(self):
        #Au tour du concessionnaire. Piochez une carte jusqu'à ce que vous ayez 17 points ou plus
・ ・ ・ Abréviation

    def open_dealer(self):
        #Ouvrir la carte face cachée du croupier
・ ・ ・ Abréviation

    def judge(self):
        #Jugement de victoire ou de défaite
・ ・ ・ Abréviation

    def pay_chip(self):
        #Règlement de puce
・ ・ ・ Abréviation

    def check_chip(self):
        #Vérifiez si la possession du joueur est inférieure à la mise minimum (montant de la mise minimum)
        #S'il est en dessous, terminez le jeu
・ ・ ・ Abréviation

    def show_judgement(self):
        #Montrez le résultat de la victoire ou de la défaite
・ ・ ・ Abréviation

    def ask_next_game(self):
        #Demandez si vous souhaitez continuer le jeu
・ ・ ・ Abréviation

    def check_deck(self):
        #Vérifiez le nombre de cartes restantes et mélangez s'il y en a peu
・ ・ ・ Abréviation

fonction principale

Écrivez le traitement le long du déroulement du jeu dans la fonction principale. Si vous faites cela, vous pouvez jouer au Blackjack. Au fait, ・ NUM_DECK = 6 # nombre de jeux ・ INITIAL_CHIP = 1000 # puce initiale ・ MINIMUM_BET = 100 # montant du pari minimum C'est dit.

def main():
    game = Game()
    game.start()
    while game.game_mode == 1:
        game.reset_game()       #Réinitialiser divers
        game.bet(bet=100)       #pari
        game.deal()             #Distribuer des cartes
        game.player_turn()      #Tour du joueur
        game.dealer_turn()      #Tour du concessionnaire
        game.judge()            #Jugement de victoire ou de défaite
        game.pay_chip()         #Règlement des copeaux
        game.check_chip()       #Vérifiez le solde du joueur
        game.ask_next_game()    #Demandez si vous souhaitez continuer le jeu
        game.check_deck()       #Vérifiez le nombre de cartes restantes

    print("Quitter BlackJack")
    print(str(game.game_count) + "J'ai joué les temps de jeu")

    return game.player.chip, game.game_count

Résultat d'exécution

Après Hit (h) ou Stand (s) ou Double down (d) ou Surrender (r): Entrez les caractères du clavier pour décider de la sélection du joueur.


$Je parie 100
Le reste$900
Tour du joueur
Player : [♠A, ♦9] = [10, 20], soft card : True
Dealer : ♣6, ? = 6
Hit(h) or Stand(s) or Double down(d) or Surrender(r): s
Tour du concessionnaire
Player : [♠A, ♦9] = 20
Dealer : [♣6, ♥K] = 16
Tour du concessionnaire
Player : [♠A, ♦9] = 20
Dealer : [♣6, ♥K, ♥3] = 19

Le joueur gagne

Puce de possession du joueur$1100
Voulez-vous continuer? y/n: y
Le nombre de cartes restantes est de 307

$Je parie 100
Le reste$1000
Tour du joueur
Player : [♠2, ♥K] = [12], soft card : False
Dealer : ♥3, ? = 3
Hit(h) or Stand(s) or Double down(d) or Surrender(r): h
Tour du joueur
Player : [♠2, ♥K, ♥2] = [14], soft card : False
Dealer : ♥3, ? = 3
Hit(h) or Stand(s) or Double down(d) or Surrender(r): h
Tour du joueur
Player : [♠2, ♥K, ♥2, ♠Q] = [24], soft card : False
Dealer : ♥3, ? = 3
Player BUST

Le joueur perd

Puce de possession du joueur$1000
Voulez-vous continuer? y/n: y
301 cartes restantes

$Je parie 100
Le reste$900
Tour du joueur
Player : [♥7, ♥5] = [12], soft card : False
Dealer : ♠8, ? = 8
Hit(h) or Stand(s) or Double down(d) or Surrender(r): d
Tour du joueur
Player : [♥7, ♥5, ♠8] = [20], soft card : False
Dealer : ♠8, ? = 8
Le double vers le bas a été sélectionné. Double la mise
Le reste$800
Tour du concessionnaire
Player : [♥7, ♥5, ♠8] = 20
Dealer : [♠8, ♥2] = 10
Tour du concessionnaire
Player : [♥7, ♥5, ♠8] = 20
Dealer : [♠8, ♥2, ♣7] = 17

Le joueur gagne

Puce de possession du joueur$1200
Voulez-vous continuer? y/n: n
295 cartes restantes

Quitter BlackJack
J'ai joué au jeu 3 fois

code

Gardez-le pour vos archives.

Code ci-dessous (cliquez pour développer)

blackjack.py


import random
import copy


#constant
NUM_DECK = 6  #Nombre de ponts
NUM_PLAYER = 1  #Nombre de joueurs

INITIAL_CHIP = 1000  #Puce initiale
MINIMUM_BET = 100


class Card:
    '''
Générer une carte
Numéros: A, 2-10, J, Q, K
Suie: pique, coeurs, diamants, clubs
    '''
    SUITS = '♠♥♦♣'
    RANKS = range(1, 14)  #Rang normal
    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]  #Points pour 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 avec des cartes mélangées (générer un deck)
    '''
    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):
        '''
Une fonction qui soustrait le nombre spécifié de feuilles du jeu
        '''
        cards = self.cards[:n]
        del self.cards[:n]  #Supprimer la carte piochée du paquet
        return cards

    def shuffle(self):
        '''
Mélangez le jeu
        '''
        random.shuffle(self.cards)
        return

    def count_cards(self):
        """
Renvoie le nombre restant de jeux
        """
        count = len(self.cards)
        return count


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

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

    def check_soft_hand(self):
        """
Vérifiez s'il s'agit d'une main douce (main comprenant A)
        """
        hand_list = []
        for i in range(len(self.hand)):
            hand_list.append(self.hand[i].point)
        hand_list.sort()  #Triez votre main par ordre croissant

        if hand_list[0] == 1 and sum(hand_list[1:]) < 11:  #D'une main douce
            self.is_soft_hand = True
        else:
            self.is_soft_hand = False

    def sum_point(self):
        """
Renvoie la valeur totale des points
        """
        self.check_soft_hand()
        hand_list = []

        for i in range(len(self.hand)):
            hand_list.append(self.hand[i].point)
        hand_list.sort()  #Triez votre main par ordre croissant
        s1 = 0  #Valeur initiale lors du comptage de A comme 1
        for i in range(len(self.hand)):
            s1 += self.hand[i].point

        if self.is_soft_hand == True:  #D'une main douce
            s2 = 11  #Comptez le premier A comme 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):
        """
Renvoie le dernier point pas BUST
        """
        temp_point = self.sum_point()
        if max(temp_point) > 22:
            p = temp_point[0]  #Si celui avec les plus gros points est BUST, celui avec les plus petits points
        else:
            p = max(temp_point)
        return p

    def is_bust(self):
        """
Déterminez si c'est BUST
        """
        if min(self.sum_point()) > 21:  #Si le point le plus petit dépasse 21
            return True
        else:
            return False

    def deal(self, card):
        """
Ajoutez la carte distribuée à votre main
        """
        for i in range(len(card)):
            self.add_card(card[i])

    def hit(self, card):
        #Frappez un par un
        if len(card) == 1:
            self.add_card(card[0])
        else:
            print("Le nombre de cartes est incorrect")


class Player:
    def __init__(self):
        self.hand = Hand()
        self.chip = Chip()
        self.done = False  #Drapeau indiquant la fin du tour du joueur
        self.hit_flag = False  #Drapeau indiquant si le joueur a sélectionné Hit
        self.is_human = True  # True:Les gens jouent, faux:Lecture automatique

    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):
        #Ajoutez 1 carte à votre main
        self.hand.hit(card)
        self.hit_flag = True

    def stand(self):
        #Fin de tour
        self.done = True

    def double_down(self, card):
        #Doublez la mise et ne frappez qu'une seule fois pour terminer le tour
        self.chip.balance -= self.chip.bet
        self.chip.bet = self.chip.bet * 2
        self.hand.hit(card)
        self.done = True  #Faites-en une règle selon laquelle vous ne pouvez toucher qu'une seule fois après avoir doublé

    def surrender(self):
        #Réduire de moitié la mise (remettre la moitié de la mise en main) et terminer le tour
        # 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):
        #Non mis en œuvre
        pass

    def split(self):
        #Non mis en œuvre
        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):
        #Si vous accrochez Chip, réduisez de la main
        self.balance -= bet
        self.bet = bet

    def pay_chip_win(self):
        #Lorsque vous gagnez, vous obtenez deux fois plus que BET
        self.balance += self.bet * 2

    def pay_chip_lose(self):
        #Quand tu perds, tu perds tous les paris
        self.balance = self.balance

    def pay_chip_push(self):
        #Lors du tirage, retournez par le montant de BET
        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:En attente de démarrage, 1:En jeu, 2:Jeu terminé
        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:Afficher un message sur la console, False:Ne pas afficher de messages sur la console

    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) + "je parie")
            print("Le reste$" + str(self.player.chip.balance))

    #Distribuer des cartes
    def deal(self, n=2):
        '''
Distribuer des cartes
        '''
        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   #Jugement de victoire ou de défaite
        self.player.done = False
        self.show_card()

    #Tour du joueur
    def player_turn(self):
        '''
Tour du joueur
        '''
        if self.player.hand.calc_final_point() == 21:  #Si le total est de 21, passez immédiatement au tour du croupier
            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): ")  #Coup après coup/se tenir debout seulement
            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:  #Lorsque le score total atteint 21, vous ne pouvez plus frapper
                self.player.done = True
            if self.player.hand.is_bust():
                self.player.done = True
                self.judgment = -1  #Si le joueur BUST, perd immédiatement
                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.Oui si Hit n'est pas sélectionné
            card = self.deck.draw(1)
            if self.player.chip.balance >= self.player.chip.bet:  #Double Down est possible si le solde est supérieur au montant du pari
                self.player.double_down(card)
                self.show_card()
                if self.message_on:
                    print("Le double vers le bas a été sélectionné. Double la mise")
                    print("Le reste$" + str(self.player.chip.balance))
                if self.player.hand.is_bust():
                    self.player.done = True
                    self.judgment = -1  #Si le joueur BUST, perd immédiatement
                    if self.message_on:
                        print("Player BUST")
            else:  #Frapper si le solde est inférieur au pari
                print("Frappez parce qu'il n'y a pas assez de jetons")
                self.player.hit(card)
                self.show_card()
                if self.player.hand.calc_final_point() == 21:  #Lorsque le score total atteint 21, vous ne pouvez plus frapper
                    self.player.done = True
                if self.player.hand.is_bust():
                    self.player.done = True
                    self.judgment = -1  #Si le joueur BUST, perd immédiatement
                    if self.message_on:
                        print("Player BUST")

        elif action == 'r' and self.player.hit_flag is False:  # Surrender.Oui si Hit n'est pas sélectionné
            self.player.surrender()
            self.judgment = -1  #Perdu parce que j'ai choisi Surrender
            if self.message_on:
                print("Remise sélectionnée")

        else:
            if self.message_on:
                print("Choisissez la bonne option")

    def show_card(self):
        '''
Afficher la carte du joueur
        '''
        if self.message_on:
            print("Tour du joueur")
            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):
        '''
Tour du concessionnaire
        '''
        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):
        '''
Ouvrez une carte fermée
        '''
        if self.message_on:
            print("Tour du concessionnaire")
            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):
        '''
Jugement de victoire ou de défaite
        '''
        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("Puce de possession du joueur$" + str(self.player.chip.balance))

        reward = self.player.chip.balance - previous_chip  #Récompenses gagnées dans ce jeu
        return reward

    def check_chip(self):
        if self.player.chip.balance < MINIMUM_BET:
            self.game_mode = 2
            if self.message_on:
                print("Le jeu se termine car le jeton est en dessous de la mise minimum")

    def show_judgement(self):
        '''
Affichage de la victoire ou de la défaite
        '''
        if self.message_on:
            print("")
            if self.judgment == 1:
                print("Le joueur gagne")
            elif self.judgment == -1:
                print("Le joueur perd")
            elif self.judgment == 0:
                print("dessiner")
            print("")
        else:
            pass

    def ask_next_game(self):
        '''
Demandez si vous souhaitez continuer le jeu
        '''
        if self.player.is_human == True:
            while self.game_mode == 1:
                player_input = input("Voulez-vous continuer? y/n: ")
                if player_input == 'y':
                    break
                elif player_input == 'n':
                    self.game_mode = 2
                    break
                else:
                    print('y/Veuillez entrer n')
        else:
            pass  #Continuer avec la lecture automatique
        print('Le nombre de cartes restantes' + str(self.deck.count_cards()))
        print("")

    def check_deck(self):
        '''
Vérifiez le nombre de cartes restantes et mélangez s'il y en a peu
        '''
        if self.deck.count_cards() < NUM_PLAYER * 10 + 5:
            self.deck = Deck()
            if self.message_on:
                print("Initialisation du deck")
                print('Le nombre de cartes restantes' + str(self.deck.count_cards()))
                print("")


def main():
    game = Game()
    game.start()
    while game.game_mode == 1:
        game.reset_game()       #Réinitialiser divers
        game.bet(bet=100)       #pari
        game.deal()             #Distribuer des cartes
        game.player_turn()      #Tour du joueur
        game.dealer_turn()      #Tour du concessionnaire
        game.judge()            #Jugement de victoire ou de défaite
        game.pay_chip()         #Règlement des copeaux
        game.check_chip()       #Vérifiez le solde du joueur
        game.ask_next_game()    #Demandez si vous souhaitez continuer le jeu
        game.check_deck()       #Vérifiez le nombre de cartes restantes

    print("Quitter BlackJack")
    print(str(game.game_count) + "J'ai joué les temps de jeu")

    return game.player.chip, game.game_count


if __name__ == '__main__':
    main()


À la fin

J'ai fait un blackjack avec Python. J'ai également essayé de mettre en œuvre Double down et Surrender pour me rapprocher le plus possible de la stratégie de base. Je veux ajouter Split un jour. J'ai ajouté la fonction BET en supposant que j'apprendrai, mais même si je n'ai aucun argent, cela double, etc. De nombreux bugs ont été trouvés et il était difficile de les corriger. (Veuillez préciser s'il y a encore des bogues)

Ensuite, enregistrez le blackjack créé cette fois comme votre propre environnement dans la salle de gym d'OpenAI. Essayez de faire une stratégie de blackjack en renforçant l'apprentissage (② Enregistrez l'environnement dans la salle de sport)

Le site que j'ai utilisé comme référence

Recommended Posts