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

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

もとから想定してたことだけど、連戦できるように改造する。
結構大きな改造になると思う。


CRPG013.png


ここまでのソース Download Entry008.zip (2009.07.30)





まずは邪魔(失礼)な、ヒストグラム系の関数を追い出す。

Histgram.h でも作って、Hist_~関数をごっそりカッペ。
main.cpp 本体からカットして、Histgram.h に貼り付け。
main関数の中のコメントも一緒に持っていけ、な。

ヘッダファイルに関数を直接書くのはなんか違和感あるけど、まあいい。
ヘッダの先頭に #pragma once つけておこうか。

Histgram.h


// Histgram.h
#pragma once

void Hist_Atk(Unit &ut)
{
    int h[100]={0};




で、メインのほうから呼び出せるように、インクルード文を追加しておく。
main.cpp


using namespace std;

#include "Unit.h"
#include "Histgram.h"


int NormalAttack(Unit &lst, Unit &rst)




main()から Hist_NA(player, enemy); とか呼び出してみて、動くかどうか確認。
バックアップ取ってなかったから、けっこうなげやり。



こうやって取り除いてみると、main.cpp しょぼいなあ。


さて、ここからどうしようか考えること小一時間。
今、メインでやってることは、プレイヤーとモンスターをクラス登録して、戦わせること。
戦うふたりを斡旋するようにしたらどうだろうか。

Battle() 関数を作ってみる。内容は、まんま今まで main() でやってたこと。

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){
            cmd = 0;
            cout << "どうする?(1:攻撃 2:逃げる):";
            cin >> cmd;
            cout << "\n";
            if(cmd == 1) break;
            if(cmd == 2) {
                cout << player.getName() << "は逃げ出した!\n";
                break;
            }
            if((++cmdcnt)>10){cmd = 0;break;}   //無限ループ防止
        }
        if(cmd == 0){res = 0;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;
}



メインの中のループ部分を抜き出してみた。変更箇所がよくわからなくなった。
ここで使ってるのは敵・味方の情報だけなので、 メイン(外部)から、その2者のインスタンスを
呼び出せば、戦闘開始する算段。
いい感じにまとまりそう。

結果は、変数 res (Result:結果)を使って戻す。
ループの中から return で戻ってもいいんだけど、なんとなく礼儀。
cinあばばばば対策で、いろいろごちゃごちゃしてきた気がする。


Battle()関数がいい感じにまとまったので、main()関数に手をつける。
こちらの役目は、戦う相手の斡旋。

main.cpp


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

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

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

    for(int i=0;i<5;++i)
    {
        res = Battle(player,enemy[i]);
        if(res==0)break;    // あばばばば
        if(res==1)break;    // 逃亡
        if(res==2){         // プレイヤー勝利
            cout << "勝ち。\n";
        }
        if(res==3){         // プレイヤー敗北(死亡)
            cout << player.getName() << " は死亡した。-GAME OVER-\n";
            break;
        }
    }

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



Unitクラスの、敵を配列で宣言する。
敵リストに直接値を入れる。まあこの程度の量だと我慢できるけど、ちょっと考えたほうがいい。

for() でまわして、順番に player と enemy の素敵な出会いを演出。
けっこう簡単にいくもんだなあ。

res に帰ってきた結果で、いろいろと条件分岐。
よく見てよく考えたら、ここはもっとすっきりするけど、まだまだ追加がある(予定な)んで、
追加条件によって、今まとめたところをもういちど分離するのも無駄な話。



CRPG013.png

こんなんでいいかと何度か動かしてみる。
ゴブリン大将には勝ったり負けたり。次の「がいこつ戦士」には勝てる気がしない。
適当に数字出したわりに、いい感じに出来上がったかも。


ここまでのソース Download entry008.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
アクセス解析
カウンター