Ich versuche, ein einfaches Blackjack-Spiel zu erstellen. Ich verwende GIST, weil die Verwendung des Codebeispiels ewig dauert.
Aktueller Code:
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")
Neu (ist mein Blackjack-Programmcode so weit mit Klassen):
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))
Ich suche nach Ratschlägen für Anfänger, wie oder wo ich mit meinem Prozess zur Ausarbeitung meiner Funktionen / meines Codes in Klassen beginnen soll. Mein ursprünglicher Code funktioniert für das, was er tut, aber ich habe das Gefühl, dass er zu viel manuellen Code enthält, und ich möchte einige Tipps / Ratschläge, wie Sie von hier aus vorgehen können.
Kommentare
- Okay, ich habe es behoben.
- Möchten Sie, dass wir Ihren Code überprüfen (der noch nicht fertig ist) oder Ihnen nur helfen, das Skelett (Hilfe, um den richtigen Ansatz zu finden) Ihres Spiels zu erstellen ?
- Hilfe, um den richtigen Ansatz zu finden, wäre großartig, oder wenn Sie etwas bemerken, das ich definitiv nicht tun sollte, wäre es auch gut, darauf hinzuweisen 🙂
- Ich denke Sie müssen unbedingt die Dokumentation darüber lesen, wie Klassen in Python funktionieren. Zum Beispiel würden Sie selten freistehenden Code haben, wie er in der Deck-Klasse zu sehen ist. Sie würden ihn entweder in die Funktion
__init__
oder unter eine andere Funktion - setzen Bedeutet dies also, dass Sie ‚ überhaupt keine Klassen dafür verwenden können?
Antwort
Sehen wir uns Ihre Card
-Klasse an.
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"]
Es gibt mehrere Designfehler.
1. Die Karte sollte ihren Wert nicht bewerten, da ein Wert der Karte vom Spiel definiert wird. Wenn Sie diese Klasse beispielsweise für Poker wiederverwenden möchten, müssen Sie eine untergeordnete Klasse für die Karte erstellen, um ihren Wert für ein anderes Spiel zu bewerten, was falsch ist.
2. In Ihrem Fall kennt die Kartenklasse Anzüge und Ränge, was meiner Meinung nach auch eine falsche Lösung ist, da Sie möglicherweise ein anderes Deck als verwenden für Französisch.
Aufgrund der ersten beiden Probleme stellt sich heraus, dass Ihre Karte nur ein Container (eine Struktur) ohne Logik ist. Dies ist eines der besten Dinge, die Sie in Python in namedtuple
from collections import namedtuple Card = namedtuple("Card", ("rank", "suit"))
Lassen Sie uns nun über 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 ist definitiv kein Card
Kind, Deck
ist sortiert der Kartensammlung.
2. Ihre Methoden new_card
und remove_card
sollten zu einer einzigen Methode namens draw_card
.
3. Seitdem wissen wir, dass Deck
ist kein Card
, dann ist Deck
der am besten geeignete Ort, um Ränge und Anzüge im Auge zu behalten. Hier ein Beispiel:
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()
Spielklasse
Jetzt sollten Dinge wie play_game, card_value (hand_value?) und andere Dinge / Regeln, die sich auf ein bestimmtes Spiel beziehen, durch 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
Am Ende haben wir also als Spielskelett Folgendes:
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
Kommentare
- Tut mir leid, dass ich keine Gelegenheit hatte, darauf zu antworten. Die Internetverbindung von zu Hause aus war unterbrochen. ~ Dies gibt mir einige wundervolle Tipps und ein Skelett zum Anschauen und Abarbeiten. Danke So viel!
Antwort
Wenn Sie „stehen“, erfahren Sie, dass der Händler eine andere Karte hat, dann trifft er / steht, dann darfst du schlagen oder stehen, das ist kein Blackjack, du musst den anderen Treffer / stehen lassen, nachdem der Dealer seine / ihre Hand offenbart hat.