Cette fois, j'aimerais implémenter le poker de Drakue en utilisant le deck de Article précédent.
Le poker normal se joue essentiellement entre les joueurs,
Pour cette raison, ce n’est pas du poker entre joueurs, J'aimerais mettre en place un jeu à une personne comme le poker de Drakue.
Jouez un rôle au poker → Doublez votre score dans une partie en double C'est le flux de base.
| Nom de rôle | Statut de la carte | Exemple de main | But | 
|---|---|---|---|
| 1 paire | Une paire du même numéro | [♣️-4, ♠︎-4, ♦︎-Q, ♠︎-K, ❤︎-5] | 50 | 
| 2 paires | Deux paires du même numéro | [♣️-4, ♠︎-4, ♦︎-Q, ♠︎-Q, ❤︎-5] | 100 | 
| 3 cartes | 3 mêmes numéros | [♣️-4, ♠︎-4, ♦︎-4, ♠︎-Q, ❤︎-5] | 200 | 
| tout droit | Les chiffres sont continus | [♣️-3, ♠︎-4, ♦︎-5, ♠︎-6, ❤︎-7] | 300 | 
| éclat | Toutes les marques sont les mêmes | [♠︎-3, ♠︎-4, ♠︎-5, ♠︎-Q, ♠︎-9] | 400 | 
| Full house | 3 mêmes numéros+1 paire | [♠︎-3, ♠︎-4, ♠︎-5, ♠︎-Q, ♠︎-9] | 500 | 
| Quatre cartes | 4 mêmes numéros | [♠︎-4, ♦︎-4, ♠︎-4, ♣️-4, ❤︎-9] | 1000 | 
| Quinte flush | Flash et droit | [♠︎-4, ♠︎-5, ♠︎-6, ♠︎-7, ♠︎-8] | 2000 | 
| quinte flush royale | Flash et droit | [♠︎-10, ♠︎-J, ♠︎-Q, ♠︎-K, ♠︎-A] | 10000 | 
Nous avons préparé les classes suivantes. Je pense qu'il existe d'autres bons moyens. ..
J'ai utilisé celui créé dans cet article tel quel.
class Player:
    """
Score du joueur / main / drapeau de victoire au poker
    """
    def __init__(self):
        self.score = 0
        self.hands = []
        self.is_poker_win = True
    def draw_card(self, deck, num=1):
        """
Piochez une carte du jeu et ajoutez-la à votre main
* Même si différents numéros sont tirés, c'est ok
        Parameters
        ----------
        num : int, default 1
Nombre de fois pour piocher une carte
        Examples
        --------
        >>> player.draw_card(2) #2 nuls[♠︎-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 Game:
    """
Jeu principal
    Examples
    --------
    >>> game = Game()
    >>> game.main() #Début du jeu (affiche la phase initiale ci-dessous)
    """
    RANKS = (*"23456789", "10", *"JQKA")
    VALUES = (range(2, 14 + 1))
    #Associer la marque d'affichage à la partition
    RANK_TO_VALUES = dict(zip(RANKS, VALUES))
    def main(self):
        """
Jeu entier (poker+Double chance)
        """
        can_play_game = True
        while can_play_game:
            #Réinitialisation des informations du joueur pour chaque partie
            player = Player()
            #Deck set (déterminer le nombre d'ensembles)=Reconstruire le deck pour chaque partie
            deck = stock.Deck()
            poker = Poker(deck, player)
            poker.main_game()
            #Doublez vos chances avec un rôle
            print(player.is_poker_win)
            if player.is_poker_win:
                bonus_game = DoubleUp(player)
                bonus_game.main_game()
            #Redémarrage du jeu
            restart_msg = "Q termine le jeu, sinon le jeu commence:"
            start_res = input(restart_msg)
            if start_res == 'Q':
                can_play_game = False
if __name__ == '__main__':
    game = Game()
    game.main()
La figure ci-dessous montre le jugement de rôle.

class Poker:
    RANKS = (*"23456789", "10", *"JQKA")
    VALUES = (range(2, 14 + 1))
    #Associer la marque d'affichage à la partition
    RANK_TO_VALUES = dict(zip(RANKS, VALUES))
    def __init__(self, deck, player):
        self.deck = deck
        self.player = player
    def change_hands(self, player_hands):
        """
Laissez-les échanger les cartes une par une et renvoyer la main échangée
        Parameters
        ----------
        player_hands : list
Deck de joueur avant l'échange de cartes
        Returns
        --------
        changed_hands : list
