Python의 간단한 블랙 잭 게임

간단한 블랙 잭 게임을 만들려고합니다. 코드 샘플을 사용하는 데 시간이 오래 걸리기 때문에 GIST를 사용하고 있습니다.

현재 코드 :

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

신규 (블랙 잭 프로그램 코드이므로 클래스 사용) :

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

함수 / 코드를 클래스로 구체화하는 프로세스를 시작하는 방법과 위치에 대한 초보자 조언을 찾고 있습니다. 내 원래 코드는 작동하지만 수동 코드가 너무 많고 여기에서 어디로 가야할지에 대한 팁 / 조언이 필요합니다.

댓글

  • 알겠습니다. 수정했습니다
  • 코드를 검토 (아직 완료되지 않음)하거나 게임의 골격을 구축 (올바른 접근 방식을 찾는 데 도움)하는 데 도움을 주길 원하십니까? ?
  • 올바른 접근 방식을 찾는 데 도움이되는 것이 좋을 것입니다. 아니면 제가하지 말아야 할 일을 발견했다면 그 점도 지적하는 것이 좋습니다. 🙂
  • 제 생각에는 파이썬의 클래스가 어떻게 작동하는지에 대한 문서를 읽어야합니다. 예를 들어, Deck 클래스에서 볼 수있는 독립 코드가 거의 없을 것입니다. __init__ 함수에 넣거나 다른 함수에 넣습니다
  • 그렇다면 ‘이 클래스를 전혀 사용할 수 없다는 의미입니까?

Answer

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

여러 설계 실수가 있습니다.

1. 카드는 게임에 의해 정의 된 카드의 가치이므로 카드의 가치를 평가해서는 안됩니다. 기본적으로 포커를 위해이 클래스를 재사용하려면 다른 게임에 대한 가치를 평가하기 위해 카드에 대한 하위 클래스를 만들어야하는데, 이는 잘못된 것입니다.

2. 귀하의 경우 카드 클래스는 정장과 랭크에 대해 알고 있습니다. 이는 제 생각에는 잘못된 해결책입니다. 프랑스어를 위해.

첫 두 문제의 결과로, 카드는 내부에 로직이없는 컨테이너 (구조) 일 뿐이며 namedtuple

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

이제

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. 덱은 확실히 Card 하위가 아니며 Deck는 정렬입니다. 카드 컬렉션.

2. new_cardremove_card 메소드는 draw_card.

3. 지금부터 우리는 DeckCard가 아니므로 순위와 수트를 추적하기에 가장 적합한 장소는 Deck입니다. 예 :

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

게임 클래스

이제 play_game, card_value (hand_value?) 및 특정 게임과 관련된 기타 사물 / 규칙은 Game 클래스

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 

결국 우리가 게임 스켈레톤으로 갖는 것은 다음과 같습니다.

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 

댓글

  • 죄송합니다. 이에 대응할 기회가 없었습니다. 집에서 인터넷 연결이 끊겼습니다 ~ 멋진 팁과보고 작업 할 수있는 뼈대를 제공합니다. 감사합니다. 너무 많이!

답변

당신이 “일 어설”때 딜러에게 다른 카드를 알려주고 그는 / stands, 그리고 당신은 치고 서서, 그것은 블랙 잭이 아닙니다. 딜러가 그의 손을 드러낸 후에 당신은 다른 히트 / 스탠드를 꺼내야합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다