===== バトルメニュー(と再帰呼び出し featuring Algorithm) ===== ==== 再帰呼び出し(Recursive Call) ==== 関数定義の際に、関数の中で自分自身を呼び出すような処理方法\\ int kaijo(int n) { if(n==0) return 1; else{ cout << n << "*kaijo(" << n-1 <<")" << endl; return( n*kaijo(n-1)); } } int main() { int res = kaijo(5); cout << "Ans:" << res << endl; } === 結果 === 5*kaijo(4) 4*kaijo(3) 3*kaijo(2) 2*kaijo(1) 1*kaijo(0) Ans:120 ==== アスキーコードを順番に表示(再帰で) ==== #include using namespace std; int kaijo(int n) { if(n==0) return 1; else{ cout << n << "*kaijo(" << n-1 <<")" << endl; return( n*kaijo(n-1)); } } int sum(int n) { if(n == 1) return 1; else { cout << n << "+sum(" << n-1 << ")" << endl; return(n + sum(n-1)); } //再帰呼び出しを使って1~nの和を求める関数 } void printX(char c) { cout << c; if(c != 'z') printX(c + 1); else return; } int main() { // int res = kaijo(5); // cout << "Ans:" << res << endl; // int res2 = sum(10); // cout << "Ans:" << res2 << endl; printX('1'); } === 結果 === 123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz ===== バトルメニュー表示 ===== #include #include using std::string; using std::cin; using std::cout; using std::endl; //ドラ〇エのキャラクターを考える //name 名前:キャラクターの名前 //job 職業番号 0:戦士 1:魔法使い 2:僧侶 3:盗賊 // HP  生命力:これが尽きると死す // MP  魔法力:これが尽きると魔法が使えない //STR  強さ:力の強さ→攻撃力に影響 //ATK  攻撃力:攻撃能力の高さ //DEF  防御力:防御能力の高さ //MGK 魔法能力:魔法を操る能力の高さ //ING かしこさ:インテリジェンスの高さ //LUK  運:運の強さ //僕のヒーローのパラメータ struct mychar { string name;//名前 int job;//職業番号 int hp; int mp; int str; float atk; float def; float mgk; int ing; int luk; }; string jobs[] = { "戦士","魔法使い","僧侶", "盗賊" }; //jobs[0] 戦士, jobs[1] 魔法使い。。。 void setCharacterStatus(mychar* _mc, string _name, int _job, int _hp, int _mp, int _str, float _atk, float _def, float _mgk, int _ing, int _luk) { //-> アロー演算子:アドレスで渡された構造体のメンバ変数を参照する _mc->name = _name; _mc->job = _job; _mc->hp = _hp; _mc->mp = _mp; _mc->str = _str; _mc->atk = _atk; _mc->def = _def; _mc->mgk = _mgk; _mc->ing = _ing; _mc->luk = _luk; } //素敵なフォーマットでキャラのパラメータを表示する関数 //引数で、キャラクターを表す構造体を渡す(ポインタでアドレス渡し) void printCharacterStatus(struct mychar *_mychar) { cout << "==================" << endl; cout << " 名前:" << _mychar->name << endl; cout << " 職業:" << jobs[_mychar->job] << endl; cout << " HP:" << _mychar->hp << endl; cout << " MP:" << _mychar->mp << endl; cout << " STR:" << _mychar->str << endl; cout << " ATK:" << _mychar->atk << endl; cout << " DEF:" << _mychar->def << endl; cout << " MGK:" << _mychar->mgk << endl; cout << " ING:" << _mychar->ing << endl; cout << " LUK:" << _mychar->luk << endl; cout << "==================" << endl; } //素敵なフォーマットでキャラのパラメータを表示する関数 //引数で、キャラクターを表す構造体を渡す(ポインタでアドレス渡し) void printCharSummary(struct mychar* _mychar) { cout << "------------------" << endl; cout << " 名前:" << _mychar->name << endl; cout << " HP:" << _mychar->hp << endl; cout << " MP:" << _mychar->mp << endl; cout << "------------------" << endl; } // mychar構造体を2つ引数にとって、第1引数のほうが、第2引数の方に1回だけ攻撃する関数をつくる! // 第1引数 struct mychar *_to // 第2引数 struct mychar *_from void beatCharacter(struct mychar* _to, struct mychar* _from) { cout << _to->name << "の攻撃" << endl; int dam = int(_to->atk + _to->str * 0.5) - int(_from->def * 0.25); cout << _from->name << "の受けたダメージ:" << dam << endl; _from->hp = _from->hp - dam; printCharSummary(_from); } void printBattleMenu() { cout << "どうする?" << endl; cout << "+---------------+" << endl; cout << "| 1: たたかう |" << endl; cout << "| 2: まほう |" << endl; cout << "| 3: 防御 |" << endl; cout << "| 4: ステータス |" << endl; cout << "| 5: 逃げる   |" << endl; cout << "+---------------+" << endl; } int main() { mychar hero; //作っただけでは初期化されないのでメンバー変数は何も入ってない setCharacterStatus(&hero, "オルテガ", 0, 100, 10, 50, 100.0, 80.0, 10.0, 5, 20); // 構造体, 名前, job, hp, mp,str, atk, def, mgk,ing, luk //printCharacterStatus(&hero); //printCharSummary(&hero); mychar mob; setCharacterStatus( &mob, "モブ夫", 3, 500, 80, 10, 20.0, 15.0, 5.0, 10, 10); // 構造体, 名前, job, hp, mp,str, atk, def, mgk, ing, luk //printCharacterStatus(&mob); cout << mob.name << "が現れた!" << endl; bool turn = true; int command; //turnがtrueの時はheroの攻撃ターン //turnがfalseの時はmobの攻撃ターン while(hero.hp > 0 && mob.hp >0) { if (turn)//自分のターン { do { printBattleMenu(); cin >> command; } while (command < 1 || command > 5); //1~5の値によって分岐 //今のところ1を選んだ時だけ攻撃 //その他は、それはできないと表示 switch (command) { case 1: beatCharacter(&hero, &mob); turn = !turn; break; case 2: cout << "それはできない" << endl; break; case 3: cout << "それはできない" << endl; break; case 4: cout << "それはできない" << endl; break; case 5: cout << "それはできない" << endl; break; default: cout << "エラー! それはできない" << endl; break; } cin.get(); //エンター待ち } else//敵のターン { beatCharacter(&mob, &hero); cout << "Push Enter to Next Turn"; cin.get(); //エンター待ち std::system("cls"); //画面クリア turn = !turn; } //ターンの切り替え //turn = !turn; //cout << turn << endl; } return 0; }