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

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

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

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

Q&A

解決済

1回答

722閲覧

クラス変数が増加しない

juvenil_talk

総合スコア11

Python 3.x

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

0グッド

0クリップ

投稿2020/10/01 14:52

「20枚コインがある、先攻後攻が1~4枚ずつ交互に取る。20枚目を取ったら負け」というゲーム」をpythonで実装しようとして、以下のようなコードを書きました。
(環境はPyCharm Community Edition 2020.2.2 x64、Anaconda導入済み)

import random class Player(object): CARD_DECK = list(reversed([i for i in range(1, 21)])) def __init__(self, get_card_list=None, win_count=0): self.win_count = win_count if get_card_list is None: self.get_card_list = [] def draw_card(self, draw_choice=None): if draw_choice is None: draw_choice = [1, 2, 3, 4] draw_card_count = random.choice(draw_choice) for i in range(draw_card_count): if len(self.CARD_DECK) == 0: break draw_card = self.CARD_DECK.pop() self.get_card_list.append(draw_card) if 19 in self.get_card_list: self.win_count += 1 first_player = Player() second_player = Player() for i in range(100): while len(first_player.CARD_DECK) > 0: first_player.draw_card() second_player.draw_card() print(first_player.get_card_list) print(second_player.get_card_list) print(first_player.win_count)

こちらが期待しているのは、PlayerClassをそれぞれfirst_player, second_playerにインスタンス化し、draw_cardメソッドでクラス変数で宣言した20枚のカードデッキがなくなるまでお互い交互に1~4枚カードを引き、最終的に19を所有しているplayerの勝利数:win_countが増えることです。そして以上をfor文で1000回ほど繰り返すことでどちらのplayerの勝利数が多いのかをインスタンス変数のwin_countで表示したいのですが、どうも繰り返し処理がうまくいってないような気がします。
どうにかアドバイスお願いします。

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

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

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

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

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

TakaiY

2020/10/01 15:15

どのような問題があって、何を聞きたいのでしょう?
meg_

2020/10/01 15:18

> どうも繰り返し処理がうまくいってないような気がします。 そう思われた理由は何でしょうか? そこを質問に書いてくれないと課題が分かりません。
guest

回答1

0

ベストアンサー

  • クラス変数のCARD_DECKの内容は、1回のゲームごとに([20, 10, ……, 1]のリストに)初期化する必要がある。
  • インスタンス変数のget_card_listの内容は、1回のゲームごとに[]に初期化する必要がある。
  • 19を引いて勝敗が決まったらすぐにCARD_DECK[]にしないと、1回のゲームで複数回win_countを増やしてしまうことがある。

Python

1import random 2 3 4class Player(object): 5 6 def __init__(self, get_card_list=None, win_count=0): 7 self.win_count = win_count 8 self.get_card_list = get_card_list 9 10 def reset_card_deck(): 11 Player.CARD_DECK = list(reversed([i for i in range(1, 21)])) 12 13 def draw_card(self, draw_choice=None): 14 if draw_choice is None: 15 draw_choice = [1, 2, 3, 4] 16 draw_card_count = random.choice(draw_choice) 17 for _ in range(draw_card_count): 18 if len(Player.CARD_DECK) == 0: 19 break 20 draw_card = Player.CARD_DECK.pop() 21 self.get_card_list.append(draw_card) 22 if 19 in self.get_card_list: 23 Player.CARD_DECK = [] 24 self.win_count += 1 25 26 27first_player = Player() 28second_player = Player() 29 30for _ in range(10000): 31 Player.reset_card_deck() 32 first_player.get_card_list = [] 33 second_player.get_card_list = [] 34 while len(Player.CARD_DECK) > 0: 35 first_player.draw_card() 36 second_player.draw_card() 37 38# print(first_player.get_card_list) 39# print(second_player.get_card_list) 40 41print(f"1st win {first_player.win_count}, 2nd win {second_player.win_count}")

result

11st win 4998, 2nd win 5002

投稿2020/10/01 16:42

編集2020/10/01 18:20
Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問