Semplice gioco di Blackjack in Python

Sto cercando di creare un semplice gioco di Blackjack. Sto usando GIST perché il codice di esempio impiega uneternità per essere utilizzato.

Codice corrente:

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

Nuovo (è il mio codice del programma Blackjack quindi lontano usando le classi):

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

Sto cercando consigli per principianti su come o dove iniziare con il mio processo per arricchire le mie funzioni / codice in classi. Il mio codice originale funziona per quello che fa, ma sento che ha troppo codice manuale e vorrei alcuni suggerimenti / consigli su dove andare da qui.

Commenti

  • ok ho risolto
  • vuoi che rivediamo il tuo codice (che non è ancora finito) o ti aiuti semplicemente a costruire lo scheletro (aiuta a trovare lapproccio giusto) del tuo gioco ?
  • aiutare a trovare lapproccio giusto sarebbe fantastico o se noti qualcosa che sicuramente non dovrei fare, sarebbe bene sottolinearlo 🙂
  • Penso hai davvero bisogno di leggere la documentazione su come funzionano le classi in python. Ad esempio, raramente avresti mai codice indipendente come visto nella classe Deck, lo metteresti nella funzione __init__ o in una funzione diversa
  • Quindi questo significa che non potresti ‘ usare classi per questo?

Risposta

Diamo “unocchiata alla tua Card classe.

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

Sono presenti più errori di progettazione.

1. La carta non dovrebbe valutarne il valore, poiché è un valore della carta definito dal gioco. Fondamentalmente, se desideri riutilizzare questa classe per dire Poker, dovresti creare una classe figlia per la Carta solo per valutarne il valore per un gioco diverso, il che è sbagliato.

2. Nel tuo caso, la classe di carte conosce semi e gradi, che è anche a mio parere una soluzione sbagliata, dato che potresti usare qualsiasi altro mazzo tranne per il francese.

Quindi, come risultato dei primi 2 problemi, si scopre che la tua Card è solo un contenitore (struttura) senza alcuna logica allinterno, una delle cose migliori da usare per quello in python in namedtuple

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

Ora parliamo di 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. Il mazzo non è sicuramente un Card figlio, Deck è ordinato di raccolta di carte.

2. I tuoi metodi new_card e remove_card devono essere combinati in uno unico chiamato draw_card.

3. Da ora sappiamo che Deck non è un Card quindi il posto più giusto per tenere traccia di gradi e semi è Deck. Ecco un esempio:

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

Classe di gioco

Ora cose come play_game, card_value (hand_value?) e altre cose / regole relative a un gioco specifico dovrebbero essere definite dalla 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 

Quindi, alla fine, quello che abbiamo come scheletro del gioco è questo:

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 

Commenti

  • Scusa se non ho avuto la possibilità di rispondere, la connessione Internet da casa mia era interrotta ~ Questo mi darà alcuni suggerimenti meravigliosi e uno scheletro da guardare e lavorare, grazie così tanto!

Rispondi

Quando “stai” ti dice che il dealer ha laltra carta, poi colpisce / sta, poi puoi chiedere carta o stare, questo non è blackjack, devi eliminare laltra carta / stare dopo che il banco ha rivelato la sua mano.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *