Ich habe mit Python einen Blackjack gemacht.

Einführung

Der Adventskalender war geöffnet, also schreibe ich ihn noch einmal. Dieses Mal habe ich, wie der Titel schon sagt, einen Blackjack gemacht.

Klicken Sie hier für den vorherigen Artikel → Ich habe mit Python eine Lotterie gemacht.

Umgebung

Ubuntu18.04LTS Python3.6.9 vim

Code

play_bj.py


from random import shuffle


class Deck:
    """
Klasse, die das Deck darstellt
    """
    def __init__(self):
        """
Initialisiere das Deck und mische es.
        """
        suits = ['Spaten', 'Verein', 'Diamant', 'Herz']
        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):
        """
Ziehe eine Karte aus dem Stapel und gib die gezogene Karte zurück.
        """
        return self.deck.pop(0)


class Person:
    """
Klasse, die den Spieler repräsentiert
    """
    def __init__(self):
        """
Initialisieren Sie Ihre Hand.
        """
        self.hands = []
        self.point = 0

    def add(self, card):
        """
Fügen Sie Ihrer Hand eine Karte hinzu.
        """
        self.hands.append(card)

    def point_sum(self):
        """
Finden Sie die Gesamtpunktzahl von 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():
    """
Hauptverarbeitung
    """
    print('Willkommen beim Blackjack!')

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

    drawing(d, p, 'Sie')
    drawing(d, p, 'Sie')

    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('Es ist eine Zeichnung.')
        return
    elif player_point == 21:
        print('Du gewinnst!')
        return
    elif cpu_point == 21:
        print('Du verlierst.')
        return
    #Hier wird A nicht zu 11, so dass der obige bedingte Zweig nicht wirklich notwendig ist.

    while True:
        choice = input('"Hit"Oder"Stand"Bitte eingeben.: ')

        while True:
            if choice.lower() == 'hit' or choice.lower() == 'stand':
                break
            else:
                choice = input('"Hit"Oder"Stand"Bitte eingeben.: ')

        if choice.lower() == 'hit':
            drawing(d, p, 'Sie')
            player_point = p.point_sum()
            if player_point >= 22:
                print('Du verlierst.')
                return
        elif choice.lower() == 'stand':
            break
        else:
            print('error')
            return

    print('Eine weitere Karte der CPU{}von{}ist.'.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('Du gewinnst!')
                return
        else:
            break

    if player_point == cpu_point:
        print('Es ist eine Zeichnung.')
        return
    elif player_point > cpu_point:
        print('Du gewinnst!')
        return
    elif player_point < cpu_point:
        print('Du verlierst.')
        return


def drawing(class1, class2, name):
    """