Deck du joueur après avoir échangé des cartes
        """
        changed_hands = []
        #Sélectionnez "Frotter" ou "Changer" chaque carte
        print("Enter \"y\" to replace the card.")
        for card_idx, change_card in enumerate(player_hands):
            change_card_msg = f"{change_card}:"
            change_card_res = input(change_card_msg)
            #Si vous voulez le changer, tirez dans le paquet et échangez la carte
            if change_card_res == "y":
                #Dessiner à partir du pont et écraser
                change_card = self.deck.pick_card(1)[0]
                self.player.hands[card_idx] = change_card
            #Ajouté au tableau associatif
            check_card_set = str(change_card).split("-")
            # ❤︎
            card_mark = check_card_set[0]
            # K
            card_rank = check_card_set[1]
            # 13
            card_number = self.RANK_TO_VALUES[card_rank]
            #Ajouter au dictionnaire de vérification
            changed_hands.append({
                "mark": card_mark,
                "rank": card_rank,
                "number": card_number
            })
        return changed_hands
    def calc_hand(self, check_hands):
        """
Calcul des rôles de la main
        Parameters
        ----------
        check_hands : list
Deck du joueur après avoir échangé des cartes
        Returns
        --------
        hand_results : dict
Statut de chaque rôle dans le deck du joueur
        """
        #Flash (même marque)
        is_flash = True
        #Droit (les numéros sont des numéros de série)
        is_straight = True
        #Compter le même nombre
        same_number_count = 0
        same_number = 0
        #Nombre de paires (1 paire ou 2 paires)
        match_pair_count = 0
        #Trier par ordre croissant en fonction du nombre de cartes de votre main
        check_hands_sorted = sorted(check_hands, key=lambda x: x["number"])
        #Vérifiez une par une parmi 5 cartes
        for check_idx, check_card in enumerate(check_hands_sorted):
            #Ignorer la première carte car il n'y a pas de carte précédente
            if check_idx == 0:
                continue
            #Carte précédente{'mark': '♠︎', 'rank': '4', 'number': 4}
            prev_card = check_hands_sorted[check_idx - 1]
            #Si les marques recto et verso sont différentes, définissez le jugement du flash sur Faux.
            if is_flash and check_card["mark"] != prev_card["mark"]:
                is_flash = False
            #Si les nombres ne sont pas continus avant et après, définissez le jugement direct sur Faux.
            if is_straight and check_card["number"] != prev_card["number"] + 1:
                is_straight = False
            #Si les nombres correspondent avant et après, comptez le même nombre+1
            if check_card["number"] == prev_card["number"]:
                #Nombre de matchs+ 1
                same_number_count += 1
                #Dernière carte
                if check_idx == 4:
                    if same_number_count == 1:
                        #Nombre de paires+ 1
                        match_pair_count += 1
                    else:
                        #3 cartes et 4 cartes
                        same_number = same_number_count + 1
            #Pour différents numéros
            else:
                if same_number_count == 1:
                    #Nombre de paires+ 1
                    match_pair_count += 1
                elif same_number_count > 1:
                    #3 cartes et 4 cartes
                    same_number = same_number_count + 1
                #Réinitialiser car il s'agit d'un numéro différent
                same_number_count = 0
        #État de chaque rôle dans la main
        hand_results = {
            "is_flash": is_flash,
            "is_straight": is_straight,
            "same_number_count": same_number_count,
            "same_number": same_number,
            "match_pair_count": match_pair_count
        }
        return hand_results
    def showdown_hand(self, hand_status, check_hands):
        """
Détermination du rôle à partir de l'état du rôle, calcul du score
        Parameters
        ----------
        hand_status : dict
L'état du rôle du joueur après l'échange de cartes
        check_hands : list
main du joueur
        Returns
        --------
        hand_result_msg : str
Jugement du rôle
        """
        #résultat
        hand_result_msg = ""
        #Flash et droit
        if hand_status["is_flash"] and hand_status["is_straight"]:
            #La plus petite carte est 10,La plus grande carte est de 14(A)
            if check_hands[0]["number"] == 10 and  \
                    check_hands[4]["number"] == 14:
                hand_result_msg = "quinte flush royale"
                self.player.score = 10000
            else:
                hand_result_msg = "Quinte flush"
                self.player.score = 2000
        #4 cartes
        elif hand_status["same_number"] == 4:
            hand_result_msg = "4 cartes"
            self.player.score = 1000
        #3 cartes,Jugement complet
        elif hand_status["same_number"] == 3:
            #3 cartes et 1 paire
            if hand_status["match_pair_count"] == 1:
                hand_result_msg = "Full house"
                self.player.score = 500
            else:
                hand_result_msg = "3 cartes"
                self.player.score = 250
        #éclat
        elif hand_status["is_flash"]:
            hand_result_msg = "éclat"
            self.player.score = 400
        #tout droit
        elif hand_status["is_straight"]:
            hand_result_msg = "tout droit"
            self.player.score = 300
        #2 paires
        elif hand_status["match_pair_count"] == 2:
            hand_result_msg = "2 paires"
            self.player.score = 200
        #1 paire
        elif hand_status["match_pair_count"] == 1:
            hand_result_msg = "1 paire"
            self.player.score = 150
        return hand_result_msg
    def main_game(self):
        """
Jeu principal de poker
        """
        print("Poker Game start")
        #Tirez d'abord 5 cartes
        self.player.draw_card(self.deck, 5)
        #Affichage initial de la carte
        print(f"player's hands:{self.player.hands}")
        #Phase d'échange de cartes
        check_hands = self.change_hands(self.player.hands)
        #Affichage de la carte après échange
        print(f"player's hands:{self.player.hands}")
        #Trier par ordre croissant en fonction du nombre dans votre main
        check_hands_sorted = sorted(check_hands, key=lambda x: x["number"])
        #Calcul des rôles de la main
        hand_results = self.calc_hand(check_hands_sorted)
        print(hand_results)
        #Jugement de rôle
        hand_result_msg = self.showdown_hand(hand_results, check_hands_sorted)
        #Perdre s'il n'y a rien
        if hand_result_msg == "":
            hand_result_msg = "Il n'y avait pas de rôle..."
            self.player.is_poker_win = False
        #Sortie de résultat
        print(hand_result_msg)
import re
from deck import stock
class DoubleUp:
    RANKS = (*"23456789", "10", *"JQKA")
    VALUES = (range(2, 14 + 1))
    #Associer la marque d'affichage à la partition
    RANK_TO_VALUES = dict(zip(RANKS, VALUES))
    def __init__(self, player):
        self.player = player
        self.is_game_win = True
    def add_check_hands(self, player_hands):
        """
Afficher les cartes une par une et attribuer des numéros
        Parameters
        ----------
        player_hands : list
5 cartes en main
        Returns
        --------
        check_hands : list
main du joueur
        """
        check_hands = []
        for card_idx, card_val in enumerate(player_hands):
            #Ajouté au tableau associatif
            check_card_set = str(card_val).split("-")
            # ❤︎
            card_mark = check_card_set[0]
            # K
            card_rank = check_card_set[1]
            # 13
            card_number = self.RANK_TO_VALUES[card_rank]
            #Ajouter au dictionnaire de vérification
            check_hands.append({
                "mark": card_mark,
                "rank": card_rank,
                "number": card_number
            })
            #Le premier ne peut pas être sélectionné
            if card_idx >= 1:
                #cacher
                # print(f"{card_idx}:*-*")
                print(f"{card_idx}:{card_val}")
        return check_hands
    def win_judge_selected_card(self, input_res, check_hands):
        """
Jugement gagnant du jeu (Comparez la carte sélectionnée avec la carte face visible)
        Parameters
        ----------
        input_res : str
Le numéro entré dans la commande
        check_hands : list
main du joueur
        """
        if re.compile(r'^[1-4]+$').match(input_res) is not None:
            #Comparaison de la taille du numéro de la carte avec le numéro sélectionné et la carte face visible
            if check_hands[int(input_res)]["number"] >= check_hands[0]["number"]:
                #Doublez le score s'il est grand
                print("win!")
                self.player.score *= 2
            else:
                #Si petit,Marquez 0 et recommencez au poker
                print("lose..")
                self.player.score = 0
                self.is_game_win = False
        else:
            print("Est inutile")
    def main_game(self):
        """
Jeu principal double
        """
        while self.is_game_win:
            #Reconstruction de pont
            self.deck = stock.Deck()
            print("double-Up Chance Game start")
            print(f"Now, your score is {self.player.score} points.")
            self.player.hands = []
            #Distribuez 5 cartes du deck
            self.player.draw_card(self.deck, 5)
            #1 sur 5 est placé face visible, 4 est face cachée
            print(f"player's hands:{self.player.hands[0]}, *-*, *-*, *-*, *-*")
            #Afficher les cartes une par une et attribuer des numéros
            check_hands = self.add_check_hands(self.player.hands)
            #Choisissez l'une des quatre cartes face cachée qui est plus forte que le nombre sur la carte face recto
            card_select_msg = f"Enter a card number that is stronger than {self.player.hands[0]}:"
            card_select_res = input(card_select_msg)
            #Choisissez l'un des numéros 1 à 4
            self.win_judge_selected_card(card_select_res, check_hands)
            print(self.player.score)
$ python main.py
Poker Game start
player's hands:[❤︎-4, ♠︎-9, ♣️-4, ♠︎-3, ♠︎-2]
Enter "y" to replace the card.
❤︎-4:
♠︎-9: y
♣️-4:
♠︎-3: y
♠︎-2: y
player's hands:[❤︎-4, ❤︎-K, ♣️-4, ♠︎-K, ♣️-6]
2 paires
double-Up Chance Game start
Now, your score is 100 points.
player's hands:♠︎-6, *-*, *-*, *-*, *-*
1:*-*
2:*-*
3:*-*
4:*-*
Enter a card number that is stronger than ♠︎-6: 2
Selected card is ❤︎-12
win!
200
double-Up Chance Game start
Now, your score is 200 points.
player's hands:♠︎-K, *-*, *-*, *-*, *-*
1:*-*
2:*-*
3:*-*
4:*-*
Enter a card number that is stronger than ♠︎-K: 3
Selected card is ♦︎-2
lose..
0
Terminez le jeu avec Q, démarrez le jeu sinon: Q
Recommended Posts