Ich habe versucht, das Blackjack of Trump-Spiel mit Python zu implementieren

Einführung

Letztes Mal habe ich die Deck-Funktion von Trump wie in [hier] gezeigt erstellt (https://qiita.com/p-t-a-p-1/items/ef34310e5a58fce8d217).

Mit der vorherigen Deck-Funktion habe ich diesmal versucht, die Hauptspielfunktion von Blackjack zu implementieren. Wie würden Sie tatsächlich ein Programm schreiben und das, was Sie gesagt haben, aus den bestehenden Anforderungen erweitern? Ich glaube, ich habe viel gelernt, indem ich darüber nachgedacht habe!

Funktionale Anforderungen

Die grundlegenden Regeln und Anforderungen finden Sie in Entwicklung von "Blackjack" für Abschlussprüfungen von Programmieranfängern. Vielen Dank!

  • Die erste Karte ist 52. Stellen Sie sicher, dass beim Zeichnen keine doppelten Karten vorhanden sind
  • Zwei Spieler und Dealer. Spieler laufen, Händler laufen automatisch
  • Zu Beginn der Ausführung ziehen der Spieler und der Dealer jeweils zwei Karten. Die gezogene Karte wird auf dem Bildschirm angezeigt. Allerdings ** kenne die zweite Karte des Dealers nicht **
  • Danach zieht der Spieler zuerst die Karte. Wenn die Anzahl der Spieler 21 überschreitet, endet das Spiel an diesem Punkt
  • Spieler können jedes Mal, wenn sie eine Karte ziehen, die nächste Karte ziehen
  • Sobald der Spieler das Zeichnen beendet hat, zieht der Dealer weiter, bis seine Hand 17 oder höher ist.
  • Ein Spiel, bei dem der Spieler und der Dealer mit dem Zeichnen fertig sind. Derjenige, der näher an 21 ist, gewinnt
  • J, Q und K werden als 10 behandelt
  • ** A wird vorerst nur als "1" behandelt. ** Nicht auf "11" einstellen
  • Keine Verdoppelung, keine Trennung, keine Kapitulation, keine anderen Sonderregeln

Dieses Mal habe ich zusätzlich zu diesen Anforderungen die folgenden Funktionen hinzugefügt.

Implementierung

Wir haben die folgenden Klassen vorbereitet und jede Datei getrennt. Die Kartenklasse und die Deckklasse haben keine Blackjack-spezifischen Spezifikationen, sodass sie in anderen Trump-Spielen verwendet werden können.

Kartenklasse / Deckklasse

Ich habe den in diesem Artikel erstellten verwendet.

Spielerklasse / Händlerklasse

from bj import BlackJack


class Player:
    """
Kind (Spieler, der manuell bedient werden kann)
    """

    def __init__(self):
        self.win_count = 0
        self.hands = []
        self.card_current_score = 0
        self.card_current_score_sub = 0
        self.has_A_card = False

    def keep_drawing_card(self, deck):
        """
Lassen Sie den Spieler entscheiden, ob er schlagen oder stehen möchte
(Stand beendet den Zug des Spielers)

        Parameters
        ----------
        deck : deck
Ein Kartensatz
        """
        want_to_draw = True
        while want_to_draw:
            hit_or_stand_msg = "\nHit(1) or Stand(2) : "
            hit_or_stand_res = input(hit_or_stand_msg)
            if hit_or_stand_res == "1":
                #1 Unentschieden für Treffer
                self.draw_card(deck)
                print(f"player draw card is : {self.hands[-1]}")
                BlackJack.calc_current_score(self)
                sub_score = ""
                if self.has_A_card is True:
                    sub_score = \
                        f", {self.card_current_score_sub}"
                print(
                    f"players's total_score : \
{self.card_current_score}{sub_score}")

                #Erzwungene Beendigung des Spielzugs mit Burst
                if BlackJack.is_score_bust(int(self.card_current_score)) and \
                    BlackJack.is_score_bust(
                        int(self.card_current_score_sub)):
                    print("player bust!!!")
                    want_to_draw = False

                if self.card_current_score == 21 or \
                        self.card_current_score_sub == 21:
                    #Zwangsbeendigung bei Erreichen von 21
                    want_to_draw = False

            elif hit_or_stand_res == "2":
                #Im Falle eines Standes endet die Drehung
                want_to_draw = False
            else:
                # 1,Geben Sie andere Befehle als 2 erneut ein
                print("Ist nutzlos")

    def draw_card(self, deck, num=1):
        """
Ziehe eine Karte aus dem Stapel und lege sie deiner Hand hinzu
* Auch wenn unterschiedliche Zahlen gezogen werden, ist dies in Ordnung

        Parameters
        ----------
        num : int, default 1
Häufigkeit, mit der eine Karte gezogen wird

        Examples
        --------
        >>> player.draw_card(2) #2 Unentschieden[♠︎-J, ♠︎-10]
        >>> player.draw_card(3) # [♦︎-9, ♣️-10, ♠︎-2]
        >>> print(player.hands)
        [♠︎-J, ♠︎-10, ♦︎-9, ♣️-10, ♠︎-2]
        """
        self.hands_store = deck.pick_card(num)
        self.hands.extend(self.hands_store)


class Dealer(Player):
    """
Eltern (automatischer Betrieb)
    """

    def keep_drawing_card(self, deck):
        """
Der Dealer zieht automatisch Karten, bis sie 17 überschreiten
Beenden Sie, wenn 17 überschritten wird

        Parameters
        ----------
        deck : object
Aktuelle Hand
        """
        self.has_A_card = False
        while self.card_current_score < 17 or \
                self.card_current_score_sub < 17:
            self.draw_card(deck)
            print(f"dealer draw card is : {self.hands[-1]}")
            BlackJack.calc_current_score(self)
            sub_score = ""
            if self.has_A_card:
                sub_score = \
                    f", {self.card_current_score_sub}"
            print(
                f"dealer's total_score : {self.card_current_score}{sub_score}")
            if BlackJack.is_score_bust(self.card_current_score) and \
                    BlackJack.is_score_bust(
                    int(self.card_current_score_sub)):
                print("dealer bust!!!")

Spielklasse

from deck import stock
import role
from bj import BlackJack


class Game:
    """
Hauptspiel (Spieler- und Dealer-Instanz beim Erstellen der Instanz erstellen)

    Examples
    --------
    >>> game = Game()
    >>> game.main() #Spielstart (zeigt die Anfangsphase unten an)
    dealer's hands : [❤︎-7, *-*]

    player's hands : [♠︎-9, ♦︎-J]
    players's total_score : 19

    Hit(1) or Stand(2) :
    """

    def __init__(self):
        #Spieler und Dealer erstellen
        self.player = role.Player()
        self.dealer = role.Dealer()

    def get_nearest_score(self, score_list):
        """
Gibt die Zahl zurück, die 21 unter 21 aus den Haupt- und Nebenergebnissen am nächsten kommt
Gibt 0 zurück, wenn beide 21 überschreiten

        Parameters
        ----------
        score_list : list
Liste der Haupt- und Nebenergebnisse

        Returns
        --------
        main_score : int
Eine Zahl nahe 21 der beiden Punkte (0, wenn beide größer als 21 sind)
        """
        main_score = 0
        for score in score_list:
            if score > 21:
                #Zahlen größer als 21 platzen
                continue
            elif main_score < score:
                main_score = score
        return main_score

    def judge_winner(self, player, dealer):
        """
Gewinn / Verlust-Urteil

        Parameters
        ----------
        dealer : object
Elternteil
        player : object
Kind
        """

        # player,Holen Sie sich und vergleichen Sie die Annäherung an 21 von 21 oder weniger in der Punktzahl jedes Händlers
        player_score_list = [
            player.card_current_score,
            player.card_current_score_sub]
        player_score = self.get_nearest_score(player_score_list)

        dealer_score_list = [
            dealer.card_current_score,
            dealer.card_current_score_sub]
        dealer_score = self.get_nearest_score(dealer_score_list)

        judge_win = ""
        #Beide Bursts werden gezogen
        if player_score == 0 and dealer_score == 0:
            judge_win = "---draw---"

        if dealer_score < \
                player_score <= 21:
            # dealer < player <=Mit 21 gewinnt der Spieler
            judge_win = "player win!"
            player.win_count += 1
        elif player_score <= 21 \
                < dealer_score:
            #Der Spieler gewinnt, wenn der Spieler 21 oder weniger ist, der Dealer platzt
            judge_win = "player win!"
            player.win_count += 1
        elif player_score == dealer_score \
                and player_score <= 21:
            #Keiner platzt, und wenn die Zahlen gleich sind, ein Unentschieden
            judge_win = "---draw---"
        else:
            #Ansonsten verlieren alle Spieler
            judge_win = "dealer win!"
            dealer.win_count += 1
        #Konsolenanzeige
        print(f"\n/***********/\n/{judge_win}/\n/***********/")

    def display_final_result(
            self,
            player_win_count,
            dealer_win_count,
            total_count):
        """
Gewinn / Verlust-Urteil

        Parameters
        ----------
        player_win_count : int
Anzahl der Spieler gewinnt
        dealer_win_count : int
Händler gewinnt
        total_count : int
Gesamtzahl der Spiele
        """
        #Berechnen Sie die Anzahl der Ziehungen, indem Sie die Anzahl der Gewinne von Spieler und Dealer von der Gesamtzahl der Spiele abziehen
        draw_count = total_count - player_win_count - dealer_win_count
        return f"""\
*-*-*-*-*-*-*-*
total:{total_count}
win:{player_win_count}
lose:{dealer_win_count}
draw:{draw_count}
*-*-*-*-*-*-*-*\
"""

    def main(self):
        """
Blackjack Hauptspielfunktion
        """

        #Deck-Set (Anzahl der Sets bestimmen)
        deck = stock.Deck()

        total_count = 0
        can_play_game = True
        #Wenn noch 5 oder mehr Karten übrig sind
        while can_play_game and len(deck.cards) > 5:

            self.player.hands = []
            self.dealer.hands = []

            #Anzahl von Spielen+1
            total_count += 1

            #Zeichne zuerst zwei
            self.player.draw_card(deck, 2)
            self.dealer.draw_card(deck, 2)

            #Berechnung der anfänglichen Punktzahl des Spielers
            BlackJack.calc_current_score(self.player)
            #Wenn A subtrahiert wird, wird auch die Teilpunktzahl angezeigt.
            player_sub_score = BlackJack.check_draw_A(self.player)

            #Punkteanzeige zum Zeitpunkt der ersten Ziehung (eine auf der Händlerseite ist abgelehnt)
            print("\n--Game Start--\n")
            first_msg = f"""\
dealer's hands : [{self.dealer.hands[0]}, *-*]
player's hands : {self.player.hands}

players's total_score : {self.player.card_current_score}{player_sub_score}\
            """
            print(f"{first_msg}")

            #Lassen Sie den Spieler entscheiden, ob er trifft oder steht (der Stand beendet den Zug des Spielers)
            self.player.keep_drawing_card(deck)

            print("\n--Result--\n")

            #Berechnung der Händlerpunktzahl
            BlackJack.calc_current_score(self.dealer)
            #Wenn A subtrahiert wird, wird auch die Teilpunktzahl angezeigt.
            dealer_sub_score = BlackJack.check_draw_A(self.dealer)
            dealer_msg = f"""\
dealer's hands : {self.dealer.hands}
dealer's total_score : {self.dealer.card_current_score}{dealer_sub_score}\
            """
            print(f"{dealer_msg}")

            #Zeichnen Sie, bis die Hand des Dealers 17 beträgt
            self.dealer.keep_drawing_card(deck)

            #Gewinn / Verlust-Urteil
            self.judge_winner(self.player, self.dealer)

            print("\n--Game End--\n")

            #Spiel neu starten
            restart_msg = "Q beendet das Spiel, andernfalls beginnt das Spiel:"
            start_res = input(restart_msg)
            if start_res == 'Q':
                can_play_game = False

        #Berechnen Sie die Anzahl der Spiele und die Anzahl der Gewinne und zeigen Sie sie an
        final_score_str = self.display_final_result(
            self.player.win_count, self.dealer.win_count, total_count)
        print(final_score_str)


if __name__ == '__main__':
    game = Game()
    game.main()

BlackJack-Klasse

class BlackJack:
    """
Blackjack Regeln
    """

    RANKS = (*"A23456789", "10", *"JQK")
    values = list(range(1, 11))  # 1〜10
    values.extend([10, 10, 10])  # JQK
    VALUES = (values)
    #Verknüpfen Sie die Anzeigemarke mit der Partitur
    # {'A': 1, '2': 2, '3': 3, '4': 4, '5': 5,
    #  '6': 6, '7': 7, '8': 8, '9': 9, '10': 10,
    #  'J': 10, 'Q': 10, 'K': 10}
    RANK_TO_VALUES = dict(zip(RANKS, VALUES))

    @classmethod
    def calc_current_score(cls, person):
        """
Berechnen Sie die aktuelle Punktzahl

        Parameters
        ----------
        person : object
Aktuelle Hand

        Returns
        --------
        card_current_score : int
Momentaner Punktestand
        """
        person.card_current_score = 0
        person.card_current_score_sub = 0
        person.has_A_card = False
        for card in person.hands:
            card_rank = str(card).split("-")[1]
            card_value = cls.RANK_TO_VALUES[card_rank]

            #Betrachten Sie die Zeit von A.
            person.card_current_score += card_value
            person.card_current_score_sub += card_value
            if card_value == 1:
                if person.has_A_card:
                    #Wenn A stetig ist, wird der Unterpunkt verdoppelt und der Unterpunkt hinzugefügt.+10(+11-1)
                    person.card_current_score_sub += 10
                    print(person.card_current_score_sub)
                    continue
                person.has_A_card = True
                person.card_current_score_sub += 11

    @classmethod
    def is_score_bust(cls, total_score):
        """
Berechnen Sie die aktuelle Punktzahl

        Parameters
        ----------
        current_hands : list
Aktuelle Hand

        Returns
        --------
        True or False
Richtig im Burst
        """
        return total_score > 21

    @classmethod
    def check_draw_A(cls, person):
        """
Wenn Sie ein A in der Hand haben, wird auch der Unterpunkt angezeigt

        Parameters
        ----------
        person : object
            player or dealer

        Returns
        --------
        person_sub_score : str
Unterstrich-Zeichenfolge (leeres Zeichen, wenn Sie kein A in der Hand haben)
        """
        person_sub_score = ""
        if person.has_A_card is True:
            person_sub_score = f", {person.card_current_score_sub}"
        return person_sub_score

Besorgte Punkte

Informationen zur Punkteberechnung von A (calc_current_score der Spielerklasse)

Ich war darüber besorgt, aber ich habe von Anfang an einen Subcore vorbereitet, und als ich A subtrahierte, die Konsolenanzeige, Bei der Berechnung der Punktzahl habe ich sie als +1 für die Haupt- und +11 für die Nebenpartie implementiert. Ich denke, es gibt andere bessere Möglichkeiten. Ich konnte es ziemlich reibungslos implementieren, bis ich die Punktzahl mit A als 1 berechnet habe. Indem Sie es zu einer Möglichkeit machen, Unterpunkte vorzubereiten Ich denke, es war ein kleiner Fehler, dass die Verarbeitung der Punkteberechnung zugenommen hat.

Mehrpunktesiegsurteil (Spielklasse get_nearest_score, Judge_winner)

Dieses Mal haben wir jeweils 2 Punkte für Spieler und Dealer In der Liste des jeweils anderen wurde die Punktzahl, die näher an 21 lag, ohne 21 zu überschreiten, als Bewertungspunktzahl verwendet.

Wenn beide Punktzahlen geplatzt sind, ist die Punktzahl 0, und wenn eine geplatzt ist, ist die andere die Beurteilungspunktzahl. → Es gibt keinen Spieler mehr als 17 (da es bei 16 ein Unentschieden gibt) → Der Händler zieht automatisch, bis beide Punkte 17 überschreiten

Bewegung

Wenn es ausgeführt wird, sieht es so aus. Schließlich werden die Anzahl der Spiele und die Anzahl der Spielergewinne angezeigt.

$ python main.py 

--Game Start--

dealer's hands : [❤︎-J, *-*]
player's hands : [♦︎-3, ♠︎-3]

players's total_score : 6            

Hit(1) or Stand(2) : 1
player draw card is : ♠︎-Q
players's total_score : 16

Hit(1) or Stand(2) : 1
player draw card is : ♠︎-5
players's total_score : 21

--Result--

dealer's hands : [❤︎-J, ♦︎-5]
dealer's total_score : 15            
dealer draw card is : ❤︎-Q
dealer's total_score : 25
dealer burst!!!

/***********/
/player win!/
/***********/

--Game End--

Q beendet das Spiel, andernfalls beginnt das Spiel:

--Game Start--

dealer's hands : [♠︎-10, *-*]
player's hands : [♠︎-8, ♦︎-8]

players's total_score : 16            

Hit(1) or Stand(2) : 2

--Result--

dealer's hands : [♠︎-10, ♣️-A]
dealer's total_score : 11, 22            
dealer draw card is : ♣️-5
dealer's total_score : 16, 27
dealer draw card is : ♣️-Q
dealer's total_score : 26, 37
dealer burst!!!

/***********/
/player win!/
/***********/

--Game End--

Q beendet das Spiel, andernfalls beginnt das Spiel:

--Game Start--

dealer's hands : [❤︎-K, *-*]
player's hands : [♦︎-A, ♠︎-7]

players's total_score : 8, 19            

Hit(1) or Stand(2) : 2

--Result--

dealer's hands : [❤︎-K, ♠︎-J]
dealer's total_score : 20            

/***********/
/dealer win!/
/***********/

--Game End--

Beende das Spiel mit Q, starte das Spiel ansonsten: Q.
*-*-*-*-*-*-*-*
total:3
win:2
lose:1
draw:0
*-*-*-*-*-*-*-*

Ende

Double Down und Split sind zukünftige Themen.

Recommended Posts

Ich habe versucht, das Blackjack of Trump-Spiel mit Python zu implementieren
Ich habe versucht, Trumps Kartenspiel in Python zu implementieren
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, PPO in Python zu implementieren
Ich habe versucht, ein missverstandenes Gefangenendilemma in Python zu implementieren
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Ich habe versucht, eine selektive Sortierung in Python zu implementieren
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ich habe versucht, Drakues Poker in Python zu implementieren
Ich habe versucht, GA (genetischer Algorithmus) in Python zu implementieren
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe versucht, mit Python ein Tippspiel zu spielen
Ich habe versucht, die Bayes'sche lineare Regression durch Gibbs-Sampling in Python zu implementieren
Ich habe versucht, PCANet zu implementieren
Ich habe versucht, StarGAN (1) zu implementieren.
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich möchte Timeout einfach in Python implementieren
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, einen automatischen Nachweis der Sequenzberechnung zu implementieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Zusammenführungssortierung in Python mit möglichst wenigen Zeilen zu implementieren
Ich habe versucht, ein scheinbar Windows-Snipper-Tool mit Python zu implementieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, Deep VQE zu implementieren
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe versucht, Python zu berühren (Installation)
Implementierung eines Lebensspiels in Python
Ich habe versucht, eine kontroverse Validierung zu implementieren
Ich habe versucht "Wie man eine Methode in Python dekoriert"
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, Realness GAN zu implementieren
Ich habe Line Benachrichtigung in Python versucht
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
[Python] Ich habe versucht, eine stabile Sortierung zu implementieren
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Implementieren Sie einen deterministischen endlichen Automaten in Python, um Vielfache von 3 zu bestimmen
Ich habe versucht, in 3 Jahren 5 Muster der Analysebasis zu erstellen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Ich wollte ABC159 mit Python lösen
Ich habe versucht, CVAE mit PyTorch zu implementieren
[Python] Ich habe versucht, TF-IDF stetig zu berechnen