Juego de Blackjack simple en Python

Estoy tratando de crear un juego de Blackjack simple. Estoy usando GIST porque el código de muestra tarda una eternidad en usarse.

Código actual:

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

Nuevo (es mi código de programa de Blackjack clases de uso lejano):

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

Estoy buscando un consejo para principiantes sobre cómo o dónde comenzar con mi proceso para desarrollar mis funciones / código en clases. Mi código original funciona para lo que hace, pero siento que tiene demasiado código manual y me gustaría algunos consejos / sugerencias sobre a dónde ir desde aquí.

Comentarios

  • está bien, lo arreglé
  • ¿quieres que revisemos tu código (que aún no está terminado) o simplemente te ayudemos a construir el esqueleto (ayuda para encontrar el enfoque correcto) de tu juego? ?
  • Ayudar a encontrar el enfoque correcto sería genial o si nota algo que definitivamente no debería estar haciendo, sería bueno señalarlo también 🙂
  • Creo Realmente necesitas leer la documentación sobre cómo funcionan las clases en Python. Por ejemplo, rara vez tendría un código independiente como se ve en la clase Deck, lo colocaría en la función __init__ o en una función diferente
  • Entonces, ¿esto significa que no podría ‘ t usar clases para esto en absoluto?

Responder

Veamos tu Card clase.

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

Hay varios errores de diseño.

1. La carta no debe evaluar su valor, ya que es un valor de carta definido por el juego. Básicamente, si desea reutilizar esta clase para, por ejemplo, póquer, tendrá que crear una clase secundaria para la tarjeta solo para evaluar su valor para un juego diferente, lo cual es incorrecto.

2. En tu caso, la clase de cartas conoce los palos y los rangos, lo que también es, en mi opinión, una solución incorrecta, ya que podrías usar cualquier otro mazo excepto para francés.

Entonces, como resultado de los primeros 2 problemas, resulta que su Tarjeta es solo un contenedor (estructura) sin ninguna lógica en su interior, una de las mejores cosas para usar para eso en Python en namedtuple

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

Ahora hablemos de 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 definitivamente no es un Card secundario, Deck es un de colección de tarjetas.

2. Tus métodos new_card y remove_card deben combinarse en uno solo llamado draw_card.

3. Desde ahora sabemos que Deck no es un Card, entonces el lugar más adecuado para realizar un seguimiento de los rangos y trajes es Deck. Aquí hay un ejemplo:

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

Clase de juego

Ahora cosas como play_game, card_value (hand_value?) y otras cosas / reglas relacionadas con un juego específico deben ser definidas por 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 

Entonces, al final, lo que tenemos como esqueleto del juego es esto:

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 

Comentarios

  • Lo siento, no he tenido la oportunidad de responder a esto, la conexión a Internet de mi casa no funcionaba ~ Esto me dará algunos consejos maravillosos y un esqueleto para mirar y trabajar, gracias ¡tanto!

Responder

Cuando te «planeas», te dice otra carta del crupier, y luego / se planta, luego usted puede pedir o plantarse, eso no es blackjack, debe eliminar el otro golpe / plantarse después de que el crupier muestre su mano.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *