PROGRAM PYTHON

Pythonスクリプト【パラメーターを使った戦闘ゲーム】

 

パラメーターを使った戦闘ゲームを作ろう

前回はキャラクターの行動に対応するマトリックスからダメージ値を決定していました。

今回はキャラクターに攻撃力や防御力といったパラメーターを設定して、その値によってダメージ値を計算する戦闘ゲームを作ります。
ゲームのルールは、以下のようになります。

ルール

  • ユーザー側がプレイヤー、コンピューター側がモンスターとなる
  • ユーザー、コンピューターが同時に「攻撃」「防御」「魔法」のどれかを選択する
  • コンピューターの行動はランダムだが、行動に重みをつける
  • キャラクターの素早さに乱数を掛けた値の順に行動する
  • キャラクターの行動とパラメーターによってダメージ値を計算する
  • 先にHPが0になった方が負けとなる

 

実行イメージ

実行イメージは、以下のようになります。
ユーザーはa(攻撃)、b(防御)、c(魔法)のどれかを入力します。
qを入力するとゲームは終了します。

 実行例
> python game3.py
>>> 行動を選択してください
>>> a:攻撃 b:防御 c:魔法 q:終了
>>> a
++ プレイヤーは攻撃を実行! モンスターは3のダメージ
++ モンスターは攻撃を実行! プレイヤーは6のダメージ
:
:
>>> c
++ モンスターは攻撃を実行! プレイヤーは4のダメージ
++ プレイヤーは魔法を実行! モンスターは11のダメージ
 
++ モンスターを倒しました!!!!! ++

 

Pythonスクリプト

ゲームのPythonスクリプトは、以下のようになります。

 

スクリプト解説

2行目

exit()関数を使うので、sysライブラリーをインポートします。

3行目

random()関数を使うので、randomライブラリーをインポートします。

6行目

行動パターンの辞書を定義します。
aを入力したら「攻撃」、bを入力したら「防御」、cを入力したら「魔法」を実行します。

9、10行目

キャラクターのパラメーターをリストで設定します。
パラメーターの意味は、順に名前、HP、攻撃力、防御力、魔力、素早さです。

14~59行目

キャラクターに関するクラスを定義します。
このクラスは、キャラクターのパラメーターを設定して、ダメージ計算と素早さの補正を行います。

17~27行目

初期化メソッドを定義しています。
引数からキャラクターのパラメーターを受け取り、変数に代入します。
self.actnはキャラクターの「行動」、self.statはキャラクターの「状態」を表します。
self.actnはキャラクターの行動が決まった時に、攻撃、防御、魔法のどれかが代入されますが、self.statは実際に行動する時に攻撃、防御、魔法が代入されます。
それまでは「待機」という文言が代入されます。
初期値で代入している「None」は、値がまだ存在しないというPythonの定数です。

30~43行目

キャラクターが敵に与えるダメージ値を計算するメソッドです。
攻撃はキャラクターの攻撃力に1.00~1.99を掛けた値を返します。
防御は敵にダメージを与えないので0を返します。
魔法はキャラクターの魔力に1.00~1.99を掛けた値を返します。
なお、攻撃と魔法のダメージ値は、round()関数で小数点以下を四捨五入します。

46~59行目

キャラクターの素早さを補正するメソッドです。
ダメージ計算メソッドと同じように乱数を掛けて、さらに素早さが攻撃の場合は1倍、防御の場合は1.5倍、魔法の場合は0.5倍になるようにします。
防御は素早く行動することができますが、魔法は行動するのに時間がかかるということになります。

62~96行目

戦闘を行う関数を定義します。
引数のarg1は行動を実行するキャラクター、arg2は行動を受けるキャラクターです。

68~79行目

このif文は、行動するキャラクターの状態が攻撃の場合の処理です。
相手の状態が防御の場合は、相手の防御力が2倍になります。
相手に与えるダメージは、ダメージ計算メソッドで取得した値に相手の防御力を引いた値になります。

82~85行目

このif文は、行動するキャラクターの状態が防御の場合の処理です。
相手に与えるダメージは0になります。

88~93行目

このif文は、行動するキャラクターの状態が魔法の場合の処理です。
魔法は相手の防御力とは関係なしに、ダメージを与えることができます。

96行目

戦闘の状態を画面に表示します。

99、100行目

プレイヤーとモンスターのインスタンスを生成します。
引数のリストの前に*(アスタリスク)をつけると、リストの要素をひとつひとつの値として関数に渡すことができます。

103行目

while文を使ってループ処理に入ります。条件にTrueを使っているので、無限ループとなります。
どちらかのキャラクターのHPが0になるとexit()関数を呼び出して、スクリプトが終了します。
また、行動選択で、qを入力するとwhileループが終了します。

108行目

input()関数を使って、プレイヤーの行動を入力します。

111行目

qが入力された場合は、break文によりwhileループを抜けてスクリプトが終了します。

115行目

key()メソッドを使ってact_dic辞書からキーを抜き出し、list()関数でリストに変換しています。
そのリストをnot in条件で、a、b、c以外が入力された場合は、continue文によりwhileループの先頭に戻ります。

121行目

ユーザーが入力したキー(a、b、c)を元に、act_dic辞書からキーに対応した値(攻撃、防御、魔法)をplay.actn変数に代入します。

123行目

random.choices()関数によりact_dic辞書のキー(a、b、c)の中からランダムに取得して、その値(攻撃、防御、魔法)をmonst.actn変数に代入します。
また、weightsオプションによって、コンピューターの行動に相対的な重みをつけています。この場合は、攻撃8、防御1、魔法1の確率になります。
なお、random.choices()関数は結果をリストで返すので、[0]をつけて先頭の要素を指定しています。
random.choices()関数は、Pythonのバージョン3.6から追加されていますので、それ以前のバージョンのPythonでは使えません。

127、128行目

素早さ補正メソッドを呼び出して、キャラクターの行動に合わせた素早さの補正を行います。

131行目

キーを「キャラクター」、値を「素早さ」にした辞書を定義します。

134行目

131行目で定義した辞書を素早さの高い順に並び替えて、for文でループします。
character変数には、タプルに変換された要素([0]がキャラクター、[1]が素早さ)が代入されます。

138行目

プレイヤーの「状態」に、ユーザーが選択したプレイヤーの「行動」を設定します。

139行目

第1引数にプレイヤー、第2引数にモンスターのインスタンスを渡して、battle()関数を呼び出します。

143行目

モンスターの「状態」に、コンピューターがランダムで選択したモンスターの「行動」を設定します。

144行目

第1引数にモンスター、第2引数にプレイヤーのインスタンスを渡して、battle()関数を呼び出します。

147~154行目

どちらかのHPが0だった場合は、対応するメッセージを表示して、exit()関数でスクリプトを終了します。

 

-PROGRAM, PYTHON
-