Enkelt blackjack-spill i Python

Jeg prøver å lage et enkelt blackjack-spill. Jeg bruker GIST fordi kodeeksemplet tar evig tid å bruke.

Nåværende kode:

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 (er Blackjack-programkoden min så langt bruker 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)) 

Jeg leter etter råd om nybegynnere om hvordan eller hvor jeg skal begynne med prosessen min med å utarbeide funksjonene / koden min i klasser. Den opprinnelige koden min fungerer for det den gjør, men jeg føler at den har for mye manuell kode, og jeg vil gjerne ha noen tips / råd om hvor du kan gå herfra.

Kommentarer

  • ok jeg fikset det
  • vil du at vi skal gjennomgå koden din (som ikke er ferdig ennå) eller bare hjelpe deg med å bygge skjelett (hjelp til å finne riktig tilnærming) av spillet ditt ?
  • hjelp til å finne den rette tilnærmingen ville være bra, eller hvis du merker noe som jeg absolutt ikke burde gjøre, vil det være greit å påpeke det også 🙂
  • du trenger virkelig å lese dokumentasjonen om hvordan klasser i python fungerer. For eksempel vil du sjelden noen gang ha frittstående kode som du ser i Deck-klassen, du vil enten sette den i __init__ -funksjonen eller under en annen funksjon
  • Så betyr dette at du ikke kunne bruke ‘ i det hele tatt?

Svar

La oss se på Card -klassen.

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 er flere designfeil.

1. Kortet bør ikke evaluere verdien, siden en verdi av kortet er definert av spillet. I utgangspunktet, hvis du ønsker å gjenbruke denne klassen til å si Poker, må du opprette en barneklasse for kortet bare for å evaluere verdien for et annet spill, noe som er galt.

2. I ditt tilfelle kjenner Card-klasse til dresser og ranger, noe som også etter min mening er feil løsning, siden du kanskje bruker et annet kortstykke bortsett fra for fransk.

Så som et resultat av de første to problemene viser det seg at kortet ditt bare er en beholder (struktur) uten logikk inni, en av de beste tingene du kan bruke til det i python i namedtuple

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

La oss nå snakke 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. Deck er definitivt ikke et Card barn, Deck er sort av samlingen av kort.

2. new_card og remove_card -metodene dine bør kombineres til en enkelt kalt draw_card.

3. Siden nå vet vi at Deck er ikke Card, så er det mest rette stedet å holde styr på ranger og dresser Deck. Her er eksempel:

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

Spillklasse

Nå skal ting som play_game, card_value (hand_value?) og andre ting / regler knyttet til spesifikt spill defineres 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å til slutt det vi har som et spillskjelett er dette:

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

  • Beklager at jeg ikke har hatt en sjanse til å svare på dette, internettforbindelsen fra hjemmet mitt var nede ~ Dette vil gi meg noen fantastiske tips og et skjelett å se på og jobbe med, takk så mye!

Svar

Når du «står», forteller den deg forhandlerens andre kort, så treffer han / står, så får du treffe eller stå, det er ikke blackjack, du må ta ut det andre treffet / standen etter at dealeren avslører hånden.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *