4 votes

Jeu de cartes de devinettes et mise en œuvre de l'aide

Je suis novice en Python et j'ai passé mes premières dizaines d'heures avec mes cours en ligne, mes projets de devoirs et quelques lectures de documentation bien sûr.

J'ai presque terminé un de mes cours. Mon projet final consiste à créer un jeu de cartes facile que j'ai déjà terminé (code ci-dessous). Je voudrais expliquer brièvement ce qu'est mon jeu. C'est un jeu de cartes facile à jouer pour un nombre indéfini de joueurs. Les joueurs devinent simplement si la prochaine carte sera plus basse ou plus haute que la précédente et gagnent ou perdent en pariant selon qu'ils ont eu raison ou non.

D'après ce que j'ai testé, mon code fonctionne (j'ai trouvé un bug que je n'ai pas pu résoudre jusqu'à présent - lorsque tous les joueurs ont perdu dans un tour, ils ne sont pas tous expulsés du jeu comme ils devraient l'être).

Quoi qu'il en soit, mon principal problème est que je ne sais pas comment implémenter ceci dans mon code : A n'importe quel moment du jeu, quelqu'un devrait pouvoir taper "--help" pour être amené à un écran où il peut lire les règles du jeu et les instructions pour jouer. Après avoir fini de lire, il devrait pouvoir taper "--resume" pour retourner au jeu et reprendre là où il s'est arrêté. (J'ai trouvé à peu près la même question ici : Python simple jeu de cartes - )

J'ai fait un peu de recherche et la seule chose utile que j'ai trouvée était help() fonction. J'ai essayé de l'implémenter mais je ne suis pas sûr que ce soit le bon choix pour faire ce drapeau --help et --resume (est-ce même appelé drapeau ? Je ne suis pas sûr à 100% de la terminologie Python).

Mon code est :

from random import shuffle, randrange

def cardDeck():  # create deck of the cards

    cardDeck = []
    for value in range(4):  # four sets of cards
        for i in range(2, 11):  # for number values
            if value == 0:
                cardDeck.append(str(i) + '')
            if value == 1:
                cardDeck.append(str(i) + '')
            if value == 2:
                cardDeck.append(str(i) + '')
            if value == 3:
                cardDeck.append(str(i) + '')
    figures = ['J', 'Q', 'K', 'A']
    for figure in figures:  # for four set of figures
        cardDeck.append(str(figure) + '')
        cardDeck.append(str(figure) + '')
        cardDeck.append(str(figure) + '')
        cardDeck.append(str(figure) + '')
    shuffle(cardDeck)
    return cardDeck

class Player: # define player class
    def __init__(self, nickname='Player', bankroll=100, value=0):
        self.nick = nickname
        self.bankroll = int(bankroll)
        self.value = value
        self.BetKind = ''
        self.amount = 0

    def __str__(self):
        return self.nick + ' plays'

    def win(self):

        self.bankroll += 2 * int(self.amount)

    def MassBet(self):

        for i in range(1000):
            self.amount = int(input('how much do you want to bet? '))
            if self.amount <= self.bankroll:
                break
            else:
                print('You can bet only your current bank!')
        for i in range(1000):
            self.BetKind = input('higher/lower [h/l] ')
            if self.BetKind == 'h' or self.BetKind == 'l':
                break
            else:
                print("Please enter only 'h' or 'l' ")
        self.bankroll -= int(self.amount)

    def GetValue(self, card):
        self.value = Values[card[0:-1]]

Deck = cardDeck()
Values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,
          '8': 8, '9': 9, '10': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14} # define value of each card

PlayerList = []
NPlayers = int(input('How many players are going to play? ')) # Here you can define players
for i in range(NPlayers):
    print('Inicialization, player ', i+1)
    nickname = input('What is your nickname? ')
    bankroll = input('What is your bank? ')
    player = Player(nickname, bankroll)
    PlayerList.append(player)

oldCardsValues = []
oldCardsValues.append(Deck[-1]) # first card that everybody see
Deck.pop()
round = 0
while True:
    print('You bet againts: ', oldCardsValues[-1])
    for player in PlayerList:       # define kind of the bet for each player
        print(player.nick+', ', end = '')
        player.MassBet()
    DrawCard = Deck.pop()
    if NPlayers == 1:
        print('You draw: ', DrawCard)
    else:
        print('All players bet! Draw is: ', DrawCard)
    for player in PlayerList: # define if player won or lost
        player.GetValue(DrawCard)
        if player.BetKind == 'l':
            if Values[oldCardsValues[-1][0:-1]] > player.value:
                player.win()
                print(player.nick,'won! New bankroll: ', player.bankroll)
            elif Values[oldCardsValues[-1][0:-1]] < player.value:
                print(player.nick, 'lost! New bankroll: ', player.bankroll)
            else:
                print('Same card', player.nick, 'lost')
        elif player.BetKind == 'h':
            if Values[oldCardsValues[-1][0:-1]] < player.value:
                player.win()
                print(player.nick,'won! New bankroll: ', player.bankroll)
            elif Values[oldCardsValues[-1][0:-1]] > player.value:
                print(player.nick, 'lost! New bankroll: ', player.bankroll)
            else:
                print('Same card', player.nick, 'lost')
        print(player.bankroll)
        if player.bankroll <= 0: # if player run out of cash he is out
            print(player.nick, 'I am sorry, you run out of your cash. You are out.')
            PlayerList.remove(player)
    if len(PlayerList) == 0: # if there are no remaining players game is over
        print('No more players left. Game Over!')
        break

    round += 1
    MixCoeficcient = randrange(25, 35)
    if len(Deck) < MixCoeficcient: # create new deck in random interval of the remaining cards
        Deck = cardDeck()

    oldCardsValues.append(DrawCard)
    print('-'*40)

Pourriez-vous me conseiller sur la manière d'implémenter ces --help et --resume dans mon jeu ? Où chercher ou même me dire ce que je dois chercher ?

Par ailleurs, si vous souhaitez me faire part de vos commentaires sur le code (ce qui peut être écrit plus facilement ou ce que je dois éviter dans ma future carrière de codeur ou toute autre chose), je vous en serais très reconnaissant.

3voto

Noah Broyles Points 643

Afin de pouvoir obtenir une invite "--help" ou "--resume" n'importe où dans le jeu, vous devez utiliser une fonction d'entrée spéciale à chaque endroit où vous utiliseriez normalement la fonction régulière de Python input() fonction. Quelque chose comme ça :

def specialInput(prompt):
    action = input(prompt)
    if action == '--help':
        print("You need help")
        # Go to help screen
        showHelp()
        return specialInput(prompt)
    elif action == '--resume':
        print("You want to resume")
        # Resume the game
        # resume()
        return specialInput(prompt)
    else:
        return action

Cette fonction reçoit une entrée en utilisant une invite donnée et la vérifie pour voir si elle est égale à l'une des deux options suivantes --help o --resume . Si c'est le cas, il affichera l'aide ou poursuivra l'exécution du programme.
Il n'est pas nécessairement nécessaire() d'avoir une resume() cependant. Vous pourriez faire showHelp() Il suffit d'imprimer quelques instructions, et le programme continuera automatiquement (à partir de la même invite d'entrée où vous vous êtes arrêté) après que l'aide ait été imprimée.

Le programme complet ressemble à ceci :

from random import shuffle, randrange

def showHelp():
    instructions = """\nPlayers simply guess if the next card is going to be lower or higher than previous one
and win or loose they bet according to if they were right or not.\n"""
    print(instructions)

def specialInput(prompt):
    action = input(prompt)
    if action == '--help':
        print("You need help")
        # Go to help screen
        showHelp()
        return specialInput(prompt)
    elif action == "--resume":
        print("You want to resume")
        # You can decide whether or not to do anything else here
        return specialInput(prompt)
    else:
        return action

def cardDeck():  # create deck of the cards
    cardDeck = []
    for value in range(4):  # four sets of cards
        for i in range(2, 11):  # for number values
            if value == 0:
                cardDeck.append(str(i) + '')
            if value == 1:
                cardDeck.append(str(i) + '')
            if value == 2:
                cardDeck.append(str(i) + '')
            if value == 3:
                cardDeck.append(str(i) + '')
    figures = ['J', 'Q', 'K', 'A']
    for figure in figures:  # for four set of figures
        cardDeck.append(str(figure) + '')
        cardDeck.append(str(figure) + '')
        cardDeck.append(str(figure) + '')
        cardDeck.append(str(figure) + '')
    shuffle(cardDeck)
    return cardDeck

class Player:  # define player class
    def __init__(self, nickname='Player', bankroll=100, value=0):
        self.nick = nickname
        self.bankroll = int(bankroll)
        self.value = value
        self.BetKind = ''
        self.amount = 0

    def __str__(self):
        return self.nick + ' plays'

    def win(self):

        self.bankroll += 2 * int(self.amount)

    def MassBet(self):

        for i in range(1000):
            self.amount = int(specialInput('how much do you want to bet? '))
            if self.amount <= self.bankroll:
                break
            else:
                print('You can bet only your current bank!')
        for i in range(1000):
            self.BetKind = specialInput('higher/lower [h/l] ')
            if self.BetKind == 'h' or self.BetKind == 'l':
                break
            else:
                print("Please enter only 'h' or 'l' ")
        self.bankroll -= int(self.amount)

    def GetValue(self, card):
        self.value = Values[card[0:-1]]

Deck = cardDeck()
Values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,
          '8': 8, '9': 9, '10': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14}  # define value of each card

PlayerList = []
NPlayers = int(specialInput('How many players are going to play? '))  # Here you can define players
for i in range(NPlayers):
    print('Inicialization, player ', i + 1)
    nickname = specialInput('What is your nickname? ')
    bankroll = specialInput('What is your bank? ')
    player = Player(nickname, bankroll)
    PlayerList.append(player)

oldCardsValues = [Deck[-1]]
Deck.pop()
print(Deck[45:])
round = 0
while True:
    print('You bet againts: ', oldCardsValues[-1])
    for player in PlayerList:  # define kind of the bet for each player
        print(player.nick + ', ', end='')
        player.MassBet()
    DrawCard = Deck.pop()
    if NPlayers == 1:
        print('You draw: ', DrawCard)
    else:
        print('All players bet! Draw is: ', DrawCard)
    for player in PlayerList:  # define if player won or lost
        player.GetValue(DrawCard)
        if player.BetKind == 'l':
            if Values[oldCardsValues[-1][0:-1]] > player.value:
                player.win()
                print(player.nick, 'won! New bankroll: ', player.bankroll)
            elif Values[oldCardsValues[-1][0:-1]] < player.value:
                print(player.nick, 'lost! New bankroll: ', player.bankroll)
            else:
                print('Same card', player.nick, 'lost')
        elif player.BetKind == 'h':
            if Values[oldCardsValues[-1][0:-1]] < player.value:
                player.win()
                print(player.nick, 'won! New bankroll: ', player.bankroll)
            elif Values[oldCardsValues[-1][0:-1]] > player.value:
                print(player.nick, 'lost! New bankroll: ', player.bankroll)
            else:
                print('Same card', player.nick, 'lost')
        print(player.bankroll)
        if player.bankroll <= 0:  # if player run out of cash he is out
            print(player.nick, 'I am sorry, you run out of your cash. You are out.')
            PlayerList.remove(player)
    if len(PlayerList) == 0:  # if there are no remaining players game is over
        print('No more players left. Game Over!')
        break

    round += 1
    print('current deck len: ', len(Deck), 'current round: ', round)
    MixCoeficcient = randrange(25, 35)
    if len(Deck) < MixCoeficcient:  # create new deck in random interval of the remaining cards
        Deck = cardDeck()

    oldCardsValues.append(DrawCard)
    print('-' * 40)

Un petit retour d'expérience : Vous pourriez imprimer la bankroll des joueurs à chaque fois qu'ils misent, afin qu'ils sachent avec quel montant ils doivent composer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X