UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY:7 ハングマンをプログラムする!

今回はハングマンという言葉あてゲームのプログラムを作る。

 

ハングマンとはどんなゲームかというと、

https://hangmanwordgame.com/

 

こちらのリンク先のようなもので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

 

考えててよくわからなくなるので今回は結構丁寧に書いた。