J'ai fait un blackjack avec Python.

introduction

Le calendrier de l'Avent était ouvert, je vais donc l'écrire à nouveau. Cette fois, comme le titre l'indique, j'ai fait un blackjack.

Cliquez ici pour l'article précédent → J'ai fait une loterie avec Python.

environnement

Ubuntu18.04LTS Python3.6.9 vim

code

play_bj.py


from random import shuffle


class Deck:
    """
Classe représentant le deck
    """
    def __init__(self):
        """
Initialisez le deck et mélangez-le.
        """
        suits = ['bêche', 'club', 'diamant', 'cœur']
        values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']
        self.deck = []
        for i in suits:
            for j in values:
                self.deck.append((i, j))
        shuffle(self.deck)

    def draw(self):
        """
Piochez une carte du paquet et renvoyez la carte piochée.
        """
        return self.deck.pop(0)


class Person:
    """
Classe représentant le joueur
    """
    def __init__(self):
        """
Initialisez votre main.
        """
        self.hands = []
        self.point = 0

    def add(self, card):
        """
Ajoutez une carte à votre main.
        """
        self.hands.append(card)

    def point_sum(self):
        """
Trouvez le score total de Trump.
        """
        self.point = 0
        for i in self.hands:
            if i[1] in ['J', 'Q', 'K']:
                self.point += 10
            else:
                self.point += i[1]

        return self.point


