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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2082閲覧

『独学プログラマー』のPythonサンプルコード「戦争」写経で発生したエラーの解消

uruf

総合スコア1

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/08 14:14

編集2021/02/08 14:18

前提・実現したいこと

プログラミング初心者です。
『独学プログラマー』のサンプルコード「戦争」を少しアレンジも加えながら理解を深めようとしているのですが、エラーが発生し、その解決方法を見つけられずにいます。
ご指摘いただけますと幸いです。

発生している問題・エラーメッセージ

エラーメッセージ Line 76 Line 106 ‘Game’ object has no attribute ‘deck’ ### 該当のソースコード from random import shuffle # カード(トランプ)のクラス class Card: suits = ['スペード', 'ハート', 'ダイヤ', 'クラブ'] values = [None, None, '2', '3', '4', '5', '6', '7', '8', '9', '10', 'ジャック', 'クイーン', 'キング', 'エース'] def __init__(self, v, s): # スート(マーク)も値も整数値です self.value = v self.suit = s def __lt__(self, c2): if self.value < c2.value: return True if self.value == c2.value: return self.suit < c2.suit return False def __gt__(self, c2): if self.value > c2.value: return True if self.value == c2.value: return self.suit > c2.suit return False def __repr__(self): v = self.suits[self.suit] + 'の' + self.values[self.value] return v # デッキのクラス class Deck: def __init__(self): self.cards = [] for i in range(2, 15): for j in range(4): self.cards.append(Card(i, j)) shuffle(self.cards) def draw(self): if len(self.cards) == 0: return return self.cards.pop() # プレイヤーのクラス class Player: def __init__(self, name): self.wins = 0 self.card = None self.name = name # ゲームのクラス class Game: def _init__(self): name1 = input('プレイヤー1の名前を入力してください: ') name2 = input('プレイヤー2の名前を入力してください: ') self.deck = Deck() self.p1 = Player(name1) self.p2 = Player(name2) def print_winner(self, winner): w = 'このラウンドは {} が勝ちました' print((w.format(winner.name))) def print_draw(self, p1, p2): d = '{} は {} 、 {} は {} を引きました' print((d.format(p1.name, p1.card, p2.name, p2.card))) def play_game(self): cards = self.deck.cards print('Warをはじめます') while len(cards) >= 2: m = 'qで終了、それ以外のキーでプレイ: ' response = input(m) if response == 'q': break self.p1.card = self.deck.draw() self.p2.card = self.deck.draw() self.print_draw(self.p1, self.p2) if self.p1.card > self.p2.card: self.p1.wins += 1 self.print_winner(self.p1) else: self.p2.wins += 1 self.print_winner(self.p2) win = self.winner(self.p1, self.p2) print(('ゲーム終了、{}の勝利です'.format(win))) def winner(self, p1, p2): if p1.wins > p2.wins: return p1.name if p1.wins < p2.wins: return p2.name return '引き分け!' # ゲームの実行 game = Game() game.play_game()

Python 3.6

試したこと

入力ミス等ないか確認しましたが、問題を解決できませんでした。

補足情報(FW/ツールのバージョンなど)

環境:Pythonista

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

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

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

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

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

guest

回答2

0

ベストアンサー

入力ミス等ないか確認しましたが、問題を解決できませんでした。

以下が入力ミスです。initの両隣にダブルのアンダースコアが必要です。

diff

1class Game: 2- def _init__(self): 3+ def __init__(self): 4

投稿2021/02/08 14:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

uruf

2021/02/08 14:47

ご指摘ありがとうございました!指摘されればとても些細なことが、自分で書いているときはなかなか見つけられないものなのですね。もっと注意深く学習を続けようと思います。
guest

0

Gameのコンストラクタが動いてないだけじゃないかと。
名前間違ってません?

投稿2021/02/08 14:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/02/08 14:28

うお、被った…すみませんorz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問