今回はハングマンという言葉あてゲームのプログラムを作る。
ハングマンとはどんなゲームかというと、
こちらのリンク先のようなもので1つ単語を選んで、
その文字数を空白で表現する。
そこからプレイヤーが文字を選んで、空白の中にあっている文字があれば
その文字は空白から正解の文字に変わり、
間違っていたらライフが1減る。
それを死ぬか正解するまで当てに行くというゲーム。
ではプログラムを開始してみよう。
ゲームの流れはまさに上に書いたようなものなので、1つずつ解釈しながら
プログラムしていこう。
1つ単語を選ぶ = リストにあるものをランダムに選ぶ、ということにする。
そうすると
answer_list = ["one", "two", "three"]
import random でランダム機能を追加して
answer = random.choice(answer_list )
これでanswerは one, two, threeのどれかがランダムで表示される。
次に、その文字を空白で表現する。
ということは、answerの文字数を拾ってそのぶんを空白にすればいい。
displayというリスト名にして、文字数を拾うにはfor を使えばよさそう。
display = []
for moji in answer:
display += "_"
これで、oneなら["_","_","_"]というリストが問題で表示される。
次に、プレイヤーが文字を選ぶ動作は、いつもどおりにinputを使う。
yosoku = input("アルファベットを推測してください")
これでOK。
そして選んだ文字が正解の文字と合っているかどうかをチェックしていく。
これもfor文を使ったら良さそうだ。
if yosoku = answer[0]
if yosoku = answer[1]
if yosoku = answer[2]
みたいな感じになればいいということかな。
ということは、新しくanswerの文字数がわかる変数を作らなくてはいけないので
answer_mojisuu = len(answer)
で答えの文字数がわかる。oneなら3、となるはず。
で、答えの文字と予測した文字があっていればdisplayの空白が正解の文字に入れ替わるように1文字ずつしたいので、1文字の位置をpositionと名前をつけて、
そこの位置にある文字をmojiとする。
文字数分を1文字1文字チェックしていく動作にする。
for position in answer_mojisuu: で答えの文字数から1文字ずつカウントする
moji = answer[position] で答えの文字を拾っていく。1回目はo、2回目はnなど
if moji == yosoku: 文字が予測の文字とあっていたら
display[position] = yosoku その位置の空白は正解の文字に入れ替わる。
print(display) ["o","_","_"]となる
これで、["_","_","_"]にoを答えると、["o","_","_"]と変換されるようになる。
でもこのままだと1回しか反映されないので、繰り返しをする必要がある。
なので、yosoku = input...からforまでを全部whileで囲う。
whileで囲うということは、終わりのトリガーがないとエンドレスになってしまうので
game_over = False
とwhile手前に書いて、その後に
while not game_over: で以下をインデントする。
game_over = False
while not game_over:
yosoku = input("アルファベットを推測してください").lower()
answer_mojisuu = len(answer)
for position in range(answer_mojisuu):
moji = answer[position]
if moji == yosoku:
display[position] = yosoku
print(display)
こんな感じになる。
では、ゲームが終わるにはどんな条件だろう?
1つはライフがなくなったとき。
もう1つは全て埋めてクリアした時。
これらを今度はprint(display)の下に書いていく。
ライフがなくなるときは、予測の文字が正解の文字と外れたとき。
これをコーディングしていくと、まずwhileより上に
life = 6 と定義する(ハングマンは6回間違えたら首吊りしちゃうので)
そして、print(display)の下にインデントしてから
if not yosoku in answer:
life -= 1 ライフが1減る
print(f"あと {life} 回で死ぬよ")
そして、0回になったらゲームオーバーなので
if life == 0:
game_over = True
print("あなたは死んじゃいました")
これで1つ目の条件は終わり。
全て埋めた場合も同じ感じで
if not "_" in display:
game_over = True
print("おめでとう!クリア!")
これで完成。
なかなか理解しにくかったのが、
文字数とか文字の位置のfor文。
答えの文字数をカウントして、そのカウント文をリストの括弧の中に入れた文字を
答えの文字を比べて・・・って
この文章だけで理解しにくいのがわかるw
考えててよくわからなくなるので今回は結構丁寧に書いた。