def BJ():
    """
Traitement principal
    """
    print('Bienvenue au Blackjack!')

    d = Deck()
    p = Person()
    c = Person()

    drawing(d, p, 'tu')
    drawing(d, p, 'tu')

    drawing(d, c, 'CPU')
    card = d.draw()
    c.add(card)

    player_point = p.point_sum()
    cpu_point = c.point_sum()

    if player_point == cpu_point == 21:
        print('C'est un tirage au sort.')
        return
    elif player_point == 21:
        print('Vous gagnez!')
        return
    elif cpu_point == 21:
        print('Tu as perdu.')
        return
    #Ici, A ne devient pas 11, donc la branche conditionnelle ci-dessus n'est pas vraiment nécessaire.

    while True:
        choice = input('"Hit"Ou"Stand"Entrez s'il vous plait.: ')

        while True:
            if choice.lower() == 'hit' or choice.lower() == 'stand':
                break
            else:
                choice = input('"Hit"Ou"Stand"Entrez s'il vous plait.: ')

        if choice.lower() == 'hit':
            drawing(d, p, 'tu')
            player_point = p.point_sum()
            if player_point >= 22:
                print('Tu as perdu.')
                return
        elif choice.lower() == 'stand':
            break
        else:
            print('error')
            return

    print('Une autre carte du CPU{}de{}est.'.format(c.hands[1][0], c.hands[1][1]))

    while True:
        cpu_point = c.point_sum()
        if cpu_point < 17:
            drawing(d, c, 'CPU')
            cpu_point = c.point_sum()
            if cpu_point >= 22:
                print('Vous gagnez!')
                return
        else:
            break

    if player_point == cpu_point:
        print('C'est un tirage au sort.')
        return
    elif player_point > cpu_point:
        print('Vous gagnez!')
        return
    elif player_point < cpu_point:
        print('Tu as perdu.')
        return


def drawing(class1, class2, name):
    """
Ajoutez 1 carte du jeu à votre main.
Après cela, les informations de la carte ajoutée sont affichées.
    """
    card = class1.draw()
    class2.add(card)
    print('{}La carte dessinée par{}de{}est.'.format(name, card[0], card[1]))


if __name__ == '__main__':
    BJ()

en conclusion

C'était une bonne étude des fonctions et des classes. Ensuite, rendons A compatible avec 11 également. Je l'ajouterai dès qu'un meilleur sera fait.

Postscript

J'ai organisé le code en utilisant l'héritage de classe et ainsi de suite. De plus, 11 peut être pris en charge pour A. (12/09) Ajout de la gestion des erreurs et de l'argparse. (12/16) Ajout de la journalisation. (01/04)

import argparse
import logging
from logging import getLogger, StreamHandler, FileHandler, Formatter
import sys
from random import shuffle


logger = getLogger(__file__)
logger.setLevel(logging.DEBUG)

stream_handler = StreamHandler()
file_handler = FileHandler('debug.log')

stream_handler.setLevel(logging.DEBUG)
file_handler.setLevel(logging.DEBUG)

stream_format = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_format = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

stream_handler.setFormatter(stream_format)
file_handler.setFormatter(file_format)

logger.addHandler(stream_handler)
logger.addHandler(file_handler)


class Card:
    SUITS = 'bêche', 'club', 'diamant', 'cœur'
    RANKS = 'A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K'

    def __init__(self, suit, rank):
        self.suit = suit
        self.rank = rank
        self.number = self.RANKS.index(rank) + 1


class Deck:
    def __init__(self):
        self.deck = [Card(suit, rank)
                     for suit in Card.SUITS
                     for rank in Card.RANKS]
        shuffle(self.deck)

    def draw(self):
        return self.deck.pop()


class Participant:
    def __init__(self, name):
        self.name = name
        self.hands = []
        self.point = []

    def drawing(self, card, display=True):
        self.hands.append(card)
        self.point.append(min(card.number, 10))
        if display:
            print('{}La carte dessinée par{}de{}est.'
                  .format(self.name, card.suit, card.rank))


class Player(Participant):
    def choose_a_first(self):
        in_a = any(card.rank == 'A' for card in self.hands)
        while in_a and sum(self.point) <= 11:
            try:
                choice_point = input('Voulez-vous que A soit 1 ou 11?: ')
            except (KeyboardInterrupt, EOFError):
                print()
                print('J'ai fini le blackjack.')
                sys.exit()
            else:
                if choice_point == '11':
                    self.point.append(10)
                    break
                if choice_point == '1':
                    break
        print('{}Le score total de{}est.'.format(self.name, sum(self.point)))

    def choose_a(self):
        while self.hands[-1].rank == 'A' and sum(self.point) <= 11:
            try:
                choice_point = input('Voulez-vous que A soit 1 ou 11?: ')
            except (KeyboardInterrupt, EOFError):
                print()
                print('J'ai fini le blackjack.')
                sys.exit()
            else:
                if choice_point == '11':
                    self.point.append(10)
                    break
                if choice_point == '1':
                    break
        print('{}Le score total de{}est.'.format(self.name, sum(self.point)))

    def is_continue(self):
        while True:
            try:
                choice = input('Entrez Hit ou Stand.: ').lower()
            except (KeyboardInterrupt, EOFError):
                print()
                print('J'ai fini le blackjack.')
                sys.exit()
            else:
                print()
                if choice == 'hit':
                    return True
                if choice == 'stand':
                    return False


class Dealer(Participant):
    def choose_a_first(self):
        in_a = any(card.rank == 'A' for card in self.hands)
        if in_a and sum(self.point) <= 11:
            self.point.append(10)

    def choose_a(self):
        if self.hands[-1].rank == 'A' and sum(self.point) <= 11:
            self.point.append(10)
        print('{}Le score total de{}est.'.format(self.name, sum(self.point)))

    def show_card(self):
        print('{}Une autre carte de{}de{}est.'
              .format(self.name, self.hands[1].suit, self.hands[1].rank))
        print('{}Le score total de{}est.'.format(self.name, sum(self.point)))
        print()

    def is_continue(self):
        if sum(self.point) < 17:
            return True
        else:
            return False


class BlackJack:
    def __init__(self):
        try:
            name = input('S'il vous plaît entrez votre nom.: ')
        except (KeyboardInterrupt, EOFError):
            print()
            print('J'ai fini le blackjack.')
            sys.exit()
        else:
            self.deck = Deck()
            self.player = Player(name)
            self.dealer = Dealer('Marchand')

    def play(self):
        print()
        self.player.drawing(self.deck.draw())
        self.player.drawing(self.deck.draw())
        self.player.choose_a_first()
        print()
        self.dealer.drawing(self.deck.draw())
        self.dealer.drawing(self.deck.draw(), False)
        self.dealer.choose_a_first()
        print()

        j_21 = self.judje_21(sum(self.player.point), sum(self.dealer.point))
        if j_21:
            logger.info('Naturel 21')
            return

        while self.player.is_continue():
            self.player.drawing(self.deck.draw())
            self.player.choose_a()
            print()
            if sum(self.player.point) >= 22:
                print('{}Est vaincu.'.format(self.player.name))
                logger.info('Buste de joueur')
                return

        self.dealer.show_card()

        while self.dealer.is_continue():
            self.dealer.drawing(self.deck.draw())
            self.dealer.choose_a()
            print()

        self.judje(sum(self.player.point), sum(self.dealer.point))

    def judje_21(self, player_point, dealer_point):
        if player_point == dealer_point == 21:
            print('{}Est également naturel 21.'.format(self.dealer.name))
            print('C'est un tirage au sort.')
            return True
        elif player_point == 21:
            print('{}Est le gagnant.'.format(self.player.name))
            return True
        elif dealer_point == 21:
            print('{}Est naturel 21.'.format(self.dealer.name))
            print('{}Est vaincu.'.format(self.player.name))
            return True

    def judje(self, player_point, dealer_point):
        if player_point == dealer_point:
            print('C'est un tirage au sort.')
        elif player_point > dealer_point or dealer_point >= 22:
            print('{}Est le gagnant.'.format(self.player.name))
        elif player_point < dealer_point:
            print('{}Est vaincu.'.format(self.player.name))


def get_parser():
    parser = argparse.ArgumentParser(description='Vous pouvez blackjack sur le terminal.')

    parser.add_argument('-q', '--qiita', action='store_true', help='Lien Qiita avec le code source')
    parser.add_argument('-r', '--rules', action='store_true', help='Expliquez les règles du blackjack')

    args = parser.parse_args()
    return args


def main():
    args = get_parser()
    if args.qiita:
        print('https://qiita.com/yoshige/items/d06382f2a8b76ce6cd79')
        return

    if args.rules:
        print('Cliquez ici pour les règles du Blackjack')
        print('https://ja.wikipedia.org/wiki/Jack noir')
        return

    logger.info('start')
    print('Bienvenue au Blackjack!')
    bj = BlackJack()
    bj.play()
    logger.info('end')

if __name__ == '__main__':
    main()

Recommended Posts

J'ai fait un blackjack avec du python!
J'ai fait un blackjack avec Python.
J'ai fait un simple blackjack avec Python
J'ai créé wordcloud avec Python.
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai fait un texte Python
J'ai essayé gRPC avec Python
J'ai créé COVID19_simulator avec JupyterLab
J'ai essayé de gratter avec du python
J'ai créé Word2Vec avec Pytorch
Othello fait avec python (comme GUI)
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai essayé de faire LINE BOT avec Python et Heroku
Bases de SNS Python faites avec Flask
J'ai fait un Line-bot avec Python!
pyenv-vertualenv n'installe pas correctement la série python3
J'ai essayé webScraping avec python.
Numer0n avec des objets fabriqués avec Python
J'ai envoyé un SMS avec Python
J'ai aimé le tweet avec python. ..
J'ai joué avec PyQt5 et Python3
Je veux déboguer avec Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
[Je l'ai fait avec Python] Outil pour la sortie par lots de données XML
J'ai fait un jeu de puzzle (comme) avec Tkinter of Python
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
J'ai fait un circuit simple avec Python (AND, OR, NOR, etc.)
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Statistiques avec python
J'ai fait Othello pour enseigner Python3 aux enfants (4)
J'ai fait un programme de gestion de la paie en Python!
Client API Slack simple réalisé avec Python
Type de téléchargement de partage HTTP réalisé avec Python
Python avec Go
J'ai dessiné une carte thermique avec Seaborn [Python]
J'ai fait Othello pour enseigner Python3 aux enfants (2)
J'ai commencé Python