Top プログラム課題集


MiniRPG1
200stepで作れるRPGの解答例です。
問題だらけです。セーブが出来ない。単調すぎる。面白くない。
システム的にも制限がないので、オーバーフローが発生してしまう。
普通に、数字を入力する代わりに文字を入力されると暴走してしまう。等々。
問題は尽きません。是非、一つ一つの問題に対応してみて下さい。

#include "stdio.h"
#include "stdlib.h"
#include "time.h"

/// キャラクタステータス構造体
struct CharStatus
{
char name[20];///< 名前
int maxHp;///< 最大HP
int nowHp;///< HP
int power;///< 力
int wepon;///< 武器の攻撃力
};

/// ステータス表示処理
void DisplayStatus(CharStatus charctor,int floor)
{
if (floor > 0)
{
printf("現在の階数:%d\n", floor);
}
else {
printf("現在は町にいます\n");
}
printf("名前:%s\n", charctor.name);
printf("最大HP:%d\n", charctor.maxHp);
printf("HP:%d\n", charctor.nowHp);
printf("力:%d\n", charctor.power);
printf("武器の攻撃力:%d\n", charctor.wepon);
}

/// ダメージ計算処理
int CalcDamage(CharStatus charactor)
{
return charactor.power + charactor.wepon + rand() % 10;
}

/// 戦闘処理
bool Battle(CharStatus& player,int floor)
{
CharStatus enemy;
int command = 0;
int damage = 0;
sprintf_s(enemy.name, "モンスター");
enemy.maxHp = rand() % 5 + floor * 5;
enemy.nowHp = enemy.maxHp;
enemy.power = rand() % 5 + floor * 5;
enemy.wepon = 0;

while ((player.nowHp > 0) && (enemy.nowHp > 0))
{
printf("何をしますか?\n");
printf("1:攻撃する\n");
printf("0:逃げる\n");
scanf_s("%d",&command);
switch (command)
{
case 1:
damage = CalcDamage(player);
printf("%sの攻撃。敵に%dのダメージ\n",player.name,damage);
enemy.nowHp -= damage;
if (enemy.nowHp > 0)
{
damage = CalcDamage(enemy);
printf("敵の攻撃。%sに%dのダメージ\n", player.name, damage);
player.nowHp -= damage;
}
break;
case 0:return true;
}
}
if (player.nowHp <= 0)
{
printf("あなたの負けです\n");
return false;
}
printf("あなたの勝ちです。最大HPが%d上がりました\n",floor);
player.maxHp += floor;
return true;
}

/// 宝物探索処理
void SearchTreasure(CharStatus& player,int floor)
{
int wepon = rand() % 10 + (floor - 1) * 5;
if (wepon == (floor - 1) * 5)
{
printf("何も見つから見ませんでした\n");
}
else if (player.wepon < wepon)
{
player.wepon = wepon;
printf("%dの武器を発見し、装備しました\n",wepon);
}
else {
printf("武器を見つけましたが、弱かったので捨てました\n");
}
}

/// ダンジョン処理
bool GoDungeon(CharStatus& player)
{
int floor = 1;
int command = 0;
// ダンジョンの処理
while (true)
{
printf("何をしますか?\n");
printf("1:ステータス表示\n");
printf("2:次の階に進む\n");
printf("3:モンスターを探す\n");
printf("4:宝物を探す\n");
printf("0:町に戻る\n");
scanf_s("%d", &command);
switch (command)
{
case 0:
// 町に戻る
return true;
case 1:
// ステータス表示
DisplayStatus(player, floor);
break;
case 2:
// 次の階に進む
floor++;
printf("%d階に着きました",floor);
break;
case 3:
// モンスターを探す
if (Battle(player, floor) == false)
{
// 負けたので終了する
return false;
}
break;
case 4:
// 宝物を探す
SearchTreasure(player, floor);
break;
}
}
}

/// メイン処理
int main()
{
srand((unsigned int)time(NULL));
CharStatus player;

// 主人公の初期化
sprintf_s(player.name, "主人公");
player.maxHp = 10;
player.nowHp = player.maxHp;
player.power = 10;
player.wepon = 0;

// 町の処理
while (true)
{
printf("何をしますか?\n");
printf("1:ステータス表示する\n");
printf("2:回復する\n");
printf("3:ダンジョンに行く\n");
printf("0:終了する\n");
int command;
scanf_s("%d", &command);
switch (command)
{
case 0:
// 終了する
return 0;
case 1:
// ステータス表示
DisplayStatus(player,0);
break;
case 2:
// 回復する
player.nowHp = player.maxHp;
break;
case 3:
if (GoDungeon(player) == false)
{
return 0;
}
break;
}
}
return 0;
}