Füge deiner Hand 1 Karte vom Stapel hinzu.
Danach werden die Informationen der hinzugefügten Karte angezeigt.
    """
    card = class1.draw()
    class2.add(card)
    print('{}Die Karte gezogen von{}von{}ist.'.format(name, card[0], card[1]))


if __name__ == '__main__':
    BJ()

abschließend

Es war eine gute Studie über Funktionen und Klassen. Als nächstes machen wir A auch mit 11 kompatibel. Ich werde es hinzufügen, sobald ein besseres gemacht wird.

Nachtrag

Ich habe den Code mithilfe der Klassenvererbung usw. organisiert. Außerdem kann 11 für A unterstützt werden. (12/09) Fehlerbehandlung und Argumentation hinzugefügt. (16.12.) Protokollierung hinzugefügt. (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 = 'Spaten', 'Verein', 'Diamant', 'Herz'
    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('{}Die Karte gezogen von{}von{}ist.'
                  .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('Möchten Sie, dass A 1 oder 11 ist?: ')
            except (KeyboardInterrupt, EOFError):
                print()
                print('Ich habe Blackjack beendet.')
                sys.exit()
            else:
                if choice_point == '11':
                    self.point.append(10)
                    break
                if choice_point == '1':
                    break
        print('{}Die Gesamtpunktzahl von{}ist.'.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('Möchten Sie, dass A 1 oder 11 ist?: ')
            except (KeyboardInterrupt, EOFError):
                print()
                print('Ich habe Blackjack beendet.')
                sys.exit()
            else:
                if choice_point == '11':
                    self.point.append(10)
                    break
                if choice_point == '1':
                    break
        print('{}Die Gesamtpunktzahl von{}ist.'.format(self.name, sum(self.point)))

    def is_continue(self):
        while True:
            try:
                choice = input('Geben Sie Hit oder Stand ein.: ').lower()
            except (KeyboardInterrupt, EOFError):
                print()
                print('Ich habe Blackjack beendet.')
                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('{}Die Gesamtpunktzahl von{}ist.'.format(self.name, sum(self.point)))

    def show_card(self):
        print('{}Eine weitere Karte von{}von{}ist.'
              .format(self.name, self.hands[1].suit, self.hands[1].rank))
        print('{}Die Gesamtpunktzahl von{}ist.'.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('Bitte geben Sie Ihren Namen ein.: ')
        except (KeyboardInterrupt, EOFError):
            print()
            print('Ich habe Blackjack beendet.')
            sys.exit()
        else:
            self.deck = Deck()
            self.player = Player(name)
            self.dealer = Dealer('Händler')

    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('Natürlich 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('{}Ist besiegt.'.format(self.player.name))
                logger.info('Spieler Büste')
                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('{}Ist auch natürlich 21.'.format(self.dealer.name))
            print('Es ist eine Zeichnung.')
            return True
        elif player_point == 21:
            print('{}Ist der Gewinner.'.format(self.player.name))
            return True
        elif dealer_point == 21:
            print('{}Ist natürlich 21.'.format(self.dealer.name))
            print('{}Ist besiegt.'.format(self.player.name))
            return True

    def judje(self, player_point, dealer_point):
        if player_point == dealer_point:
            print('Es ist eine Zeichnung.')
        elif player_point > dealer_point or dealer_point >= 22:
            print('{}Ist der Gewinner.'.format(self.player.name))
        elif player_point < dealer_point:
            print('{}Ist besiegt.'.format(self.player.name))


def get_parser():
    parser = argparse.ArgumentParser(description='Sie können am Terminal Blackjack spielen.')

    parser.add_argument('-q', '--qiita', action='store_true', help='Qiita-Link mit Quellcode')
    parser.add_argument('-r', '--rules', action='store_true', help='Erklären Sie die Regeln des 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('Klicken Sie hier für Blackjack-Regeln')
        print('https://ja.wikipedia.org/wiki/schwarzer Jack')
        return

    logger.info('start')
    print('Willkommen beim Blackjack!')
    bj = BlackJack()
    bj.play()
    logger.info('end')

if __name__ == '__main__':
    main()

Recommended Posts

Ich habe einen Blackjack mit Python gemacht!
Ich habe mit Python einen Blackjack gemacht.
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe Wordcloud mit Python gemacht.
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe einen Python-Text gemacht
Ich habe gRPC mit Python ausprobiert
Ich habe COVID19_simulator mit JupyterLab erstellt
Ich habe versucht, mit Python zu kratzen
Ich habe Word2Vec mit Pytorch gemacht
Othello gemacht mit Python (wie GUI)
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Mit Flask erstellte SNS Python-Grundlagen
Ich habe einen Line-Bot mit Python gemacht!
pyenv-vertualenv installiert die Python3-Serie nicht gut
Ich habe versucht, WebScraping mit Python.
Numer0n mit Elementen, die mit Python erstellt wurden
Ich habe eine SMS mit Python gesendet
Ich mochte den Tweet mit Python. ..
Ich habe mit PyQt5 und Python3 gespielt
Ich möchte mit Python debuggen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
[Ich habe es mit Python gemacht] Tool für die Stapelausgabe von XML-Daten
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Statistik mit Python
Ich habe Othello dazu gebracht, Kindern Python3 beizubringen (4)
Ich habe ein Pay-Management-Programm in Python erstellt!
Einfacher Slack API-Client mit Python
HTTP Split Download Typ mit Python gemacht
Python mit Go
Ich habe eine Heatmap mit Seaborn [Python] gezeichnet.
Ich habe Othello dazu gebracht, Kindern Python3 beizubringen (2)
Ich habe Python gestartet