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

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

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

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

Q&A

解決済

1回答

781閲覧

ハングマンのコード解釈に関する質問です

inocchi1225

総合スコア4

Python 3.x

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

0グッド

0クリップ

投稿2021/12/18 16:52

前提・実現したいこと

書籍「独学プログラマー」のp.138~139のコードをそのまま入力して実行しました。エラーなく正常に動作したのですが、以下の2点がどうしても理解できなかったため、ご教示頂けますと幸いです。

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

<1点目> charがelseの時に「wrong += 1」とするのは理解できるのですが、その後になぜ「e = wrong + 1」するのかが理解できません(当該書籍の説明では理解できませんでした)。 例えば初めてelseとなった場合、「wrong += 1」によりwrongは初期設定の0から1になりますが、そこから2行下の「e = wrong + 1」によりeは2になるはずです。そうなると「print("\n".join(stages[0:2]))」となるため、stageのインデックス0と1の要素が返されるはずなのですが、実際に実行してもインデックス0の要素しか返されません。おそらく当方が正しく理解できていないと見受けているのですが、この点についてご教示頂けますと幸いです。 <2点目> stagesの要素数は8つ(インデックスで0~7)のため、(世の中の解釈とは異なるかもしれませんが)8回間違えるとハングマンの「絵」が完成し「負け」になると解釈しております。 ただこのコードだと7回間違えると「負け」になってしまうため、8回間違えると「負け」になる様に変えたいのですが、「while wrong < len(stages) - 1:」や「e = wrong + 1」の箇所をどう変えても「7回間違えると『負け』」の設定になってしまいます。

該当のソースコード

Python

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

試したこと

<1点目>
「e = wrong + 1」を「e = wrong」と変更しても、結果は特に変わりませんでした(同じ結果が返されました)。

<2点目>
以下の変更を行っても、結果は特に変わりませんでした(同じ結果が返されました)。
・「while wrong < len(stages) - 1:」を「while wrong < len(stages) :」や「while wrong < len(stages) + 1:」へ変更してみた。
・「e = wrong + 1」を「e = wrong」へ変更してみた。

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

Anacondaで作成した仮想環境の下、Pycharmで実行した
Windows 10
Anaconda 2021年5月版
python 3.8.8

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

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

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

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

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

guest

回答1

0

ベストアンサー

<1点目>

「e = wrong + 1」を「e = wrong」と変更しても、結果は特に変わりませんでした(同じ結果が返されました)。

変わるはずというか、変わることを確認できるので、勘違いだと思います。

<2点目>

以下の変更を行っても、結果は特に変わりませんでした(同じ結果が返されました)。
・「while wrong < len(stages) - 1:」を「while wrong < len(stages) :」や

while wrong < len(stages) の変更で8回失敗したときに終了します。

結果は、変わります・・・が、確認できないということなので

1点目、2点目ふくめて、ファイルを保存していないか、変更したファイルと違うコードを実行しているのではないでしょうか?

投稿2021/12/18 18:07

momon-ga

総合スコア4820

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

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

inocchi1225

2021/12/19 05:14

早速のご回答、ありがとうございます。ご指摘内容を踏まえ、(pycharm再起動だけではうまくいかなかったので)PCを再起動した上で再度試した所、元々のコードで当方が想定してた結果を返すことができました。「e = wrong + 1」や「while wrong < len(stages) - 1:」の「+1」や「-1」をいじってみた所違う結果が返され、コードを理解することができました。 原因は分かりませんがどうやらファイル保存がうまくできていなかった様です。次回からは気を付けたいと思います。 大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問