0

ブラックジャックのゲームのディーラーをシミュレートしようとしていますが、本当に混乱しています。

基本的に、私は通常のカード デッキのセットアップを使用するのではなく、J、Q、K、A、および 2-10 のみで構成されたカードのデッキを使用して、この作業を簡素化しています。

私はこれらすべてがかなり厄介であることを認識しています.3時間すべてのクラスで作業しています。

class Deck:
    '''Simulates a deck of cards.'''

    def __init__(self):
        '''Deck() -> Deck
        Creates a deck of cards'''
        self.Deck = ['J', 'J', 'J', 'J', 'Q', 'Q', 'Q', 'Q', 'K', 'K', 'K', 'K', 'A', 'A', 'A', 'A', '2', '2', '2', '2', '3', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5', '6', '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '8', '9', '9', '9', '9', '10', '10', '10', '10']

    def __str__(self):
        '''str(Deck) -> str
        Returns string showing number of cards left'''
        output = str(len(self.Deck)) + ' cards'
        return(output)

    def shuffle(self):
        '''shuffle(self) -> Deck
        Shuffles deck.'''
        import random
        random.shuffle(self.Deck)

     def draw(self):
        if len(self.Deck) > 0:
            return(self.Deck.pop(0))
        else:
            return(-1)

    def add(self, card):
        self.Deck.append(str(card))

class BlackJackPlayer(Deck):
    '''Represents someone playing blackjack.'''

    def __init__(self, Deck):
        self.BlackJackPlayer = Deck
        self.hand = ''
        self.value = 0

    def __str__(self):
        return self.hand

    def clean_up(self):
        self.BlackJackPlayer = Deck
        self.hand = ''
        self.value = 0

    def get_value(self):
        for x in self.hand:
            if x != ',':
                if x not in range(1, 11):
                    if x != 'A':
                        self.value += 10
                    else:
                        if (self.value + 11) > 17:
                            self.value += 1
                        else:
                            self.value += 11
                else:
                    self.value += x
        return(self.value)

    def hit(self):
        Deck.shuffle(self.BlackJackPlayer)
        card = Deck.draw(self.BlackJackPlayer)
        return(card)

    def play_dealer(self):
        while BlackJackPlayer.get_value(self) < 17:
            self.hand += BlackJackPlayer.hit(self)
            print(self.hand)
            if BlackJackPlayer.get_value(self) < 17:
                self.hand += ','
        if BlackJackPlayer.get_value(self) > 21:
            return('BUST')
        else:
            return

何らかの理由で、jack.play_dealer() を呼び出すたびに、ハンドがすでに 21 を超えていると判断して、すぐに停止してしまいます。

例えば:

>>> deck = Deck()
>>> jack = BlackJackPlayer(deck)
>>> jack.play_dealer()
7
'BUST'
>>> jack.get_value()
40

get_value() に何か問題があると思いますが、わかりません。

前もって感謝します!

4

2 に答える 2

1

あなたのDeckカードはすべて文字列です:

self.Deck = ['J', 'J', 'J', 'J', 'Q', 'Q', 'Q', 'Q', 'K', 'K', 'K', 'K', 'A', 'A', 'A', 'A', '2', '2', '2', '2', '3', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5', '6', '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '8', '9', '9', '9', '9', '10', '10', '10', '10']

'2'および'3'などの文字列に注意してください。

それでも、それらを整数として扱おうとします:

for x in self.hand:
    if x != ',':
        if x not in range(1, 11):

xすべての値は文字列であるため、 には決してなりません。range(1, 11)したがって、上記のifステートメントは常に True.

次の部分は次のとおりです。

if x != 'A':
    self.value += 10
else:
    if (self.value + 11) > 17:
        self.value += 1
    else:
        self.value += 11

「数字」のカードが引かれた場合、not in range(1, 11)は依然として真であり、 と等しくないため'A'、すべてのカードを値 10 として数えます。

ここで、数字カードの処理方法を再考する必要があります。英数字の順序をテストできます。

if x >= 'A':

ASCII標準ではすべての数字が大文字の前にソートされるため、数字カードでも機能します。not in range(1, 11)テストの代わりにそれを使用してください。

次の問題は、カードが数値の場合に、文字列を使用して値を合計しようとしていることです。

else:
    self.value += x

しかし、それは文字列を合計します。文字列値は常に数値よりも大きくなります (Python 3 では、文字列と数値を比較するとエラーが発生します)。

int()実際の数値を合計するために使用します。

else:
    self.value += int(x)

これで、少なくとも何かが機能しています。

>>> deck = Deck()
>>> jack = BlackJackPlayer(deck)
>>> jack.play_dealer()
A
A,A
A,A,9
'BUST'
>>> jack.get_value()
60

しかし、これはまだ高すぎます。self.valueこれは、計算を保存するために使用するが、決してリセットしないためです。新しい計算ごとに追加し続けます。

の代わりにローカル変数を使用しますself.value

def get_value(self):
    value = 0
    for x in self.hand:
        if x >= 'A':
            if x != 'A':
                value += 10
            else:
                if value > 6:
                    value += 1
                else:
                    value += 11
        else:
            value += int(x)

    return value

これで、ゲームは期待どおりに動作します:

>>> jack = BlackJackPlayer(Deck())
>>> jack.play_dealer()
J
JA
JAA
JAA6
于 2013-08-23T22:42:11.183 に答える
0

スコアを取得するためのロジックを置き換える方法を次に示します。問題は、文字列を整数として扱い、値をリセットせずにハンド全体を再評価することです。

def get_value(self):
    self.value = 0 # reset for reevaluation
    aces11 = 0
    for x in self.hand.split(','):
        x = x.strip() # strip off excess whitespace
        if x in '2345678910': # numeric
            self.value += int(x)
        elif x == 'A': #An ace
            self.value += 11
            aces11 += 1
        else: # a face card
            self.value += 10
        #check to reduce aces if greater than 17
        while self.value>17 and aces11>0:
            aces11 -= 1
            self.value -= 10
    return(self.value)
于 2013-08-23T22:53:44.753 に答える