C言語を始めたころ「DOS窓相手にカチカチやってて何の役に立つんだよ!!」って思っていたけど
こーいうときに役に立つんだよね。
今のところスキル補正、パラメータ補正が何もない元祖FEの戦闘処理を再現した。
まだ実装する補正値を決めていないから、ヒットポイントの減算処理を施したら試しに実装かな?
再帰処理を始めて自分で考えて実装してみました。同じこと繰り返すには便利だね。
► スポイラーを表示
// fight.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#include "stdafx.h"
#include"class.h"
using namespace std;
charcter::charcter(){
}
charcter::~charcter(){
}
void charcter::OutPutParam(){
//ユニットパラメータ出力
printf("名前:%s HP [%d/%d] \n力:[%d] 魔力:[%d] 技:[%d] 幸運:[%d] 速さ:[%d] 守備力:[%d]\n",
cd.szName.c_str(),cd.HitPoint,cd.MaxHitPoint,cd.Power,cd.MagicPower,cd.SkillPoint,cd.Luck,cd.Speed,cd.Defence);
//武器パラメータ出力
string szWpKind;
if(wp.weponkind == 0)szWpKind = "剣";else if(wp.weponkind == 1)szWpKind = "槍";else if(wp.weponkind == 2)szWpKind = "斧";else if(wp.weponkind == 3)szWpKind = "その他";
if(wp.weponkind == 10)szWpKind = "炎魔法";else if(wp.weponkind == 11)szWpKind = "雷魔法";
else if(wp.weponkind == 12)szWpKind = "風魔法";else if(wp.weponkind == 13)szWpKind = "氷魔法";
else if(wp.weponkind == 14)szWpKind = "光魔法";else if(wp.weponkind == 15)szWpKind = "闇魔法";
printf("威力:[%d] 重さ:[%d] 武器命中率:[%d] 武器種別:[%s]\n",wp.attack,wp.weight,wp.hitparam,szWpKind.c_str());
printf("攻撃力:[%d] 命中率:[%d] 回避率:[%d] 攻撃速度:[%d]\n\n",rvp.rv_Attack,rvp.rv_HitParam,rvp.rv_EscapeParam,rvp.rv_attackspeed);
}
////剣 = 0 , 槍 = 1 , 斧 = 2 ,
////魔法炎 = 10 ,魔法雷 , = 11 ,魔法風 = 12 , 魔法氷 = 13 魔法光 = 14 魔法闇 = 15, その他 = 99
////武器三すくみ補正のための定数
//#define dSword 0
//#define dLance 1
//#define dAxe 2
//#define dFire 10
//#define dThunder 11
//#define dWind 12
//#define dIce 13
//#define dLight 14
//#define dDark 15
//#define dAny 99
//補正値をかけてパラメータを計算する
void charcter::RevisionCalc(){
if(wp.wepondistinctionFlag ==0) this->rvp.rv_Attack = this->cd.Power + this->wp.attack;//物理攻撃力の計算
else if(wp.wepondistinctionFlag == 1) this->rvp.rv_Attack = this->cd.MagicPower + this->wp.attack;//物理攻撃力の計算
else this->rvp.rv_Attack = 0;
rvp.rv_attackspeed = this->cd.Speed - this->wp.weight;
if(rvp.rv_attackspeed cd.SkillPoint * 2 + wp.hitparam;//命中率 技×2+武器(魔法)の命中率+指揮官補正+カリスマ補正+恋人補正 (%)
rvp.rv_EscapeParam = this->cd.Speed * 2 + cd.Luck;//回避率 速さ×2+幸運+指揮官補正+カリスマ補正+恋人補正+地形効果 (%)
}
//キャラクタークラスのコンストラクタでパラメータを初期化
charcter::charcter(string name,int seed){
//実際の実装ではDXライブラリのGetRand()関数を使用してください
srand(rand());
//初期パラメータの設定
cd.szName = name;
int hitpoint = rand() % 59 + 21;
cd.HitPoint = hitpoint;
cd.MaxHitPoint = hitpoint;
cd.Power = rand() % 29 + 1;
cd.MagicPower = rand() % 29 + 1;
cd.SkillPoint = rand() % 29 + 1;
cd.Luck = rand() % 29 + 1;
cd.Speed = rand() % 29 + 1;
cd.MagicDefence = rand() % 29 + 1;
cd.Defence = rand() % 29 + 1;
//武器パラメータの設定
wp.attack = rand() % 29 + 1;
wp.weight = rand() % 19 + 1;
wp.hitparam = rand() % 30 + 70;
//武器種類の決定
int select = rand() % 2;
if(select == 0) wp.weponkind = rand() % 4;
else wp.weponkind = rand() % 5 + 10;
//武器区別の代入
if(wp.weponkind == dSword || wp.weponkind == dLance || wp.weponkind == dAxe){
wp.wepondistinctionFlag = 0;//物理武器というフラグを代入 後々攻撃力の計算で使用します
}else if(wp.weponkind == dFire || wp.weponkind == dThunder || wp.weponkind == dWind|| wp.weponkind == dIce || wp.weponkind == dLight ||wp.weponkind == dDark){
wp.wepondistinctionFlag = 1;//魔法武器というフラグを代入
}else{
wp.wepondistinctionFlag = 99;//その他ー
}
};
Fight::Fight(charcter ss,charcter cc){
/*実効命中率の決定*/
//先行側実効命中率
s_HitParam = ss.rvp.rv_HitParam - cc.rvp.rv_EscapeParam;
c_HitParam = cc.rvp.rv_HitParam - ss.rvp.rv_EscapeParam;
/*ここまで*/
printf("先行命中率 = [%d] , 後攻命中率 = [%d]\n",s_HitParam,c_HitParam);
/*ここから*/
//攻撃回数の決定
if(ss.rvp.rv_attackspeed > cc.rvp.rv_attackspeed + 4){
s_AttackNumber = 2;
c_AttackNumber = 1;
return;
}
//攻撃回数の決定
if(ss.rvp.rv_attackspeed + 4 0){
//計算フェーズ
int nRand = rand() % 100;//命中乱数の取得
if(nRand rvp.rv_Attack - c->cd.Defence;
if(nDamage cd.szName.c_str());
printf("%dのダメージを与えた\n",nDamage);
}else{
printf("攻撃ミス 取得した乱数の値 = %d\n",nRand);
}
s_AttackNumber -= 1;
}
if(c_AttackNumber > 0){
//計算フェーズ
int nRand = rand() % 100;//命中乱数の取得
if(nRand rvp.rv_Attack - s->cd.Defence;
if(nDamage cd.szName.c_str());
printf("%dのダメージを与えた\n",nDamage);
}else{
printf("攻撃ミス 取得した乱数の値 = %d\n",nRand);
}
c_AttackNumber -= 1;
}
if(s_AttackNumber == 0 && c_AttackNumber == 0){
return;
}else{
FightStart(s,c);
}
}
//メイン関数
int _tmain(int argc, _TCHAR* argv[])
{
srand((unsigned) time(NULL));
int seed = rand() % 10;
charcter ch("プレイヤー",seed),ch2("エネミィ",seed);
Fight *f;
ch.RevisionCalc();
ch2.RevisionCalc();
ch.OutPutParam();
ch2.OutPutParam();
f = new Fight(ch,ch2);
f->FightStart(&ch,&ch2);
return 0;
}
名前:プレイヤー HP [78/78]
力:[24] 魔力:[2] 技:[4] 幸運:[20] 速さ:[27] 守備力:[11]
威力:[25] 重さ:[3] 武器命中率:[94] 武器種別:[槍]
攻撃力:[49] 命中率:[102] 回避率:[74] 攻撃速度:[24]
名前:エネミィ HP [45/45]
力:[24] 魔力:[21] 技:[9] 幸運:[10] 速さ:[16] 守備力:[8]
威力:[21] 重さ:[16] 武器命中率:[90] 武器種別:[斧]
攻撃力:[45] 命中率:[108] 回避率:[42] 攻撃速度:[0]
先行命中率 = [60] , 後攻命中率 = [34]
プレイヤーの攻撃
41のダメージを与えた
攻撃ミス 取得した乱数の値 = 94
プレイヤーの攻撃
41のダメージを与えた
続行するには何かキーを押してください . . .