コマンド選択式戦闘ゲームを作ろう
今回はランダム関数を使って、コマンド選択式の戦闘ゲームを作ります。
ゲームのルールは、以下のようになります。
ルール
- ユーザー側がプレイヤー、コンピューター側がモンスターとなる
- ユーザー、コンピューターが同時に「攻撃」「防御」「魔法」のどれかを選択する
- 選んだ行動の組み合わせによって、ダメージ判定を行う
- 先にHPが0になった方が負けとなる(両者同時に行動するので、相討ちもあり)
実行イメージ
実行イメージは、以下のようになります。
ユーザーはa(攻撃)、b(防御)、c(魔法)のどれかを入力します。
qを入力するとゲームは終了します。
実行例
> python game1.py
>>> 行動を選択してください
>>> a:攻撃 b:防御 c:魔法 q:終了
>>> c
++ プレイヤー >>> [魔法] HP[16]
++ モンスター >>> [攻撃] HP[18]
:
:
>>> 行動を選択してください
>>> a:攻撃 b:防御 c:魔法 q:終了
>>> b
++ プレイヤー >>> [防御] HP[ 1]
++ モンスター >>> [攻撃] HP[ 0]
++ モンスターを倒しました! ++
ダメージ判定マトリックス
ダメージ判定マトリックスは、以下のようになります。
たとえば、ユーザーが攻撃をしてコンピューターが魔法を使った場合、プレイヤーのHPが2、モンスターのHPが4減ります。
遊ぶときに、色々と変えてみると面白いでしょう。
ダメージ判定 | コンピューターの行動 | ||||||
攻撃 | 防御 | 魔法 | |||||
PのHP | MのHP | PのHP | MのHP | PのHP | MのHP | ||
ユーザーの行動 | 攻撃 | 3 | 3 | 3 | 1 | 2 | 4 |
防御 | 1 | 3 | 0 | 0 | 3 | 0 | |
魔法 | 4 | 2 | 0 | 3 | 1 | 1 |
メモ
PのHP:プレイヤーのHP
MのHP:モンスターのHP
Pythonスクリプト
ゲームのPythonスクリプトは、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
### インポート import random ### 行動パターン dic = {"a":"攻撃", "b":"防御", "c":"魔法"} ### ダメージマトリックス arr = ([[3,3],[3,1],[2,4]], # プレイヤー攻撃 [[1,3],[0,0],[3,0]], # プレイヤー防御 [[4,2],[0,3],[1,1]]) # プレイヤー魔法 ### HP初期値 play_hp = 20 mons_hp = 20 ### 戦闘が終了するまでループ while True: ### 行動入力 print(">>> 行動を選択してください") print(">>> a:攻撃 b:防御 c:魔法 q:終了") player = input(">>> ") ### 終了 if player == "q": break ### 入力エラー elif player not in list(dic.keys()): print("++ a:攻撃 b:防御 c:魔法 q:終了 を入力してください") print() continue ### 行動保存 play_act = dic[player] mons_act = dic[random.choice(list(dic.keys()))] ### 行動判定 if play_act == "攻撃" and mons_act == "攻撃": play_hp -= arr[0][0][0] mons_hp -= arr[0][0][1] elif play_act == "攻撃" and mons_act == "防御": play_hp -= arr[0][1][0] mons_hp -= arr[0][1][1] elif play_act == "攻撃" and mons_act == "魔法": play_hp -= arr[0][2][0] mons_hp -= arr[0][2][1] elif play_act == "防御" and mons_act == "攻撃": play_hp -= arr[1][0][0] mons_hp -= arr[1][0][1] elif play_act == "防御" and mons_act == "防御": play_hp -= arr[1][1][0] mons_hp -= arr[1][1][1] elif play_act == "防御" and mons_act == "魔法": play_hp -= arr[1][2][0] mons_hp -= arr[1][2][1] elif play_act == "魔法" and mons_act == "攻撃": play_hp -= arr[2][0][0] mons_hp -= arr[2][0][1] elif play_act == "魔法" and mons_act == "防御": play_hp -= arr[2][1][0] mons_hp -= arr[2][1][1] elif play_act == "魔法" and mons_act == "魔法": play_hp -= arr[2][2][0] mons_hp -= arr[2][2][1] ### マイナスなら0に設定 play_hp = max(0, play_hp) mons_hp = max(0, mons_hp) ### キャラクターの行動、残HPを表示 print("++ プレイヤー >>> [{}] HP[{:>2}]".format(play_act, play_hp)) print("++ モンスター >>> [{}] HP[{:>2}]".format(mons_act, mons_hp)) print() ### HP判定 if play_hp == 0 and mons_hp <= 0: print("++ 両者倒れました... ++") break elif play_hp == 0: print("++ プレイヤーは倒されました... ++") break elif mons_hp == 0: print("++ モンスターを倒しました! ++") break |
スクリプト解説
2行目
まず、random関数を使うので、randomライブラリーをインポートします。
5行目
行動パターンの辞書を定義します。
aを入力したら「攻撃」、bを入力したら「防御」、cを入力したら「魔法」を実行します。
8~10行目
ダメージ判定マトリックスの値を3次元のリストで表しています。
13、14行目
プレイヤーとモンスターのHPを定義します。
それぞれ20を設定しています。
17行目
while文を使ってループ処理に入ります。条件にTrueを使っているので、無限ループとなります。
キャラクターのHPが0になるか、qを入力するとループが終了します。
22行目
input()関数を使って、プレイヤーの行動を入力します。
25行目
qが入力された場合は、break文によりループを抜けてスクリプトが終了します。
29行目
key()メソッドを使ってdic辞書からキーを抜き出し、list()関数でリストに変換しています。
そのリストをnot in条件で、a、b、c以外が入力された場合は、continue文によりループの先頭に戻ります。
35行目
ユーザーが入力したキー(a、b、c)を元に、dic辞書からキーに対応した値(攻撃、防御、魔法)をplay_act変数に代入します。
36行目
random.choice()関数によりdic辞書のキー(a、b、c)の中からランダムに取得して、その値(攻撃、防御、魔法)をmonst_act変数に代入します。
39行目~65行目
プレイヤーとモンスターの行動をif文で判定して、その行動に対応する数字をそれぞれのHPから引き算します。
68、69行目
max()関数を使って、HPの値がマイナスだった場合は0にします。
72、73行目
プレイヤーとモンスターの行動と残りのHPの値を表示します。
77行目以降
HPの値が0だった場合は、対応するメッセージを表示してからbreak文でループを抜けて、スクリプトを終了します。