#python #ゲーム #if #条件分岐 #while #繰り返しループ #def #関数
本記事では1分以内に終わってしまうテキストだけのアドベンチャーゲームを材料に、プログラミングの基本に必要な処理について解説します。
内容が多いため、2回にわけて解説します。
なお、これらの基本的な処理は、プログラミングに限ったことではなく、日常生活にも影響してくる論理思考の素になります。
ぜひともご覧ください!
今回のプログラム
解説に入る前に、今回のプログラムを以下に示します。
早速実行してみたくなった方は、後述の『プログラムを実行するまでの準備』以降を参照して実行してみてください。
[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()”という具合に、“()”をつけることで実行します。
条件分岐
ここでは、プログラミングの基本に必要な条件分岐について解説します。
条件分岐とは、『もし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の中”)’を実行する』となります。
繰り返し
ここでは、『繰り返し』について解説します。
繰り返しを行なう場合、『~の間』、『~ごとに』、『~まで』という条件が伴います。
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 というフォルダに移動します。
このあと、Enter を押します。
すると、カーソルの左側の表示が”C:\Users\bobyt\Documents”に変わります。
これで移動できました、
では、プログラムを保存する場所(フォルダ)を作成します。
mkdir adventure Enter と入力します。
すると以下のようになります。(以下の画面では”nikko”となってますが、読み替えてください)
cd adventure Enter と入力します。
以下の通り、adventureに移動したことがわかります。(以下の画面では”nikko”となってますが、読み替えてください)
ちなみの、上記のフォルダはエクスプローラでは、以下の場所になります。
”ドキュメント”の下のadventureの下です。(以下の画面では”nikko”となってますが、読み替えてください)
プログラムを書く
では、プログラムを書きます。
いつでも誰でも使える『メモ帳』を起動します。
notepad adventure.py Enter と入力します。(以下の画面では”nikko”となってますが、読み替えてください)
ファイル adventure.py が見つかりません。新しく作成しますか?
と聞かれますので、”はい”を押します。(以下の画面では”nikko”となってますが、読み替えてください)
メモ帳が起動します。
当たり前ですが、まだ何も書かれていません。
ここにプログラムを書きます。
上書き保存してメモ帳を終了します。
最後に
今回はプログラムの基本構文についてのみ解説しました。
基本構文には、本記事で解説した以上に変化形がありますので、それらについてはまたの機会に解説します。
次回は、掲載したプログラムの中身について、わかりやすく解説しますので、ご期待ください。
この記事へのお問い合わせや、一歩踏み込んだサポートが必要な場合は、
ホームページからメールで受け付けています。お気軽にご連絡ください。
コメント