PROGRAM PYTHON

Pythonスクリプト【複数キャラクターによる戦闘ゲーム】

 

複数のキャラクターを使った戦闘ゲームを作ろう

前回は敵と味方のキャラクターは1対1でしたが、今回は3対3の戦闘ゲームを作ります。

サンプルスクリプトは3対3の戦闘ですが、これが5対5になってもリストにキャラクターを追加するだけで、作りは変わらないようにプログラミングしています。
ゲームのルールは、以下のようになります。

ルール

  • ユーザー側がプレイヤー、コンピューター側がモンスターとなる
  • それぞれのキャラクターは3人ずつとする
  • ユーザー側、コンピューター側のすべてのキャラクターが行動を選択してから戦闘を開始する
  • コンピューター側の行動はランダムだが、キャラクターごとに行動の重みをつける
  • キャラクターの素早さに乱数を掛けた値の順に行動する
  • 攻撃する相手はランダムに決定する
  • キャラクターの行動とパラメーターによってダメージ値を計算する
  • 先にすべてのキャラクターのHPが0になった方が負けとなる

 

実行イメージ

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

 実行例
> python game4.py
>>> 行動を選択してください
>>> a:攻撃 b:防御 c:魔法 q:終了
[プレイヤーA] >>> a
[プレイヤーB] >>> a
[プレイヤーC] >>> c
++ プレイヤーBは攻撃を実行! モンスターBは9のダメージ
++ モンスターBは魔法を実行! プレイヤーBは8のダメージ
++ モンスターCは魔法を実行! プレイヤーCは11のダメージ
++ プレイヤーCは魔法を実行! モンスターBは15のダメージ
++ プレイヤーAは攻撃を実行! モンスターCは6のダメージ
++ モンスターAは攻撃を実行! プレイヤーBは6のダメージ
-----------------
++ プレイヤーA:HP[30]
++ プレイヤーB:HP[11]
++ プレイヤーC:HP[9]
-----------------
:
:
[プレイヤーA] >>> a
++ プレイヤーAは攻撃を実行! モンスターAは8のダメージ
<< モンスターAを倒しました!!!!! >>
-----------------
++ プレイヤーA:HP[5]
-----------------
 
+++++++++++++++++
++ モンスターは全滅しました ++
+++++++++++++++++

 

Pythonスクリプト

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

 

スクリプト解説

今回はスクリプトが長くなったので、前回と同じ部分は割愛します。
前回の解説と合わせて参照してください。

10~15行目

プレイヤー側とモンスター側のキャラクターのパラメーターをリストで定義します。

19~21行目

キャラクターの行動の重みを定義します。

79~87行目

引数で渡された相手キャラクターがすでに倒されていた場合の処理です。
防御を選んだ場合と攻撃対象がすでに倒されていた場合は、メッセージを表示して関数を終了します。

124~133行目

キャラクターが倒された場合は、そのキャラクターのインスタンスをリストから削除します。
リストの要素を削除するとリストの順番がずれてしまい、複数の要素を削除しようとすると想定と違った動きになります。
そのため、リストの要素を削除する関数を作り、元の要素数分この関数を呼び出します。

138~145行目

プレイヤーとモンスターのキャラクター数分、それぞれのリストにインスタンスを作ります。

154行目

ユーザーが選択したプレイヤーの行動を保存するための辞書を定義します。

175行目

ユーザーが選択したプレイヤーの行動を辞書に設定します。

178、179行目

入力エラーがあった場合は、while文の先頭に戻り、最初から入力をやり直すようにします。

182行目

行動順辞書を定義します。
ここには、戦闘に参加するキャラクターがすべて設定されます。

185~193行目

プレイヤー側の行動を行動順辞書に設定します。

196~211行目

モンスター側の行動を行動順辞書に設定します。

197~204行目

モンスターの行動パターンによって、行動の重みを設定します。
何も設定されていなければ、同じ割合で行動が選択されます。

206行目

モンスターの行動を設定した重みの割合に合わせてランダムに設定します。

222、245行目

先に行動したキャラクターによって、順番がきたキャラクターがすでに倒されていた場合は行動をスキップします。

229、252行目

攻撃するキャラクターをランダムに選択します。

263~268行目

倒されたキャラクターのインスタンスをリストから削除します。

271~275行目

プレイヤー側のリストから残っているキャラクターの名前とHPを表示します。
プレイヤー側が全滅している場合は表示しません。

278~290行目

どちらかのリストから生成したインスタンスがすべて削除されていた場合は、メッセージを表示してwhile文を終了します。

 

-PROGRAM, PYTHON
-