_


[新RPGの目次](https://qiita.com/hijpa/items/31900e327315fa8e4eea)

<details><summary>ここにコードの概要があります</summary>

コードの概要
1.インポート:star:
　import pygame
　from pygame import *
　import sys
　import time
　import random
　

2.関数:hammer_pick:
　部分一致で値を取得する関数　改行してテキストを描画する関数
　2列×3行のテキストを描画する関数
　BGMの関数　ステータスウィンドウ描画の関数

3.セットアップ:gear:
　パス　名前　カーソル　テキスト上昇　ウィンドウのフラグ　
　インデックス　フェーズ　ダメージエフェクト　
　まほう　キャラ　アイテム　レクト　コマンドテキスト　勇者のステータス
　ステータステキスト　モンスター関連

4.描画:art:
　ステータスウィンドウ　モンスター画像　コマンドウィンドゥ
　魔物選択ウィンドゥ　キャラの選択ウィンドゥ　まほうの選択ウィンドゥ　
　アイテム選択ウィンドゥ　バトルメッセージウィンドゥ

　プレイヤーのダメージエフェクト ＋ 敗北判定
　モンスターのダメージエフェクト ＋ 倒したかどうかの判定

　まほう(色付き半透明レクト)

5.キーハンドラー:keyboard:
　Zキー：
　(あらわれた！　たたかうコマンド　まほうコマンド　アイテムコマンド　
　コマンドの登録と初期化　コマンドの登録とフラグ　こうげきメッセージ
　まほうメッセージ　ガードメッセージ　アイテムメッセージ　
　にげるメッセージ　ターン終了　 MP判定
　モンスターへ与えるこうげきダメージ計算
　モンスターへ与えるまほうダメージ計算　まほう回復　アイテム回復
　倒した時の処理と自動送り　プレイヤーに与えるダメージ計算
　ワンテンポ置くとテキスト上昇のループとレベルアップのループ
　経験値とお金　レベルアップ　ステータス上昇　画面を閉じる)　

　方向キー：
　(コマンドの方向キー、魔物選択の方向キー　
　キャラ選択の方向キー　まほう選択の方向キー
　アイテム選択の方向キー)

</details>

<details><summary>ここに変数の説明があります</summary>


1.lines
　バトルメッセージのリスト
          
2.text_up
　テキスト上昇のフラグ
          
3.up_num
　テキスト上昇値
          
4.all_select
　戦闘準備の終了フラグ
　if not all_select:の内側の処理を一度だけ実行するため
          
5.turn_num
　ターン数を数える
　status_data += player_dataを一度だけ実行するため
          
6.cmd_chara_index
　コマンド入力の順番
          
7.status_x_dict
　ステータスウィンドウx座標
　player_data{"x"}も同じ
          
8.player_data{"attack_on"}
　自動送りの調整
　まだ攻撃してないプレイヤーのmon_select_indexを調整
　これがないと選択したのとは別のモンスターを攻撃してしまう。

　ターン終了条件を満たす
　行動後に倒された場合、actor_index -= 1にするため。
 
          
9.level_up_index
　各レベルの必要経験値を取得
          
10.level_up_chara_num
　レベルアップの順番
          
11.hit and miss
　各種ステータスに適用
　0ならステータスアップ
　1ならそのまま
          
12.status_names
　テキスト表示用のステータスの名称
          
13.status_names_dict
　ステータスの名称を辞書player_dataのキーに置き換えるための辞書
          
14.up_list
　ステータス上昇値のリスト
          
15.mon_group_list2
　変更しないモンスターの名前リスト
　この名前を使って経験値やお金の値を取得

16.status_data"attack_on"
　モンスターが攻撃した後にそのモンスターがプレイヤーに倒された場合、
　actor_indexを調整
　これがないとターンの終了条件が満たされない
          
17.player_select_list
　魔物がターゲットを決めるインデックスリスト
          
18.player_select_index
　魔物がターゲットを決めたインデックス
          


</details>

<details><summary>ここにコードの説明があります</summary>

---

1ステータスウィンドウの描画
　player_select_indexがまだないからphaseを分ける　

---
          
2player_data[cmd_chara_index]["masic_list"][player_data[cmd_chara_index]["masic_index"]]["masic_type"]

player_data

[{'type': 'player', 'name': 'ゆうしゃ', 'Max_HP': 53, 'HP': 53, 'Max_MP': 5, 'MP': 5, 'strength': 33, 'defence': 2, 'quickness': 6, 'level': 1, 'first_letter': 'ゆ', 'x': 20, 'masic_list': [{'masic_name': 'ホイムン', 'MP': 3, '数値': 30, 'masic_effect': 2, 'masic_type': '補助まほう', 'surface': <Surface(640x480x32 SW)>}, {'masic_name': 'ダメラ', 'MP': 2, '数値': 10, 'masic_effect': 1, 'masic_type': '攻撃まほう', 'surface': <Surface(640x480x32 SW)>}], 'item_list': ['やくそう', 'げんきのかけら', 'まほうのしずく', 'ひかりのたま'], 'item_effect': 0, 'cmd_index': 0, 'masic_index': 0, 'mon_select_index': 0, 'item_index': 0, 'chara_index': 0, 'attack_on': 0},
 {'type': 'player', 'name': 'せんし', 'Max_HP': 42, 'HP': 42, 'Max_MP': 0, 'MP': 0, 'strength': 3, 'defence': 6, 'quickness': 3, 'level': 1, 'first_letter': 'せ', 'x': 140, 'masic_list': [], 'item_list': ['やくそう'], 'item_effect': 0, 'cmd_index': 0, 'masic_index': 0, 'mon_select_index': 0, 'item_index': 0, 'chara_index': 0, 'attack_on': 0}, 
{'type': 'player', 'name': 'まどうし', 'Max_HP': 36, 'HP': 36, 'Max_MP': 10, 'MP': 10, 'strength': 2, 'defence': 3, 'quickness': 5, 'level': 1, 'first_letter': 'ま', 'x': 260, 'masic_list': [{'masic_name': 'ダメラ', 'MP': 2, '数値': 10, 'masic_effect': 1, 'masic_type': '攻撃まほう', 'surface': <Surface(640x480x32 SW)>}], 'item_list': ['やくそう', 'せいすい', 'まほうのしずく'], 'item_effect': 0, 'cmd_index': 0, 'masic_index': 0, 'mon_select_index': 0, 'item_index': 0, 'chara_index': 0, 'attack_on': 0}, 
{'type': 'player', 'name': 'そうりょ', 'Max_HP': 30, 'HP': 30, 'Max_MP': 9, 'MP': 9, 'strength': 1, 'defence': 2, 'quickness': 4, 'level': 1, 'first_letter': 'そ', 'x': 380, 'masic_list': [{'masic_name': 'ホイムン', 'MP': 3, '数値': 30, 'masic_effect': 2, 'masic_type': '補助まほう', 'surface': <Surface(640x480x32 SW)>}], 'item_list': ['やくそう', 'まほうのしずく'], 'item_effect': 0, 'cmd_index': 0, 'masic_index': 0, 'mon_select_index': 0, 'item_index': 0, 'chara_index': 0, 'attack_on': 0}]

player_data[cmd_chara_index]

{'type': 'player', 'name': 'ゆうしゃ', 'Max_HP': 53, 'HP': 53, 'Max_MP': 5, 'MP': 5, 'strength': 33, 'defence': 2, 'quickness': 6, 'level': 1, 'first_letter': 'ゆ', 'x': 20, 'masic_list': [{'masic_name': 'ホイムン', 'MP': 3, '数値': 30, 'masic_effect': 2, 'masic_type': '補助まほう', 'surface': <Surface(640x480x32 SW)>}, {'masic_name': 'ダメラ', 'MP': 2, '数値': 10, 'masic_effect': 1, 'masic_type': '攻撃まほう', 'surface': <Surface(640x480x32 SW)>}], 'item_list': ['やくそう', 'げんきのかけら', 'まほうのしずく', 'ひかりのたま'], 'item_effect': 0, 'cmd_index': 0, 'masic_index': 0, 'mon_select_index': 0, 'item_index': 0, 'chara_index': 0, 'attack_on': 0}

player_data[cmd_chara_index]["masic_list"]

[{'masic_name': 'ホイムン', 'MP': 3, '数値': 30, 'masic_effect': 2, 'masic_type': '補助まほう', 'surface': <Surface(640x480x32 SW)>}, {'masic_name': 'ダメラ', 'MP': 2, '数値': 10, 'masic_effect': 1, 'masic_type': '攻撃まほう', 'surface': <Surface(640x480x32 SW)>}]

player_data[cmd_chara_index]["masic_list"][player_data[cmd_chara_index]["masic_index"]]

{'masic_name': 'ホイムン', 'MP': 3, '数値': 30, 'masic_effect': 2, 'masic_type': '補助まほう', 'surface': <Surface(640x480x32 SW)>}

player_data[cmd_chara_index]["masic_list"][player_data[cmd_chara_index]["masic_index"]]["masic_type"]

補助まほう

---
          
3
if player_data[cmd_chara_index]["item_list"]:
    player_data[cmd_chara_index]["item_index"] = item_index
    player_data[cmd_chara_index]["item_effect"] = item_effect
    none_key = item_data.get(player_data[cmd_chara_index]["item_list"][player_data[cmd_chara_index]["item_index"]])  # 存在しない場合は None
    if none_key is not None:
        item_effect = item_data[player_data[cmd_chara_index]["item_list"][player_data[cmd_chara_index]["item_index"]]]["item_effect"]
    elif none_key == None:
        item_effect = 1

item_effectで、キャラ選択ウィンドウや魔物選択ウィンドゥを
表示非表示を判定するためのコード

---
          
4
if player_data[player_select_index]["HP"] <= 0:
    if player_data[player_select_index]["attack_on"] == 1:
        actor_index -= 1

行動した後に倒されたら、actor_indexを減らす。
ターンの終了条件を満たすため。

---
          
5
del status_data[player_select_index_list.index(player_select_index) + len(mon_group_list)]
del player_select_index_list[player_select_index_list.index(player_select_index)]

キャラが死亡したら
status_dataから削除。行動しなくなる。
player_select_indexから削除。モンスターから狙われなくなる。

.index()で値を指定して、その値のインデックスを取得。

player_select_index_list = [0,1,2,3]  
player_select_index_list.index(player_select_index)
player_select_indexが２なら２

---
       
6
 elif phase == 1 and cmd_index == 1 and chara_group_list[cmd_chara_index] != "せんし":
    player_data[cmd_chara_index]["masic_index"] = masic_index

魔物選択ウィンドゥかキャラ選択ウィンドウのどちらを開くかの判定のため。
インデックスを登録。

---
         
7
 if command:
    for i, item in enumerate(player_data):
        if i <= cmd_chara_index:
            continue
        if item["HP"] == 0:
            cmd_chara_index += 1
        else:
            break

先頭から生存者の間までの、死亡したキャラのコマンド表示をしない。

---
         
8
if cmd_chara_index < len(chara_group_list) - 1:
    player_data[cmd_chara_index]["cmd_index"] = cmd_index
    player_data[cmd_chara_index]["mon_select_index"] = mon_select_index
    player_data[cmd_chara_index]["chara_index"] = chara_index
    cmd_chara_index += 1
    mon_select_index = 0
    masic_index = 0
    item_index = 0
    masic_phase = 0                        
    item_phase = 0
    masic_effect = 0
    item_effect = 0
    chara_index = 0
    cmd_index, cmd_num1,cmd_num2 = 0, 0, 0
    sound.play()
    battle_message, command, masic_select, item_select, cmd_cursor, mon_select = False, True, False, False, True, False
    phase = 1

全てのキャラのコマンド入力が終わってなければ、
インデックスを登録したあと、インデックスなどを初期化して次のキャラへ。 

---
         
9
 if not all_select:
    player_data[cmd_chara_index]["cmd_index"] = cmd_index
    player_data[cmd_chara_index]["masic_index"] = masic_index
    player_data[cmd_chara_index]["mon_select_index"] = mon_select_index
    player_data[cmd_chara_index]["chara_index"] = chara_index
    if turn_num <= 1:
        status_data += player_data

最後尾のキャラのインデックスの登録。
status_dataにplayer_dataを一度だけ追加。 

---
        
10
for item in player_data:
    if item["HP"] == 0:
        cmd_chara_index += 1
    else:
        break

途中にいる死亡キャラのコマンドを表示しない。

---
          
11
#自動送り
for data in status_data2:
    if data["type"] == "player":
        # 範囲外を防ぐ
        if data["mon_select_index"] > len(mon_group_list) - 1:
            data["mon_select_index"] = len(mon_group_list) - 1
        # ターゲットがズレるのを防ぐ
        elif data["attack_on"] == 0:
            if current_actor["mon_select_index"] < data["mon_select_index"]:
                data["mon_select_index"] -= 1
  
末尾のインデックスを指定していたが、攻撃前に別のキャラに倒されたとき、
インデックスをずらす。

範囲がを防ぐ　例）
data["mon_select_index"]が2
len(mon_group_list) が３、モンスター３体
len(mon_group_list) -1が２、モンスター３体の末尾のインデックス

モンスターが倒されてモンスター数が変更

len(mon_group_list) が２、モンスター２体
len(mon_group_list) -1が１、モンスター２体の末尾のインデックス
 
data["mon_select_index"] = len(mon_group_list) - 1
data["mon_select_index"] = 1

-----------------------------

攻撃前に別のキャラが、前のインデックスを指定したモンスターを倒した時、インデックスをずらす。

elif data["attack_on"] == 0:
まだ攻撃してないキャラ。

current_actor["mon_select_index"]
敵を倒したキャラの魔物選択のインデックス。
ex) 0

data["mon_select_index"]
まだ攻撃してない魔物選択のインデックス。
ex) 1

data["mon_select_index"] -= 1
ex) 1 - 1 で 0
     
---

</details>