トラップがある迷路ゲームを作ろう
今回は前回作った迷路ゲームに、ランダムでトラップが発生するようにします。
プレイヤーキャラクターにHPを設定して、トラップによりHPが減っていき、HPが0になったらゲームオーバーとなります。
ただし、途中に回復ポイントを設けて、HPを回復できるようにします。
前回のスクリプトはこちらです。
今回の迷路は、以下のようなイメージになります。
S はスタート地点、G はゴール地点、H は回復ポイントです。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
0 | S | H | ||||||
1 | ||||||||
2 | ||||||||
3 | ||||||||
4 | ||||||||
5 | H | |||||||
6 | ||||||||
7 | G |
ゲームの仕様は、以下のようになります。
仕様
- 2次元リストを使って迷路のイメージを定義する
- 配列の要素の種類は0、1、2、3として、0は通行不可、1は通行可能、2はゴール、3は回復ポイントとする
- 移動キーは、wは上移動、sは下移動、aは左移動、dは右移動とする
- qキーでスクリプトを終了する
- キャラクターにHPを設定する
- ランダムにトラップが発生して、キャラクターがダメージを受ける
- キャラクターのHPが0になると、ゲームオーバーとなる
- 回復ポイントを設定して、そのマスに入るとキャラクターのHPが全快する
- ゴールに到達したらスクリプトを終了する
実行イメージ
実行イメージは、以下のようになります。
現在地は、2次元リストのインデックスで、[縦/横]という意味です。
qを入力するとゲームは終了します。
実行例
> python maze2.py
+++ 操作方法 [上:w][下:s][左:a][右:d][終了:q] +++
+++ 現在地 [0/0] +++
>>> s
+++ 現在地 [1/0] +++
>>> s
+++ 現在地 [2/0] +++
>>> d
+++ 現在地 [2/1] +++
>>> d
+++ トラップ発生!プレイヤーは 18 のダメージ +++
+++ プレイヤーのHPは 82 です +++
:
:
+++ 現在地 [1/6] +++
>>> w
+++ HPが全回復しました +++
:
:
>>> d
+++ トラップ発生!プレイヤーは 6 のダメージ +++
+++ プレイヤーのHPは 59 です +++
+++ 現在地 [6/7] +++
>>> s
+++ ゴール!! +++
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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
### インポート import random ### キー操作 UP, DOWN, LEFT, RIGHT = range(4) KEY_DIC = {"w":UP, "s":DOWN, "a":LEFT, "d":RIGHT} ### マップ ####### 0 1 2 3 4 5 6 7 ##### MAP = [[1,0,0,0,0,0,3,0], # 0 [1,0,0,1,1,1,1,0], # 1 [1,1,1,1,0,0,1,0], # 2 [0,0,0,0,1,1,1,0], # 3 [0,0,0,0,1,0,0,0], # 4 [0,0,0,3,1,1,1,0], # 5 [0,0,0,0,0,0,1,1], # 6 [0,0,0,0,0,0,0,2]] # 7 ### メッセージ MES_N_1 = "+++ 操作方法 [上:w][下:s][左:a][右:d][終了:q] +++" MES_N_2 = "+++ 現在地 [{:d}/{:d}] +++" MES_N_3 = "+++ ゴール!! +++" MES_N_4 = "+++ トラップ発生!プレイヤーは {:d} のダメージ +++" MES_N_5 = "+++ プレイヤーのHPは {:d} です +++" MES_N_6 = "+++ プレイヤーは死亡しました... +++" MES_N_7 = "+++ HPが全回復しました +++" MES_E_1 = "+++ キーが違います +++" MES_E_2 = "+++ 移動できません +++" ### 定数 MAX_HP = 100 ### 迷路クラス class Maze: ### 初期化メソッド def __init__(self, now_h, now_w): ### 現在地 self.now_h = now_h self.now_w = now_w self.turn = 1 ### 現在地表示 def draw(self): print(MES_N_2.format(self.now_h, self.now_w)) ### 移動 def move(self, u_input): ### 次位置 next_h = self.now_h next_w = self.now_w ### 上移動 if u_input == UP: next_h -= 1 if (next_h < 0) or (MAP[next_h][next_w] == 0): print(MES_E_2) else: self.now_h -= 1 ### 下移動 elif u_input == DOWN: next_h += 1 if (next_h > len(MAP)-1) or (MAP[next_h][next_w] == 0): print(MES_E_2) else: self.now_h += 1 ### 左移動 elif u_input == LEFT: next_w -= 1 if (next_w < 0) or (MAP[next_h][next_w] == 0) : print(MES_E_2) else: self.now_w -= 1 ### 右移動 elif u_input == RIGHT: next_w += 1 if (next_w > len(MAP[next_h])-1) or (MAP[next_h][next_w] == 0): print(MES_E_2) else: self.now_w += 1 ### ゴール確認 if MAP[self.now_h][self.now_w] == 2: print(MES_N_3) return True ### HP回復 if MAP[self.now_h][self.now_w] == 3: user.hp = MAX_HP print(MES_N_7) ### トラップ発生 trap = (self.turn + random.randrange(100) / 100) * random.randint(1, 5) if (trap > 9) and (MAP[self.now_h][self.now_w] == 1): ### ダメージ damage = random.randint(1, 20) user.hp -= damage user.hp = max(0, user.hp) ### プレイヤーHP表示 print(MES_N_4.format(damage)) print(MES_N_5.format(user.hp)) ### プレイヤー死亡によりゲームオーバー if user.hp == 0: print(MES_N_6) return True ### 初期化 self.turn = 0 ### ターンカウントアップ self.turn += 1 ### ゴールするまでFalseを返す return False ### キャラクタークラス class Character: ### 初期化メソッド def __init__(self, hp): ### ステータス self.hp = hp #################### ### メイン処理 #################### ### スタート地点 now_h = 0 now_w = 0 ### 迷路クラス生成 maze = Maze(now_h, now_w) ### ユーザー生成 user = Character(MAX_HP) ### 操作方法表示 print(MES_N_1) ### メインループ while True: ### 位置表示 maze.draw() ### 行動入力 input_key = input(">>> ") ### 終了 if input_key == "q": break ### 入力確認 for x in list(KEY_DIC.keys()): if input_key == x: break else: print(MES_E_1) continue ### 移動 rc = maze.move(KEY_DIC[input_key]) if rc == True: ### 終了 break |
スクリプト解説
今回は前回から変更になった部分を解説します。
前回までのスクリプトの解説も併せて参照してください。
94~96行目
入ったマスが回復ポイントだった場合は、キャラクターのHPを全回復します。
99行目
トラップが発生するかどうかの数値を取得します。
キャラクターが移動するたびにturn変数がカウントアップして、turn変数の値が大きいほどトラップが発生する確率が上がります。
100行目
トラップ発生数値が9以上かマスの値が1の場合は、トラップが発生します。
103行目
トラップによりキャラクターは1~20のダメージを受けます。
112~115行目
キャラクターのHPが0になると、ゲームオーバーとなります。
118行目
キャラクターがダメージを受けたら、turn変数を初期化します。
121行目
キャラクターが移動するたびに、turn変数はカウントアップします。
127~133行目
キャラクタークラスを定義します。
このクラスは、キャラクターのHPを設定します。
147行目
キャラクタークラスによって、キャラクターのインスタンスを生成します。
キャラクターの初期HPが設定されます。