忍者ブログ
なんとなくだらだらと。方向性はまだ決まってない。 当方のプログラムでは、山田巧さん作成のDXライブラリを利用させていただいてます。 本サイト http://homepage2.nifty.com/natupaji/DxLib/index.html DX Library Copyright (C) 2001-2008 Takumi Yamada.
[1] [30] [29] [28] [27] [26] [25] [24] [23] [22] [21]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

もっと早い段階で入れておくべきだったのか?
変更点考えただけで胃が痛くなる。

1.Unitクラスにint Agi 追加
2.初期化 Init を、この変更に対応させる
3.Init 呼んでる 敵味方のパラメーターに追加
4.戦闘 Battle() 関数に、「素早さによる攻撃順の決定」を追加


あれ?こんなもん?
導入したいのは[4]、それについてくる1~3は、簡単すぎて問題じゃない。


ああ、他にもあったあった。
5.街で Agi も鍛えられるように。
6.それに伴う、Traning まわりの修正。



軽い気持ちで 1~3、5、6までを修正してみる。
ああ、一覧作ってから修正に入ったほうがすげー気が楽だわ。
4を導入してないから、Agi はゲーム的に何の意味ももたないけど。



ダウンロード  Entry019.zip (2009.08.02)



修正1.2.メンバ変数の追加と初期化
Unit.h


class Unit
{
protected:
    string Name;    // 名前
    int MaxHP;      // 体力最大値
    int HP;         // 体力(現在値)
    int Atp;        // 攻撃力
    int Dfp;        // 防御力
    int Agi;        // 素早さ
    int Money;      // 所持金、モンスターは獲得金額
public:
    void Init(string Name, int HP,int Atp,int Dfp, int Agi, int Money);
    void ShowStatus();
    int Attack();
    int Defence();
    string getName(){return(Name);}
    int Hit(int dmg);
    void HealMax(){HP = MaxHP;}         // 体力最大まで回復
    int GetMoney(){return(Money);}

};

// 初期化
void Unit::Init(string Name, int HP, int Atp, int Dfp, int Agi, int Money)
{
    this->Name = Name;
    this->MaxHP = this->HP = HP;
    this->Atp = Atp;
    this->Dfp = Dfp;
    this->Agi = Agi;
    this->Money = Money;
}

