こんにちは!
ENHANCERのPengです!
今回は前回に引き続き、「ハングマン(Hangman)」という言葉当てゲームを作っていきたいと思います!
今回は前回同様、以下の要領でハングマンを作っていきます。
- 相手から単語を与えられるわけではなく、自分で用意したいくつかの単語リストの中から、ランダムで正解の単語が選ばれるようにする。
- 5回文字を間違えるとハングマンが完成する。
- 「1文字を予想してね!」という但し書きを表示させる。
- 正解の単語の数だけ_を表示する。
- 勝った場合は「あなたの勝ち!」、負けた場合は「あなたの負け!正解は” ”」と表示する。
前回は1~3までを説明したので、今回は4と5を説明していきたいと思います!
最後に全部をまとめたコードも掲載する予定です。
では早速行きましょう!
Google Colaboratoryを使って進めていきます!
前回のおさらい
前回は3までを進めたのでした。
def hangman():
import random as ran
stages = ["",
"__________ ",
"| | ",
"| 0 ",
"| /|\ ",
"| / \ ",
"| "
]
wrong = 0
lis = ["cat", "dog", "penguin", "bird", "fish", "panda"]
num = ran.randint(0, 5)
word = lis[num]
correct = list(word)
board = ["_"] * len(word)
win = False
print("ハングマンへようこそ!")
while wrong < len(stages) - 1:
print("\n")
msg = "1文字を予想してね! ヒント:動物の名前"
char = input(msg)
if char in correct:
cind = correct.index(char)
board[cind] = char
correct[cind] = '$'
else:
wrong += 1
最初ハングマンのリストを定義して、正解の単語のリストを作り、
リストからランダムに答えの単語を選ぶようにした後、
while文で質問と、その文字が正解の単語に含まれていた場合と含まれていなかった場合の動作を書き込みました。
次は正解の単語の数だけ_を表示させ、さらにはハングマンを間違った数だけ表示させなければなりません。
正解の単語の数だけ_を追加する
正解の単語の数だけ_を追加するにはこのようにコードを書き加えます。
さらにこのコードでは間違った文字を入力した数だけ、ハングマンが表示されるようになっています。
#空白をboardの間に追加して表示する
print(" ".join(board))
#間違えた数だけハングマンを表示させる
e = wrong + 1
print("\n".join(stages[0 : e]))
まず一行目ではjoinメソッドを使って、board(正解の単語の数だけ_を生成するように定義)に空白を加えて表示するように指示を出しています。
二行目では間違えた文字数(wrong)に1を足した値をeに代入し、
三行目でこれまたjoinメソッドを使って、改行を加えてハングマンの絵(stages)を表示させています。
wrongは間違うたびに一ずつ追加されていくように定義されているので、
間違っていくたびにどんどん絵が完成していくという仕組みになっています。
メソッドの使い方をおさらいしたい方はこちらにまとめてありますので、参考にしていただけたらと思います!
これでハングマンのゲームの仕組みは完成です!
次は勝敗が決まったときにどのように表示させるかを定義していきましょう。
勝敗が決定したときの表示を作成する
勝敗が決定したときの処理はifの条件文を使っていきます。
#勝ったときの動作
if "_" not in board:
print("あなたの勝ち!")
print(" ".join(board))
win = True
break
#負けたときの動作
if not win:
print("\n".join(stages[0 : wrong + 1]))
print("あなたの負け!正解は{}". format(word))
上の条件文ではもし_がboardになくったとき、すなわち、正解の単語がすべて現れたときに動作します。
boardは文字を正解させていくたびに_を正解の文字に置き換えていくように定義していたため、正解の文字をすべて当てたときにはおのずと_はなくなります。
次の行で「あなたの勝ち!」と表示させ、その次の行で正解の単語を表示させています。
if条件文については以下の記事で解説していますので、わからない場合はご覧いただけたらと思います!
次の行ではwinという変数をTrueに置き換えています。
winは最初にFalseと定義してあるので、ここでwinをTrueにすることで、負けた場合のif条件文が動作しないようにしています。
そして、これ以上whileループが回らないよう、ここでbreakをしてループを終了させています。
whileループに関しては以下の記事にまとめてあります!
下の条件文は負けたときの動作を定義しています。
if文はTrueのときに動作するんでしたね。
if not winは、winがもともと「False」なので「not False」→「True」になることで動作します。
さらに二行目で完成してしまったハングマンの絵を表示させています。
三行目では、「あなたの負け!」の文字のあとに、formatメソッドを使って正解の単語(word変数に格納してある)を表示させています。
皆さんお疲れ様でした!
これでハングマンの完成です!!!
ハングマン全体のコード
今回二回に分けて制作したハングマンのコードを以下に掲載します。
def hangman():
import random as ran
stages = ["",
"__________ ",
"| | ",
"| 0 ",
"| /|\ ",
"| / \ ",
"| "
]
wrong = 0
lis = ["cat", "dog", "penguin", "bird", "fish", "panda"]
num = ran.randint(0, 5)
word = lis[num]
correct = list(word)
board = ["_"] * len(word)
win = False
print("ハングマンへようこそ!")
while wrong < len(stages) - 1:
print("\n")
msg = "1文字を予想してね! ヒント:動物の名前"
char = input(msg)
if char in correct:
cind = correct.index(char)
board[cind] = char
correct[cind] = '$'
else:
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()
いかがでしたか?
Pythonを使って簡単なゲームができると楽しくなってきますよね!
おわりに
今回作ったハングマンは工夫次第でもっと面白くなる可能性を秘めています。
たとえば、
- 正解の単語のリストをもっとたくさん増やして、色々な単語で遊べるようにする
- ステージのリストを追加して、毎回ランダムなステージで遊べるようにする
- ループ構造を追加して、何回もハングマンを遊べるようにする
とかが考えられますね!
記事で使ったコードはGitHubにて公開しておきますので、もしよろしければ以下のリンクからそちらも併せてご覧ください。
GitHubの使い方、コードの確認の仕方はこちらの記事にまとめてありますので、もしわからなければご確認ください。
またはこちら
それではこれで今回の記事を終わりにします!
また次回の記事もお楽しみに!!
ENHANCER Peng