Eenvoudig Blackjack-spel in Python

Ik probeer een eenvoudig Blackjack-spel te maken. Ik gebruik GIST omdat het gebruik van het codevoorbeeld een eeuwigheid duurt.

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

Nieuw (is mijn Blackjack-programmacode zo veel gebruikmakend van 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)) 

Ik ben op zoek naar advies voor beginners over hoe en waar ik moet beginnen met mijn proces om mijn functies / code in klassen uit te werken. Mijn originele code werkt voor wat het doet, maar ik vind dat het te veel handmatige code bevat en ik zou graag wat tips / advies willen over waar ik heen kan.

Opmerkingen

  • oké, ik heb het gerepareerd
  • wil je dat we je code herzien (die nog niet af is) of je gewoon helpen met het bouwen van skelet (hulp bij het vinden van de juiste aanpak) van je spel ?
  • hulp bij het vinden van de juiste aanpak zou geweldig zijn of als je iets opmerkt dat ik absoluut niet zou moeten doen, zou dat ook goed zijn om erop te wijzen 🙂
  • Ik denk je moet echt de documentatie lezen over hoe klassen in python werken. U zou bijvoorbeeld zelden een vrijstaande code hebben, zoals te zien is in de Deck-klasse, u zou deze ofwel in de __init__ -functie of onder een andere functie plaatsen
  • Betekent dit dus dat je ‘ helemaal geen klassen hiervoor kunt gebruiken?

Antwoord

Laten we eens kijken naar uw Card -klasse.

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

Er zijn meerdere ontwerpfouten.

1. De kaart mag de waarde ervan niet evalueren, aangezien de waarde van de kaart wordt gedefinieerd door het spel. Kortom, als je deze klasse opnieuw zou willen gebruiken voor bijvoorbeeld poker, zou je een kinderklasse voor de kaart moeten maken om de waarde voor een ander spel te evalueren, wat niet klopt.

2. In jouw geval weet de kaartklasse over kleuren en rangen, wat naar mijn mening ook een verkeerde oplossing is, aangezien je een ander kaartspel zou kunnen gebruiken behalve voor Frans.

Dus als resultaat van de eerste 2 problemen, blijkt dat je kaart slechts een container (structuur) is zonder enige logica erin, een van de beste dingen om daarvoor te gebruiken in python in namedtuple

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

Laten we het nu hebben over 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 is zeker geen Card kind, Deck is sort van een verzameling kaarten.

2. Uw new_card en remove_card -methoden moeten worden gecombineerd tot een enkele methode genaamd draw_card.

3. Sinds nu weten we dat Deck is geen Card, dan is Deck de meest juiste plaats om rangen en kleuren bij te houden. Hier is een voorbeeld:

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

Spelklasse

Dingen zoals play_game, card_value (hand_value?) en andere dingen / regels met betrekking tot een specifiek spel moeten worden gedefinieerd door 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 

Dus wat we uiteindelijk hebben als spelskelet is dit:

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 

Reacties

  • Sorry dat ik niet de kans heb gehad om hierop te reageren, de internetverbinding van mijn huis was verbroken ~ Dit geeft me een aantal geweldige tips en een skelet om naar te kijken en aan te werken, bedankt zo veel!

Antwoord

Als je “stand” geeft, vertelt het je de andere kaart van de dealer, en dan slaat hij / staat, dan mag je slaan of passen, dat is geen blackjack, je moet de andere hit / stand uitschakelen nadat de dealer zijn / haar hand heeft onthuld.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *