コマンド選択式戦闘ゲームを作ろう
今回はランダム関数を使って、コマンド選択式の戦闘ゲームを作ります。
ゲームのルールは、以下のようになります。
ルール
- ユーザー側がプレイヤー、コンピューター側がモンスターとなる
 - ユーザー、コンピューターが同時に「攻撃」「防御」「魔法」のどれかを選択する
 - 選んだ行動の組み合わせによって、ダメージ判定を行う
 - 先に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文でループを抜けて、スクリプトを終了します。