なんとなくだらだらと。方向性はまだ決まってない。
当方のプログラムでは、山田巧さん作成のDXライブラリを利用させていただいてます。
本サイト http://homepage2.nifty.com/natupaji/DxLib/index.html
DX Library Copyright (C) 2001-2008 Takumi Yamada.
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
もとから想定してたことだけど、連戦できるように改造する。
結構大きな改造になると思う。 ここまでのソース 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 に帰ってきた結果で、いろいろと条件分岐。 よく見てよく考えたら、ここはもっとすっきりするけど、まだまだ追加がある(予定な)んで、 追加条件によって、今まとめたところをもういちど分離するのも無駄な話。 こんなんでいいかと何度か動かしてみる。 ゴブリン大将には勝ったり負けたり。次の「がいこつ戦士」には勝てる気がしない。 適当に数字出したわりに、いい感じに出来上がったかも。 ここまでのソース Download entry008.zip(2009.07.30) このエントリ冒頭のやつと同バージョン PR |
カレンダー
カテゴリー
フリーエリア
最新記事
(01/29)
(01/28)
(01/26)
(12/28)
(12/27)
(12/25)
(12/20)
(09/09)
(09/09)
(09/09)
(09/08)
(09/08)
(09/08)
(09/06)
(09/05)
(08/27)
(08/27)
(08/27)
(08/25)
(08/23)
ブログ内検索
P R
アクセス解析
カウンター
|