忍者ブログ
なんとなくだらだらと。方向性はまだ決まってない。 当方のプログラムでは、山田巧さん作成のDXライブラリを利用させていただいてます。 本サイト http://homepage2.nifty.com/natupaji/DxLib/index.html DX Library Copyright (C) 2001-2008 Takumi Yamada.
[19] [18] [17] [16] [15] [14] [13] [12] [11] [10] [9]
×

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

勇者は戦いの旅に出て、そして街に逃げ帰る。
宿屋で回復して、また戦いの旅に出る。

経験を積んで少しづつ強くなっていければいいのだけど、まだそこまで手が回らない。

CRPG014.png



ダウンロード entry009.zip(2009.07.30)





このへんの流れは、今はメインルーチンで扱ってる感じ。

【街】
・宿屋(体力回復)
・出撃

【戦闘】
・プレイヤーにモンスターを順番に紹介していく
・戦闘自体は Battle() 関数に丸投げ。

街のほうの処理も、今は直接書いてなんとかなる量に見えるけど、仕事が多くなってきたら
別の関数に分けたほうがいいよな。
そんなに遠い話じゃなくて、次ぐらいだと思う。
宿泊無料サービスやめて金を取るようになったら、すぐにコードが肥大化するのは目に
見えてる。


main.cpp


int main()
{
    int res;
    int cmd,cmdcnt;
    srand(static_cast<unsigned int>(time(NULL)));

    Unit player,enemy,eList[5];
    player.Init("ゆうしゃ", 30, 8, 5);

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

    while(1)
    {
        // 街
        cout << "\n\n街にいます。\n";
        cmdcnt=0;
        while(1){
            cmd = 0;
            cout << "どうする?(1:出撃 2:宿屋 9:終了):";
            if(cmdcnt){
                cin.clear();
                cin.ignore();
            }
            cin >> cmd;
            cout << "\n";
            if(cmd == 1) break;
            if(cmd == 2) {
                cout << player.getName() << "は宿に泊まった。体力が回復した。\n";
                player.HealMax();
            }
            if((++cmdcnt)>10){cmd = 9; break;}   //無限ループ防止
            if(cmd == 9) break;
        }
        if(cmd == 9) break;      // あばば状態のとき、終了のお知らせ。

        // 戦闘
        for(int i=0;i<5;++i)
        {
            enemy = eList[i];
            res = Battle(player,enemy);
            if(res==2){         // プレイヤー勝利
                cout << "勝ち。\n";
            } else break;
        }
        if(res==2){
            // 戦闘勝利で終了してるってことは、大勝利の予感
            cout << "\n\n*+*+*  完 全 勝 利 !!  *+*+*\n";
            cout << "勇者 " << player.getName() << " の名を永遠に称えるがよい。\n\n";
            break;  // ゲーム終了
        }
        if(res==3){
            cout << player.getName() << " は死亡した。\n\n-GAME OVER-\n";
            break;  // ゲーム終了
        }
        if(res==9) break;    // 「終了」コマンド選択
    }

    cout << "\n\n終了。" << endl;
    return 0;
}



メインルーチンごっそり変更。
どこがどう変わったのか、すでに原型をとどめてないぜ。
色塗ってるけど、たぶん間違いなくおかしいはず。
もういちど自分のサイト見ながら間違い探ししないとなあ。
いちおう用意してるダウンロードファイルは、間違いなくコンパイル通って動くから、そこは安心。


処理的には、while()無限ループの中でふたつの大きな処理に分かれる。
前半部分が【街】モード。宿屋で回復して戦闘に赴く。
後半部分が【戦闘】モード。新たなモンスターとの出会いを演出して、その結果を捌く。


【街】モードの回復について。
どこまで回復させていいのかわからんよな。
最大体力をどこかで記録しておかないと。

あと、宿屋の処理で Unit.HealMax() って勝手に作った。
Maxついてるのは、後にキャラクタに薬草持たせて、戦闘中や戦闘後に飲んでもらいたいから。
完全じゃない回復も追加の予定。

Unit.h


#pragma once

class Unit
{
    string Name;    // 名前
    int MaxHP;      // 体力最大値
    int HP;         // 体力(現在値)
    int Atp;        // 攻撃力
    int Dfp;        // 防御力
public:
    void Init(string Name, int HP,int Atp,int Dfp);
    void ShowStatus();
    int Attack();
    int Defence();
    string getName(){return(Name);}
    int Hit(int dmg);
    void HealMax(){HP = MaxHP;}         // 体力最大まで回復
};
// 初期化
void Unit::Init(string Name, int HP, int Atp, int Dfp)
{
    cout << "Init:"<< Name << "\n";
    this->Name = Name;
    this->MaxHP = this->HP = HP;
    this->Atp = Atp;
    this->Dfp = Dfp;
}



あ、そうそう。
cin << ●● の、あばばばば対策してみた。
あばば…になったとき、cin.ignore(); と、 cin.clear(); を入れればいいんだけど、
実際のところ、 いつあばばになるのかわからない。
だからといって毎回必ず使う約束にすると、最初の1回目の入力とかがひっかかる。
こんな感じで気に入らない処理を抑え込むのは泥臭い作り方だと、自分でも思う。

main() 関数のほうは対処済み。
触ってないかと思ってた Battle() 関数も、けっこういじってるなあ。
相変わらず、差分については信憑性無し。

main.cpp


int Battle(Unit &player, Unit &enemy)
{
    int cnt = 1, cmd, cmdcnt;
    int res = 0;

    while(1){
        cmdcnt = 0;
        Sleep(600);
        cout << "\ncnt:" << cnt << "\n";
        player.ShowStatus();
        enemy.ShowStatus();
        while(1){
            cout << "どうする?(1:攻撃 2:逃げる 9:終了):";
            if(cmdcnt){
                cin.clear();
                cin.ignore();
            }
            cmd = 0;
            cin >> cmd;
            cout << "\n";
            if(cmd == 1) break;
            if(cmd == 2) {
                cout << player.getName() << "は逃げ出した!\n";
                break;
            }
            if(cmd == 9)break;
            if((++cmdcnt)>10){cmd = 9;break;}   //無限ループ防止
        }
        if(cmd == 9){res = 9;break;}
        if(cmd == 2){res = 1;break;}

        if(NormalAttack(player,enemy)){res = 2;break;}
        if(NormalAttack(enemy,player)){res = 3;break;}

        if((++cnt)>100)break;       // 無条件ループなので、無限ループ防止
    }

    return res;
}



「あばばばば・・・」が出なくなったのはいいんだけど、わざと入力不良で落とす「あばば落とし」が
出来なくなった。
終わりたいときに終われなくなったので、「9:終了」区分でもつけてみることにする。

これは Battle() 関数だけじゃなく、 すでにmain() のほうも対応してる。



・・・しかしクソースだなあ。
それはそうと、たぶんいっこ前のバージョンからのバグがあったけど、しれっと修正しておいた。


ダウンロード entry009.zip(2009.07.30)



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
アクセス解析
カウンター