【第5回】テキストアドベンチャーゲームで基本構文を学ぶ

テキストアドベンチャー pythonで簡単プログラミング

#python #ゲーム #if #条件分岐 #while #繰り返しループ #def #関数

本記事では1分以内に終わってしまうテキストだけのアドベンチャーゲームを材料に、プログラミングの基本に必要な処理について解説します。
内容が多いため、2回にわけて解説します。

なお、これらの基本的な処理は、プログラミングに限ったことではなく、日常生活にも影響してくる論理思考の素になります。
ぜひともご覧ください!

本記事では、主としてWindows、および、python3を前提にしています。
スポンサーリンク

今回のプログラム

解説に入る前に、今回のプログラムを以下に示します。
早速実行してみたくなった方は、後述の『プログラムを実行するまでの準備』以降を参照して実行してみてください。

[adventure.py]

import sys                  # システム用モジュール
import random as rd         # 乱数を扱うモジュール

def checkDeath() :          # 生命点(HP)が無くなったかをチェックする関数
    global HP               # 生命点(HP)を関数外と共有する
    global score            # 得点(スコア)を関数外と共有する

    if HP <= 0 :            # 生命点(HP)が無くなった
        print("やられた")
        print("")
        print("スコア : " + str(score))
        print("")
        print("--- GAME OVER ---")
        sys.exit()          # プログラムを終了する

def slime() :               # スライムの場合の処理をする関数
    global HP
    global score

    print("スライムが現れた!")
    HP = HP - 10            # 生命点(HP)を減らす
    checkDeath()            # 生命点(HP)チェック関数を実行する
    score = score + 1       # 得点(スコア)を増やす
    print("攻撃されてHPが" + str(HP) + "になった")

def goblin() :              # ゴブリンの場合の処理をする関数
    global HP
    global score

    print("ゴブリンが現れた!")
    HP = HP - 30
    checkDeath()
    score = score + 1
    print("攻撃されてHPが" + str(HP) + "になった")

def dragon() :              # ドラゴンの場合の処理をする関数
    global HP
    global score

    print("ドラゴンが現れた!")
    HP = HP - 50
    checkDeath()
    score = score + 1
    print("攻撃されてHPが" + str(HP) + "になった")

HP = 100        # 生命点(Hit Point)
score = 0       # 得点(スコア)

while True :    # ずっと繰り返す
    print("3つの分かれ道があります。")
    print("どれに進みますか?")
    print("1 ... 左   2 ... 真ん中   3 ... 右")

    dir = int(input())              # 進む方向をキーボードから入力させる
    if dir < 1 or dir > 3 :
        print("谷に転落した!")
        print("")
        print("--- GAME OVER ---")
        sys.exit()

    monster = rd.randint(1,3)       # 1~3の乱数を発生させる
    monster = monster + dir - 1     # 進んだ方向(dir)でモンスターを変更する

    if monster > 3 :                # 変更した結果が3を超えたら
        monster = monster - 3       # 1に修正する(モンスターは1~3)のため

    if monster == 1 :
        slime()                     # スライムが出現する
    elif monster == 2 :
        goblin()                    # ゴブリンが出現する
    else :
        dragon()                    # ドラゴンが出現する

    print("")                       # 見栄えを整えるための空行を表示

プログラムの基本的構文について

自作関数

前回解説をした関数は、全て他のプログラマーが作成したモジュールの中に収録されている関数でした。
しかし、今回は関数を自作します。
関数はpythonでは、定義(defineディファイン)を表す“def”デフで始めることで定義します。
そして、”関数名()”で実行します。

def hoge() :
    print("関数です")

hoge()

上記は、”hoge”という名前の関数を定義しています。
すぐ後ろに“:”コロンがありますが、これは、定義”def”の文法の区切りを表し、次の行に、関数が実行されたときに実行する行を書きます。

また、pythonでは、’print(“関数です”)’ の前に、いくつかのTABタブまたは空白が必要です。

そして、”hoge()”という具合に、“()”カッコをつけることで実行します。

関数の中で複数の行を実行する場合は、以下のようにどの行にもTABタブか空白を付ける必要があり、1行目と全く同じTABタブ・空白を2行目以降にもつける必要があります

def hoge() :
  print(“関数です”)
  print(“まだ関数です”)

