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

関数/コードをクラスに具体化するプロセスをどこからどのように開始するかについての初心者のアドバイスを探しています。私の元のコードはそれが機能するように機能しますが、手動コードが多すぎると感じており、ここからどこに行くべきかについていくつかのヒント/アドバイスが欲しいです。

コメント

  • 修正しました
  • コードを確認しますか(まだ完了していません)、ゲームのスケルトンを作成するのを手伝ってください(正しいアプローチを見つけるのに役立ちます)。 ?
  • 正しいアプローチを見つけるのに役立つか、私が絶対にすべきではないことに気付いた場合は、それも指摘しておくとよいでしょう:)
  • 私は思いますPythonのクラスがどのように機能するかについてのドキュメントを読む必要があります。たとえば、Deckクラスに見られるような独立したコードはめったにありません。それを、__init__関数または別の関数の下に配置します
  • つまり、’これにクラスをまったく使用できないということですか?

回答

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. あなたの場合、カードクラスはスーツとランクを知っていますが、これも私の意見では間違った解決策です。フランス語の場合。

最初の2つの問題の結果、カードは内部にロジックのない単なるコンテナ(構造)であることが判明しました。これは、Pythonで使用するのに最適なものの1つです。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_cardメソッドとremove_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の場合、ヒットまたはスタンドになります。これはブラックジャックではありません。ディーラーが手を明らかにした後、他のヒット/スタンドを取り除く必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です