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

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

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

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

Q&A

解決済

1回答

3710閲覧

ハングマンというゲームのプログラムを動かしたい

Phenomenon2

総合スコア40

Python 3.x

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

0グッド

0クリップ

投稿2019/03/03 10:47

編集2019/03/03 10:57

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
独学プログラマーのP138~139に載っているハングマンというゲームのプログラムを動かす練習をしています。
目的としては正解だった場合ゲーム終了、不正解が積み重なってハングマンの絵が完成した時、あなたの負け!と表示した上で正解の単語を表示したいです。

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

Runしようとすると動かなかったり、動いたとしても出るはずの答えの"cat"が出なかったりと思うような動きをしません
(前者は私の機械の不調の可能性も拭えません)
エラーメッセージ
無し

該当のソースコード

コード def hangman(word): wrong = 0 stages = ["", "__________ ", "| ", "| | ", "| 0 ", "| /|\ ", "| / \ ", "| " ] rletters = list(word) board = ["_"] * len(word) win = False print("ハングマンへようこそ!") while wrong < len(stages) - 1: print("\n") msg = "一文字を予想してね" char = input(msg) if char in rletters: cind = rletters.index(char) board[cind] = char rletters = "$" else: wrong = wrong + 1 print(" ".join(board)) e = wrong + 1 print("\n".join(stages[0:e])) if "_" not in board: print("あなたの勝ち!") print(" ".join(board)) win = True break if not win: print("\n".join(stages[0:wrong+1])) print("あなたの負け!正解は ().".format(word)) hangman("cat")

試したこと

41行目のhaangman("cat")を弄ってると反応が変わりまして動いたり動かなかったりしたので意味もなく空行を空けて一つ下にしたり逆に一つ上げたりしましたが本当にこんな事が原因で変わってるとは思えず辞めました。

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

anaconda3(64-bit)
windows10
Jupyter Notebook

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

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

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

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

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

tiitoi

2019/03/03 10:49

コードは markdown で書いてください
y_waiwai

2019/03/03 10:54

このままではコードが見れないので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
Phenomenon2

2019/03/03 10:58

ご丁寧に返答感謝いたします。 浅学ながら修正させていただいたのでご覧頂けると幸いです。
guest

回答1

0

ベストアンサー

動いたとしても出るはずの答えの"cat"が出なかったりと思うような動きをしません

とりあえずフォーマット書式指定の括弧が間違ってますね。

diff

1- print("あなたの負け!正解は ().".format(word)) 2+ print("あなたの負け!正解は {}.".format(word))

他にも rletters = "$" と代入している点や当てた場合に print(" ".join(board)) と表示していない点がおかしいように思えます。

それを直したら動くようになりました。

python

1def hangman(word): 2 wrong = 0 3 stages = ['', 4 '___________________', 5 '| | ', 6 '| | ', 7 '| 0 ', 8 '| /|\ ', 9 '| / \ ', 10 '| '] 11 letters = list(word) # 正解の文字 12 board = ['_'] * len(word) # 入力された文字を記録する配列 13 win = False # 勝ったかどうか 14 15 print('ハングマンへようこそ!') 16 while wrong < len(stages) - 1: 17 print('\n') 18 msg = '一文字を予想してね' 19 char = input(msg) 20 21 if char in letters: 22 cind = letters.index(char) 23 board[cind] = char 24 print(' '.join(board)) 25 else: 26 wrong = wrong + 1 27 print(' '.join(board)) 28 e = wrong + 1 29 print('\n'.join(stages[0:e])) 30 if '_' not in board: 31 print('あなたの勝ち!') 32 print(' '.join(board)) 33 win = True 34 break 35 if not win: 36 print('\n'.join(stages[0:wrong + 1])) 37 print('あなたの負け!正解は {} です。'.format(word)) 38 39 40hangman('cat')

改善案

コードで冗長な点を修正した改善案も貼っておきます。

1 while, for が break で途中で抜けたかどうかを確認するには、

while .. else, for .. else が使える。

while文の終了時の処理(while...else) - 繰り返し - Python入門

これで win フラグを排除できる。

2 str はリストと同じように扱える

str の文字列はリストと同じように扱えるので letters = list(word) としなくてもよい。

3. char が文字列に存在するかどうか

str.find(char) で存在すれば最初に見つかったインデックス、そうでない場合 -1 がかえるので、これで判定できる。

python

1def hangman(word): 2 stages = ['___________________', 3 '| | ', 4 '| | ', 5 '| 0 ', 6 '| /|\ ', 7 '| / \ ', 8 '| '] 9 wrong = 0 # 間違えた回数 10 board = ['_'] * len(word) # 入力された文字を記録する配列 11 12 print('ハングマンへようこそ!') 13 while wrong < len(stages): 14 print('========================================') 15 char = input('一文字を予想してね: ') 16 17 char_pos = word.find(char) 18 if char_pos >= 0: 19 board[char_pos] = char 20 else: 21 wrong += 1 22 print('\n'.join(stages[:wrong])) # 間違えた回数行だけ表示する。 23 24 print(' '.join(board)) # 正解できている文字を表示する。 25 26 if '_' not in board: 27 print('あなたの勝ち!') 28 break 29 else: 30 print('あなたの負け!正解は {} です。'.format(word)) 31 32 33hangman('cat')

投稿2019/03/03 10:56

編集2019/03/03 11:21
tiitoi

総合スコア21956

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

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

Phenomenon2

2019/03/03 11:20

無事動きました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問