ここにコードの概要があります
コードの概要
1.インポート
import pygame
from pygame import *
import sys
import time
import random
2.関数
部分一致で値を取得する関数 改行してテキストを描画する関数
2列×3行のテキストを描画する関数
BGMの関数 ステータスウィンドウ描画の関数
3.セットアップ
パス 名前 カーソル テキスト上昇 ウィンドウのフラグ
インデックス フェーズ ダメージエフェクト
まほう キャラ アイテム レクト コマンドテキスト 勇者のステータス
ステータステキスト モンスター関連
4.描画
ステータスウィンドウ モンスター画像 コマンドウィンドゥ
魔物選択ウィンドゥ キャラの選択ウィンドゥ まほうの選択ウィンドゥ
アイテム選択ウィンドゥ バトルメッセージウィンドゥ
プレイヤーのダメージエフェクト + 敗北判定
モンスターのダメージエフェクト + 倒したかどうかの判定
まほう(色付き半透明レクト)
5.キーハンドラー
Zキー:
(あらわれた! たたかうコマンド まほうコマンド アイテムコマンド
コマンドの登録と初期化 コマンドの登録とフラグ こうげきメッセージ
まほうメッセージ ガードメッセージ アイテムメッセージ
にげるメッセージ ターン終了 MP判定
モンスターへ与えるこうげきダメージ計算
モンスターへ与えるまほうダメージ計算 まほう回復 アイテム回復
倒した時の処理と自動送り プレイヤーに与えるダメージ計算
ワンテンポ置くとテキスト上昇のループとレベルアップのループ
経験値とお金 レベルアップ ステータス上昇 画面を閉じる)
方向キー:
(コマンドの方向キー、魔物選択の方向キー
キャラ選択の方向キー まほう選択の方向キー
アイテム選択の方向キー)
ここに変数の説明があります
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
魔物がターゲットを決めたインデックス
ここにコードの説明があります
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': }, {'masic_name': 'ダメラ', 'MP': 2, '数値': 10, 'masic_effect': 1, 'masic_type': '攻撃まほう', 'surface': }], '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': }], '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': }], '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': }, {'masic_name': 'ダメラ', 'MP': 2, '数値': 10, 'masic_effect': 1, 'masic_type': '攻撃まほう', 'surface': }], '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': }, {'masic_name': 'ダメラ', 'MP': 2, '数値': 10, 'masic_effect': 1, 'masic_type': '攻撃まほう', 'surface': }]
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': }
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が2なら2
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) が3、モンスター3体
len(mon_group_list) -1が2、モンスター3体の末尾のインデックス
モンスターが倒されてモンスター数が変更
len(mon_group_list) が2、モンスター2体
len(mon_group_list) -1が1、モンスター2体の末尾のインデックス
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