質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1834閲覧

(理由を教えて下さい)予想外の計算結果が得られました

YuheiFujioka

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2016/07/09 06:04

a = Blackjack(100,10)
M = a.Me(a.deck)
D = a.Dealer(a.deck)とした時に、MとDの値が常にともに0になります。

MとDは、それぞれの関数内で生成したランダム変数の合計のため、両者が常に0というのは変だと考えています。
なぜこのような結果になるのかわからなかったため、ご質問させて頂きました。
よろしくお願いします。

class Blackjack(object): def __init__(self, poket, bet,deck = [] ): self.poket = poket self.bet = bet self.deck = deck ###ディーラーの行動 def Dealer(self,deck): def Deck(self): for i in range(2): (self.deck).append(random.randint(1,13)) return self.deck def Hit(self):##カードを引く return random.randint(1,13) def Point(self):##手持ちカードの合計を返す s = 0 sorted((self.deck), reverse = True) for i in range(len(self.deck)): if self.deck[i] == 11 or self.deck[i] == 12 or self.deck[i] == 13: s += 10 elif self.deck[i] == 1: s += 11 if s >= 21: s -=10 else: s += self.deck[i] return s def d_Hit_or_stand(self, Point, Hit,deck): if Point <=16: self.deck.append(Hit) else: pass return Point(self) ###自身の行動 def Me(self,deck): def Deck(self): for i in range(2): (self.deck).append(random.randint(1,13)) return self.deck def Hit(self):##カードを引く return random.randint(1,13) def Point(self):##手持ちカードの合計を返す s = 0 sorted((self.deck), reverse = True) for i in range(len(self.deck)): if self.deck[i] == 11 or self.deck[i] == 12 or self.deck[i] == 13: s += 10 elif self.deck[i] == 1: s += 11 if s >= 21: s -=10 else: s += self.deck[i] return s def Me_Hit_or_stand(self,Point,Hit,deck): print("Now My sum of cards are "+ Point + "Decide Hit(input h) or Stand(input s)") if raw_input("h"): (self.deck).append(Hit(self)) else: pass return Point(self) ##勝敗判定と精算 def Judge_and_amount(self,Me,Dealer): if (Me >Dealer) and Me <= 21: print ("I win") poket += 10 if (Me <Dealer) and Dealer <= 21: print ("I lose") poket -= 10 if Me <= 21 and Dealer > 21: print ("l win") poket += 10 if Dealer <= 21 and Me > 21: print("I lose") poket -= 10 else: print("draw") print(self.poket)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのコードで、その呼び出し方をするなら、MもDも0になるのは特段不可解な挙動でもなく、普通に動作して普通に0を返しているだけだと思います。

a = Blackjack(100,10)

この時点では、deckに指定がないため、a.deck = []となっています。

M = a.Me(a.deck)

内部では最終的にPoint(self)だけを呼び出していますが、a.deckが空なので0が返ります。

D = a.Dealer(a.deck)

a.Me()とやっていることは同じくPoint(self)を呼び出す事しかしていないため、0が返ります。

投稿2016/07/09 06:29

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YuheiFujioka

2016/07/09 07:21

ご回答ありがとうございます。 Delaer関数のdeckをBlackjcackで参照することはやはり出来ないでしょうか。
attakei

2016/07/11 14:02

Delaer関数の内部で見られるdeckは引数となるdeckと、内部の関数であるPrint内で使われているself.deckなのですが、いずれもBlackjack.deckと同じものになるので参照自体はできていると言えるかと思います。 「MとDは、それぞれの関数内で生成したランダム変数の合計のため」とあるのに対して、実装が全くと言っていいほどそうなっていないのが、いろいろと問題となっています。 Blackjack.Me, とBlackjack.Dalaerがそれぞれ何をさせるかをもう一度見直した方がよいのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問