Încerc să creez un joc simplu de Blackjack. Folosesc GIST, deoarece eșantionul de cod durează pentru totdeauna.
Codul curent:
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")
Nou (codul programului meu de Blackjack este deci folosind clasele):
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))
Caut sfaturi pentru începători cu privire la modul sau de unde să încep cu procesul meu de completare a funcțiilor / codului meu în clase. Codul meu original funcționează pentru ceea ce face, dar consider că are prea mult cod manual și aș dori câteva sfaturi / sfaturi despre unde să merg de aici.
Comentarii
- bine am remediat-o
- doriți să vă examinăm codul (care nu este încă terminat) sau doar să vă ajutăm să construiți scheletul (ajută la găsirea unei abordări corecte) a jocului dvs. ?
- ajutor pentru a găsi abordarea corectă ar fi grozav sau dacă observați ceva ce cu siguranță nu ar trebui să fac, ar fi bine să subliniez și 🙂 🙂
- Cred că chiar trebuie să citiți documentația despre modul în care funcționează clasele din python. De exemplu, rar ai avea vreodată un cod permanent, așa cum se vede în clasa Deck, fie l-ai pune în funcția
__init__
, fie sub o altă funcție - Deci, înseamnă că nu puteți ‘ să utilizați deloc clasele pentru acest lucru?
Răspunde
Să ne uităm la clasa dvs. Card
.
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"]
Există mai multe greșeli de proiectare.
1. Cardul nu trebuie să evalueze valoarea acestuia, deoarece o valoare a cărții este definită de joc. Practic, dacă doriți să reutilizați această clasă pentru a spune Poker, ar trebui să creați o clasă copil pentru Card doar pentru a evalua valoarea sa pentru un alt joc, ceea ce este greșit.
2. În cazul dvs., clasa de cărți știe despre costume și ranguri, ceea ce este, de asemenea, o soluție greșită în opinia mea, deoarece puteți utiliza orice alt pachet, cu excepția pentru franceză.
Deci, ca urmare a primelor 2 probleme, se dovedește că Cardul dvs. este doar un container (structură) fără logici în interior, unul dintre cele mai bune lucruri de utilizat pentru asta în Python în namedtuple
from collections import namedtuple Card = namedtuple("Card", ("rank", "suit"))
Acum să vorbim despre 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 nu este cu siguranță un Card
copil, Deck
este sort de colecție de cărți.
2. Metodele dvs. new_card
și remove_card
trebuie combinate într-una singură numită draw_card
.
3. De acum știm că Deck
nu este un Card
atunci cel mai potrivit loc pentru a ține evidența rangurilor și a costumelor este Deck
. Iată un exemplu:
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()
Clasa de joc
Acum lucruri precum play_game, card_value (hand_value?) și alte lucruri / reguli legate de un anumit joc ar trebui să fie definite de 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
Deci, la final, ceea ce avem ca schelet de joc este acesta:
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
Comentarii
- Îmi pare rău că nu am avut șansa de a răspunde la acest lucru, conexiunea la internet de la mine acasă nu a funcționat ~ Acest lucru îmi va oferi câteva sfaturi minunate și un schelet de care să mă uit și să lucrez, mulțumesc atât de mult!
Răspuns
Când „stai” îți spune dealerilor alte cărți, apoi lovește / stă, apoi ajungi să lovești sau să stai, care nu este blackjack, trebuie să scoți celălalt hit / stand după ce dealerul își dezvăluie mâna.