Jessaie de créer un jeu de Blackjack simple. Jutilise GIST parce que lexemple de code prend une éternité à utiliser.
Code actuel:
from random import randint def card_deck(): #sets the card types and values card_value = ["Ace","2","3","4","5","6","7","8","9","10","J","Q","K"] card_type = ["Hearts","Spades","Clubs","Diamonds"] deck = [] #This iterates all 52 cards into a deck for i in card_type: for j in card_value: deck.append(j + " of " + i) return deck def card_value(card): #only reading first slice to determine value of the card if card[:1] in ("J","Q","K","1"): return int(10) elif card[:1] in ("2","3","4","5","6","7","8","9"): #card[:1] example "2" out of the full "2 of Hearts" string return int(card[:1]) elif card[:1] == "A": print ("\n"+ str(card)) num = input("Do you want this to be 1 or 11?\n>") while num !="1" or num !="11": if num == "1": return int(1) elif num == "11": return int(11) else: num = input("Do you want this to be 1 or 11?\n>") def new_card(deck): return deck[randint(0,len(deck)-1)] def remove_card(deck,card): return deck.remove(card) play_again = "" while play_again != "EXIT": #deck creation, card creation, card removal from deck, values and totals new_deck = card_deck() card1 = new_card(new_deck) remove_card(new_deck,card1) card2 = new_card(new_deck) remove_card(new_deck,card2) print ("\n\n\n\n" + card1 + " and " + card2) #doing this statement first allows for selection between 1 and 11 valu1 = card_value(card1) valu2 = card_value(card2) total = valu1 + valu2 print("with a total of " + str(total) ) #dealer"s hand dealer_card1 = new_card(new_deck) remove_card(new_deck,dealer_card1) dealer_card2 = new_card(new_deck) remove_card(new_deck,dealer_card2) dealer_value1 = card_value(dealer_card1) dealer_value2 = card_value(dealer_card1) dealer_total = dealer_value1 + dealer_value2 print ("\nThe Dealer smiles as he looks at you and\n deals one card up and one card face down") print ("First a " + dealer_card1 + " and face down card.") if total == 21: print("Blackjack!") else: while total < 21: #not win or loss yet answer = input("Would you like to hit or stand?\n> ") if answer.lower() == "hit": #more card creation, removal, and value added to total more_card = new_card(new_deck) remove_card(new_deck,more_card) more_value = card_value(more_card) total += int(more_value) print (more_card + " for a new total of " + str(total)) if total > 21: #lose condition print("You LOSE!") play_again = input("Would you like to continue? EXIT to leave\n") elif total == 21: #winning condition print("You WIN BIG WIN WOO WOO") play_again = input("Would you like to continue? EXIT to leave\n") else: continue elif answer.lower() == "stand": print("The dealer nods and reveals his other card to be ") print("a " + dealer_card2 + " for a total of " + str(dealer_total)) if dealer_total < 17: print("The Dealer hits again.") dealer_more = new_card(new_deck) more_dealer_value = card_value(dealer_more) print("The card is a " + str(dealer_more)) dealer_total += int(more_dealer_value) if dealer_total > 21 and total <=21: print("Dealer Bust! You win!") elif dealer_total < 21 and dealer_total > total: print("Dealer has " + str(dealer_total) + " You lose!") else: continue elif dealer_total == total: print("Equal Deals, no winner") elif dealer_total < total: print("You win!") else: print("You Lose!") play_again = input("\nWould you like to continue? EXIT to leave\n") break print("Thank you for Playing")
Nouveau (mon code de programme de Blackjack est-il donc loin en utilisant des classes):
from random import randint class Card: def __init__(self): pass def card_value(self): pass card_face = ["Ace","2","3","4","5","6","7","8","9","10","J","Q","K"] card_suit = ["Hearts","Spades","Clubs","Diamonds"] class Deck(Card): new_deck = [] length = len(new_deck) #testing purposes for i in Card.card_suit: for j in Card.card_face: new_deck.append(j + " of " + i) def new_card(self): #instead of return, use yield? return (self.new_deck[randint(0,len(self.new_deck)-1)]) def remove_card(self,card): self.new_deck.remove(card) deck1 = Deck() card1 = deck1.new_card() deck1.remove_card(card1) card2 = deck1.new_card() deck1.remove_card(card2) print(str(card1) + " and " + str(card2)) print(len(deck1.new_deck))
Je recherche des conseils pour débutants sur comment ou par où commencer mon processus pour étoffer mes fonctions / code en classes. Mon code dorigine fonctionne pour ce quil fait, mais jestime quil contient trop de code manuel et jaimerais avoir quelques astuces / conseils sur où aller à partir dici.
Commentaires
Réponse
Regardons votre classe Card
.
class Card: def __init__(self): pass def card_value(self): pass card_face = ["Ace","2","3","4","5","6","7","8","9","10","J","Q","K"] card_suit = ["Hearts","Spades","Clubs","Diamonds"]
Il y a plusieurs erreurs de conception.
1. La carte ne doit pas évaluer sa valeur, puisquune valeur de carte définie par le jeu. Fondamentalement, si vous souhaitez réutiliser cette classe pour, par exemple, le poker, vous devrez créer une classe enfant pour la carte juste pour évaluer sa valeur pour un jeu différent, ce qui est faux.
2. Dans votre cas, la classe de cartes connaît les costumes et les rangs, ce qui est également à mon avis une mauvaise solution, car vous pouvez utiliser nimporte quel autre deck sauf pour le français.
Donc, à la suite des 2 premiers problèmes, il savère que votre carte nest quun conteneur (structure) sans aucune logique à lintérieur, lune des meilleures choses à utiliser pour cela en python dans namedtuple
from collections import namedtuple Card = namedtuple("Card", ("rank", "suit"))
Parlons maintenant de Deck
class Deck(Card): new_deck = [] length = len(new_deck) #testing purposes for i in Card.card_suit: for j in Card.card_face: new_deck.append(j + " of " + i) def new_card(self): #instead of return, use yield? return (self.new_deck[randint(0,len(self.new_deck)-1)]) def remove_card(self,card): self.new_deck.remove(card)
1. Deck nest certainement pas un Card
enfant, Deck
est un tri de la collection de cartes.
2. Vos méthodes new_card
et remove_card
doivent être combinées en une seule, appelée draw_card
.
3. Depuis, nous savons que Deck
nest pas un Card
alors le meilleur endroit pour garder une trace des rangs et des costumes est Deck
. Voici un exemple:
class Deck: card_ranks = [] card_suits = [] def __init__(self): self.cards = [] self.refresh_deck() def refresh_deck(self): self.cards = list(map(Card, product(self.card_ranks, self.card_suits))) def shuffle(self): shuffle(self.cards) def draw_card(self): return self.cards.pop()
Classe de jeu
Désormais, des éléments comme play_game, card_value (hand_value?) et dautres choses / règles liées à un jeu spécifique doivent être définis par Game
class
class Game: def __init__(self, deck): raise NotImplementedError def card_value(self, card): raise NotImplementedError def hand_value(self, hand): raise NotImplementedError def play(self): raise NotImplementedError
Donc, à la fin, ce que nous avons comme squelette du jeu est le suivant:
from collections import namedtuple from itertools import product from random import shuffle from typing import List Card = namedtuple("Card", ("rank", "suit")) class Deck: card_ranks = [] card_suits = [] def __init__(self) -> None: self.cards = [] self.refresh_deck() def refresh_deck(self) -> int: self.cards = map(Card, product(self.card_ranks, self.card_suits)) def shuffle(self) -> None: shuffle(self.cards) def draw_card(self) -> Card: return self.cards.pop() class FrenchDeck(Deck): card_ranks = ["Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] card_suits = ["Hearts", "Spades", "Clubs", "Diamonds"] class Game: def __init__(self, deck: Deck) -> None: raise NotImplementedError def card_value(self, card: Card) -> int: raise NotImplementedError def hand_value(self, hand: List[Card]) -> int: raise NotImplementedError def play(self) -> None: raise NotImplementedError
Commentaires
- Désolé, je nai pas eu loccasion de répondre à cela, la connexion Internet de chez moi était coupée ~ Cela me donnera de merveilleux conseils et un squelette à regarder et à travailler, merci tellement!
Réponse
Quand vous « vous tenez », il vous indique lautre carte du croupier, puis il frappe / se tient, alors vous arrivez à frapper ou rester debout, ce nest pas du blackjack, vous devez retirer lautre hit / stand après que le croupier révèle sa main.
__init__
, soit sous une fonction différente