条件分岐

ここでは、プログラミングの基本に必要な条件分岐じょうけんぶんきについて解説します。

条件分岐とは、『もしAがBのとき、~を実行する』という形の構文で、~を実行するかしないを分岐させます。

これをプログラムで描くと下記のようになります。

if A == B :
    print("ifの中")

”if”イフは、英語で『もし』、『A == B』 は、AがBのとき(AがBと等しいとき)を表します。
”if”で始まる文をif文といい、“:”コロンはif文の区切りを表します。

上記の文は、『A == B』のときに、『print(“ifの中”)』を実行することを示しています。

では、さらに条件が増えたらどう書くのかというと、
この場合、以下のようになります。

if A == B :
    print("ifの中")
elif A == D :
    print("elifの中")

“elif”エルイフは、英語の“else if”エルス イフの略で、”その他で、もし~の場合”という意味になります。
そのため、
『その他で、もし”A == D” の場合に、’print(“elifの中”)’を実行する』
という意味になっています。

では、今度は、『どの条件にも当てはまらなかった場合に~を実行する』
としたい場合はどう書くのか
ですが、この場合は、以下のようになります。

if A == B :
    print("ifの中")
elif A == D :
    print("elifの中")
else :
    print("elseの中")

“else” が、『その他』となるため、”else”だけの場合、『上記以外のその他』という意味になり、『上記以外のその他の場合は’print(“elseの中”)’を実行する』となります。

if文はあらゆるプログラミング言語で、微妙に語や区切り文字が違う程度です。(例えばelifはelse ifになる、”:”は“{“左波カッコに変わり“}”右波カッコで終わるなど)
そのため、他の言語を扱うときにはスムーズに理解できます。

繰り返し

ここでは、『繰り返し』について解説します。

繰り返しを行なう場合、『~の間』、『~ごとに』、『~まで』という条件が伴います。
pythonでは、『~まで』という構文はなく、『~の間』の構文で実現します。
本記事では、『~の間』を使います。下記のように”while”(~の間)がそれにあたります。

while A == B :
    print("whileの中")

上記の場合、”A == B”が成り立つ間、ずっと『print(“whileの中”)』を実行し続けます。
このままですと、無限に繰り返し(無限ループと呼ぶ)、プログラムが終了しません。
そのため、途中でAとBが違う値になるよう変更する処理が必要になります。

ゲームの実行結果

ゲームのプログラムを再度、以下に示します。
プログラムの保存や、書くための準備などは、後述の『プログラムを実行するまでの準備』以降を参照してください。

[adventure.py]

import sys                  # システム用モジュール
import random as rd         # 乱数を扱うモジュール

def checkDeath() :          # 生命点(HP)が無くなったかをチェックする関数
    global HP               # 生命点(HP)を関数外と共有する
    global score            # 得点(スコア)を関数外と共有する

    if HP <= 0 :            # 生命点(HP)が無くなった
        print("やられた")
        print("")
        print("スコア : " + str(score))
        print("")
        print("--- GAME OVER ---")
        sys.exit()          # プログラムを終了する

def slime() :               # スライムの場合の処理をする関数
    global HP
    global score

    print("スライムが現れた!")
    HP = HP - 10            # 生命点(HP)を減らす
    checkDeath()            # 生命点(HP)チェック関数を実行する
    score = score + 1       # 得点(スコア)を増やす
    print("攻撃されてHPが" + str(HP) + "になった")

def goblin() :              # ゴブリンの場合の処理をする関数
    global HP
    global score

    print("ゴブリンが現れた!")
    HP = HP - 30
    checkDeath()
    score = score + 1
    print("攻撃されてHPが" + str(HP) + "になった")

def dragon() :              # ドラゴンの場合の処理をする関数
    global HP
    global score

    print("ドラゴンが現れた!")
    HP = HP - 50
    checkDeath()
    score = score + 1
    print("攻撃されてHPが" + str(HP) + "になった")

HP = 100        # 生命点(Hit Point)
score = 0       # 得点(スコア)

