Enkelt blackjack-spel i Python

Jag försöker skapa ett enkelt blackjack-spel. Jag använder GIST eftersom kodprovet tar evigt att använda.

Aktuell kod:

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") 

Ny (är min Blackjack-programkod så långt med klasser):

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)) 

Jag letar efter råd för nybörjare om hur eller var jag ska börja med min process för att utarbeta mina funktioner / kod i klasser. Min ursprungliga kod fungerar för vad den gör, men jag tycker att den har för mycket manuell kod och jag skulle vilja ha några tips / råd om vart jag ska gå härifrån.

Kommentarer

  • okej jag fixade det
  • vill du att vi granskar din kod (som inte är klar än) eller bara hjälper dig att bygga skelett (hjälp för att hitta rätt tillvägagångssätt) för ditt spel ?
  • hjälp för att hitta rätt tillvägagångssätt skulle vara bra eller om du märker något som jag definitivt inte borde göra, skulle det vara bra att påpeka också 🙂
  • Jag tror du behöver verkligen läsa dokumentationen om hur klasser i python fungerar. Till exempel skulle du sällan någonsin ha fristående kod som ses i Deck-klassen, du skulle antingen lägga den i __init__ -funktionen eller under en annan funktion
  • Så betyder det att du inte kunde ’ inte alls använda klasser för detta?

Svar

Låt oss titta på din Card -klass.

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"] 

Det finns flera designfel.

1. Kortet bör inte utvärdera det, eftersom ett kortvärde definieras av spelet. I grund och botten, om du vill återanvända den här klassen för att säga poker, måste du skapa en barnklass för kortet bara för att utvärdera dess värde för ett annat spel, vilket är fel.

2. I ditt fall känner Card-klassen till kostymer och rangordningar, vilket enligt min mening också är fel lösning, eftersom du kanske använder något annat kort utom för franska.

Så som ett resultat av de två första problemen visar det sig att ditt kort bara är en behållare (struktur) utan logik inuti, en av de bästa sakerna att använda för det i python i namedtuple

from collections import namedtuple Card = namedtuple("Card", ("rank", "suit")) 

Låt oss nu prata om 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. Däck är definitivt inte ett Card barn, Deck är sort av kortsamlingen.

2. Dina new_card och remove_card metoder bör kombineras till en enda som heter draw_card.

3. Sedan nu vet vi att Deck är inte en Card, då är det mest rätta stället att hålla koll på rankningar och kostymer Deck. Här är exempel:

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() 

Spelklass

Nu bör saker som play_game, card_value (hand_value?) och andra saker / regler relaterade till specifikt spel definieras av 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 

Så i slutändan har vi som ett spelskelett detta:

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 

Kommentarer

  • Tyvärr har jag inte haft en chans att svara på detta, internetanslutningen från mitt hem var nere ~ Detta kommer att ge mig några underbara tips och ett skelett att titta på och arbeta med, tack så mycket!

Svar

När du ”står” berättar det för återförsäljarnas andra kort, då slår han / står, då får du slå eller stå, det är inte blackjack, du måste ta ut den andra träffen / stå efter att dealern avslöjar sin hand.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *