Jeg prøver at skabe et simpelt blackjack-spil. Jeg bruger GIST, fordi kodeeksemplet tager for evigt at bruge.
Nuvæ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 min Blackjack-programkode så langt ved hjælp af 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 leder efter nybegynderråd om, hvordan eller hvor jeg skal starte med min proces med at udarbejde mine funktioner / kode i klasser. Min originale kode fungerer efter hvad den gør, men jeg føler, at den har for meget manuel kode, og jeg vil gerne have nogle tip / råd om, hvor man kan gå herfra.
Kommentarer
- okay jeg fikset det
- vil du have os til at gennemgå din kode (som endnu ikke er færdig) eller bare hjælpe dig med at opbygge skelet (hjælp til at finde den rette tilgang) til dit spil ?
- hjælp til at finde den rigtige tilgang ville være fantastisk, eller hvis du bemærker noget, som jeg bestemt ikke skulle gøre, ville det også være godt at påpege 🙂
- du skal virkelig læse dokumentationen om, hvordan klasser i python fungerer. For eksempel ville du sjældent nogensinde have en fritstående kode som set i klassen Deck, du ville enten placere den i
__init__
-funktionen eller under en anden funktion - Så betyder det, at du slet ikke kunne ‘ bruge klasser til dette?
Svar
Lad os se på din 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"]
Der er flere designfejl.
1. Kortet bør ikke evaluere dets værdi, da en kortværdi defineret af spillet. Grundlæggende, hvis du gerne vil genbruge denne klasse til at sige Poker, bliver du nødt til at oprette et barneklasse til kortet bare for at evaluere dets værdi for et andet spil, hvilket er forkert.
2. I dit tilfælde ved Card-klasse om dragter og rækker, hvilket også efter min mening er en forkert løsning, da du muligvis bruger et andet kort bortset fra for fransk.
Så som et resultat af de første 2 problemer viser det sig, at dit kort kun er en container (struktur) uden nogen logik indeni, en af de bedste ting at bruge til det i python i namedtuple
from collections import namedtuple Card = namedtuple("Card", ("rank", "suit"))
Lad os nu tale 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 bestemt ikke et Card
barn, Deck
er sort af kortindsamling.
2. Dine new_card
og remove_card
metoder skal kombineres til en enkelt kaldet draw_card
.
3. Siden nu ved vi, at Deck
er ikke Card
, så det mest rigtige sted at holde styr på rækker og dragter er 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()
Spilklasse
Nu skal ting som play_game, card_value (hand_value?) og andre ting / regler relateret til specifikt spil defineres af Game
klasse
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 sidste ende har vi som et spilskelet 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
- Undskyld, jeg har ikke haft en chance for at svare på dette, internetforbindelsen fra mit hjem var nede ~ Dette vil give mig nogle vidunderlige tip og et skelet at se på og arbejde ud af, tak så meget!
Svar
Når du “står”, fortæller det dig forhandlerens andet kort, så rammer han / står, så kommer du til at slå eller stå, det er ikke blackjack, du skal tage det andet hit / stand ud, når dealeren har afsløret sin hånd.