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
char
ctor,
int
floor)
{
if
(floor > 0)
{
printf("
現在の階数:%d\n
", floor);
}
else
{
printf("
現在は町にいます\n
");
}
printf("
名前:%s\n
",
char
ctor.name);
printf("
最大HP:%d\n
",
char
ctor.maxHp);
printf("
HP:%d\n
",
char
ctor.nowHp);
printf("
力:%d\n
",
char
ctor.power);
printf("
武器の攻撃力:%d\n
",
char
ctor.wepon);
}
/// ダメージ計算処理
int
CalcDamage(CharStatus
char
actor)
{
return
char
actor.power +
char
actor.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;
}