// パラメーター表示
void Unit::ShowStatus()
{



この続きのShowStatus() に目が行ったけど、隠しというかモンスターの素早さまで
見えなくてもいいかなと思ったんで、ShowStatus() は変更せず。

修正3.パラメータ実体にAgi追加
main.cpp


void InitPlayer(Player &player)
{
    string name;
    cout << "あなたの名前を入れてください:";
    cin >> name;

    player.Init(name, 30, 8, 5, 6, 0);
}

void InitEnemyList(Unit (&eList)[MonsterMaxNum])
{
    eList[0].Init("ゴブリン",     12,  6,  3,  3,   5);
    eList[1].Init("ゴブ2号",     18,  7,  4,  5,  10);
    eList[2].Init("ゴブ大将",     24,  9,  5,  5,  30);
    eList[3].Init("がいこつ戦士", 30, 12,  8, 12,  50);
    eList[4].Init("あのひと",     99, 24, 24, 50,9999);

}




数字はいたって適当。
いちおう、攻撃力と同じ計算式で、素早さ≒期待値に持って行くつもり。
どれぐらい差がつけば、超えられない壁になるのか。怖い敵になるのか。
動いてみないと、わかりません!

ゆうしゃの初期値、素早さ6なら3~9、がいこつ戦士の素早さ12なら6~18
相当に運が悪くないと、レベル1ゆうしゃが先制することはできない。
でも、たまにぽろっと先制してしまう感じ。


修正点5.6.街メニューに「素早さ訓練」追加
main.cpp


Result TownEvent(Player& player)
{
    Result res;
    int cmd,cmdcnt = 0;
    static int stayPrice = 10;

    cout << "\n\n街にいます。\n";

    while(1){
        cmd = 0;
        res = NONE;
        player.ShowStatus();
        player.ShowMoney();
        cout << "\n1:出撃\n"
             << "2:宿屋(" << stayPrice << "G)      体力 " << player.getShowHP() << "\n"
             << "3:体力強化(" << player.TrainingCost(THP) <<"G)\n"
             << "4:攻撃訓練(" << player.TrainingCost(TAtk) <<"G)\n"
             << "5:防御訓練(" << player.TrainingCost(TDef) <<"G)\n"
             << "6:素早さ (" << player.TrainingCost(TAgi) <<"G)\n"
             << "9:終了\n"
             << "どうする?";
        if(cmdcnt){
            cin.clear();
            cin.ignore();
        }
        cin >> cmd;
        cout << "\n";
        switch(cmd){
            case 1:     // 出撃
                res = DEPARTURE;
                break;
            case 2:     // 宿泊
                player.Stay(stayPrice);
                break;
            case 3:     // 体力強化
                player.Training(THP);
                break;
            case 4:     // 攻撃訓練
                player.Training(TAtk);
                break;
            case 5:     // 防御訓練
                player.Training(TDef);
                break;
            case 6:     // 素早さ訓練
                player.Training(TAgi);
                break;
            case 9:
                res = ABORT;
                break;
        }




Player.h


// Player.h

#include "Unit.h"


enum TrainingMenu
{
    THP,            // 体力強化
    TAtk,           // 攻撃力強化
    TDef,           // 防御力強化
    TAgi            // 素早さ強化
};
const char *tMenu[] = {
    "体力",
    "攻撃力",
    "防御力",
    "素早さ"
};



class Player : public Unit
{




void Player::Training(TrainingMenu tM)
{
    int cost = TrainingCost(tM);
    int imp = 0;
    if(Money >= cost){
        Money -= cost;
        switch(tM){
            case THP:
                imp = MaxHP/12 + 1;
                MaxHP += imp;
                break;
            case TAtk:
                imp = 1;
                Atp ++;
                break;
            case TDef:
                imp = 1;
                Dfp++;
                break;
            case TAgi:
                imp = 1;
                Agi++;
                break;
        }
        cout << tMenu[tM] << "が " << imp << "上がった。\n";
    } else {
        cout << "お金がたりませんよ!\n";
    }
}

int Player::TrainingCost(TrainingMenu tM)
{
    int cost = 0;
    switch(tM){
        case THP:
            cost = (MaxHP/10)*5;
            break;
        case TAtk:
            cost = Atp*5;
            break;
        case TDef:
            cost = Dfp*5;
            break;
        case TAgi:
            cost = Agi*5;
            break;
    }
    return cost;
}




トレーニングメニュー enum Training 宣言を、Unitからこっちに持ってきた。
Unit 側にはトレーニングいらないから消しておけ。な。

Trainingメソッドのほうは、よくできてるなあ。両方に case ひとつ追加するだけ。



コンパイルしてみる。何事もなく通る。ちょっと怖い。
実行。

e019.png


ふむ。
素早さの表示はいらないかと思ってたけど、街でのこの表示は気になるなあ。

ちょうどこの部分、ShowStatus() と ShowMoney() 2行をいつもワンセットで呼んでたのが
気になってたんで、修正してやるか。


Unit.h



class Player : public Unit
{
public:
    void Stay(int price);               // 宿に泊まる
    void AddMoney(int gd);              // 金額加算
    //void ShowMoney();
    void ShowAllStatus();
    void Training(TrainingMenu tM);       // 強化訓練(3種)
    int  TrainingCost(TrainingMenu tM);   // 強化コスト
    string getShowHP();

};

void Player::ShowAllStatus()
{
    cout << "【" << Name << "】 HP:" << getShowHP() << "  Atp:" << Atp << "  Dfp:" << Dfp << "  Agi:" << Agi << "\n";
    cout << "現在の所持金:" << Money << "G\n";
}

void Player::AddMoney(int Gd)
{
    Money += Gd;
    cout << Name << "は、 " << Gd << "ゴールド手に入れた!\n";
    ShowAllStatus();
}




main.cpp



Result TownEvent(Player& player)
{
    Result res;
    int cmd,cmdcnt = 0;
    static int stayPrice = 10;

    cout << "\n\n街にいます。\n";

    while(1){
        cmd = 0;
        res = NONE;
        player.ShowAllStatus();
        cout << "\n1:出撃\n"





こんなもんかな。
メインディッシュには手もつけずに、このエントリ終われ。


ダウンロード  Entry019.zip (2009.08.02)

PR


忍者ブログ [PR]
カレンダー
02 2025/03 04
S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
フリーエリア
バーコード
ブログ内検索
P R
アクセス解析
カウンター