while True :    # ずっと繰り返す
    print("3つの分かれ道があります。")
    print("どれに進みますか?")
    print("1 ... 左   2 ... 真ん中   3 ... 右")

    dir = int(input())              # 進む方向をキーボードから入力させる
    if dir < 1 or dir > 3 :
        print("谷に転落した!")
        print("")
        print("--- GAME OVER ---")
        sys.exit()

    monster = rd.randint(1,3)       # 1~3の乱数を発生させる
    monster = monster + dir - 1     # 進んだ方向(dir)でモンスターを変更する

    if monster > 3 :                # 変更した結果が3を超えたら
        monster = monster - 3       # 1に修正する(モンスターは1~3)のため

    if monster == 1 :
        slime()                     # スライムが出現する
    elif monster == 2 :
        goblin()                    # ゴブリンが出現する
    else :
        dragon()                    # ドラゴンが出現する

    print("")                       # 見栄えを整えるための空行を表示

以下のようにして実行します。

python.exe adventure.py

すると、以下のように、3つの別れ道が示され、入力を求められます。
進む方向がどれかによって現れるモンスターがスライム、ゴブリン、ドラゴンのどれかが出現し、攻撃を受けて生命点(HP)が減りますが、スコア(得点)は1つ増えます。
攻撃力はスライムが一番弱いので、スライムをずっと選べると、最もよいスコアが得られます。

3つの分かれ道があります。
どれに進みますか?
1 ... 左   2 ... 真ん中   3 ... 右
1
スライムが現れた!
攻撃されてHPが90になった

3つの分かれ道があります。
どれに進みますか?
1 ... 左   2 ... 真ん中   3 ... 右
2
スライムが現れた!
攻撃されてHPが80になった

3つの分かれ道があります。
どれに進みますか?
1 ... 左   2 ... 真ん中   3 ... 右
1
ドラゴンが現れた!
攻撃されてHPが30になった

3つの分かれ道があります。
どれに進みますか?
1 ... 左   2 ... 真ん中   3 ... 右
3
ゴブリンが現れた!
やられた

スコア : 3

--- GAME OVER ---
(base) PS D:\blog\python_beginner_if>

プログラムを実行するまでの準備

プログラムを保存する場所の準備

AnacondaアナコンダPowershellパワーシェルPromptプロンプトをまず起動します。

上の画面上で、
cd      スペース  Doc Tab と入力すると、以下のようにcd Documents¥ となると思います。
これで、Documents というフォルダに移動します。

さきほど入力した文字 ”cd” とは、Powershellに出すコマンド(命令)です。
cd は ChangeチェンジDirectory ディレクトリ の略です。
ディレクトリ(=フォルダ)を移動するコマンドです。

このあと、Enter を押します。
すると、カーソルの左側の表示が”C:\Users\bobyt\Documents”に変わります。
これで移動できました、

では、プログラムを保存する場所(フォルダ)を作成します。
mkdir adventure Enter と入力します。
すると以下のようになります。(以下の画面では”nikko”となってますが、読み替えてください)

さきほど入力した mkdir とは、Powershellに出すコマンド(命令)です。
MaKe DIRectory の略です。
ディレクトリ(=フォルダ)を作成するコマンドです。

cd adventure Enter と入力します。
以下の通り、adventureに移動したことがわかります。(以下の画面では”nikko”となってますが、読み替えてください)

ちなみの、上記のフォルダはエクスプローラでは、以下の場所になります。
”ドキュメント”の下のadventureの下です。(以下の画面では”nikko”となってますが、読み替えてください)

プログラムを書く

では、プログラムを書きます。
いつでも誰でも使える『メモ帳』を起動します。
notepad adventure.py Enter と入力します。(以下の画面では”nikko”となってますが、読み替えてください)

ファイル adventure.py が見つかりません。新しく作成しますか?
と聞かれますので、”はい”を押します。(以下の画面では”nikko”となってますが、読み替えてください)

メモ帳が起動します。
当たり前ですが、まだ何も書かれていません。

ここにプログラムを書きます。

上書き保存してメモ帳を終了します。

最後に

今回はプログラムの基本構文についてのみ解説しました。
基本構文には、本記事で解説した以上に変化形がありますので、それらについてはまたの機会に解説します。

次回は、掲載したプログラムの中身について、わかりやすく解説しますので、ご期待ください。

この記事へのお問い合わせや、一歩踏み込んだサポートが必要な場合は、
ホームページからメールで受け付けています。お気軽にご連絡ください。

0

コメント

タイトルとURLをコピーしました