なんとなくだらだらと。方向性はまだ決まってない。
当方のプログラムでは、山田巧さん作成のDXライブラリを利用させていただいてます。
本サイト http://homepage2.nifty.com/natupaji/DxLib/index.html
DX Library Copyright (C) 2001-2008 Takumi Yamada.
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
勇者は戦いの旅に出て、そして街に逃げ帰る。
宿屋で回復して、また戦いの旅に出る。 経験を積んで少しづつ強くなっていければいいのだけど、まだそこまで手が回らない。 ダウンロード 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 |
カレンダー
カテゴリー
フリーエリア
最新記事
(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
アクセス解析
カウンター
|