#include <stdio.h>
#include <stdlib.h>
#define win 0
#define draw 1
#define lose 2
struct RPGCHARACTER {
int hp;
char name[20];
int str;
int def;
int lucky;
};
int randRan(int min, int max);
int attack(struct RPGCHARACTER *a, struct RPGCHARACTER *b);
int escape(struct RPGCHARACTER *a);
int command1(struct RPGCHARACTER *a);
int battle(struct RPGCHARACTER *a, struct RPGCHARACTER *b);
void showStatus(struct RPGCHARACTER *a);
int inputRange(char *mes, int min, int max);
void inputPlayer(struct RPGCHARACTER *a);
int main(void) {
struct RPGCHARACTER enemies[5];
struct RPGCHARACTER playerStatus;
struct RPGCHARACTER player;
int winCount = 0;
int loseCount = 0;
int drawCount = 0;
int i;
for (i = 0; i < 5; i++) {
sprintf(enemies[i].name, "おちんぽ%d", i);
enemies[i].hp = randRan(50, 100);
enemies[i].str = randRan(25, 75);
enemies[i].def = randRan(25, 75);
enemies[i].lucky = randRan(0, 100);
}
/* inputPlayer(&playerStatus); */
sprintf(playerStatus.name, "ドキンちゃん");
playerStatus.hp = 100;
playerStatus.str = 75;
playerStatus.def = 75;
playerStatus.lucky = 100;
player = playerStatus;
puts("");
for (i = 0; i < 5; i++) {
printf("%sとの戦闘\n", enemies[i].name);
switch (battle(&player, &enemies[i])) {
case win :
winCount++;
if (playerStatus.hp < player.hp + 50) {
player.hp = playerStatus.hp;
} else {
player.hp += 50;
}
break;
case draw:
drawCount++;
break;
case lose:
loseCount++;
player.hp = playerStatus.hp;
break;
}
}
printf("%d勝%d敗%d分け\n", winCount, loseCount, drawCount);
return EXIT_SUCCESS;
}
int randRan(int min, int max) {
int ran = max - min + 1;
int rem = RAND_MAX - ((RAND_MAX - ran + 1) % ran);
int num;
do {
num = rand();
} while (rem < num);
return (num % ran) + min;
}
int attack(struct RPGCHARACTER *a, struct RPGCHARACTER *b) {
int damage;
if (a->str > b->def) {
damage = a->str - b->def + 10;
} else if (a->str < b->def) {
damage = 5;
} else {
damage = 0;
}
if (b->hp < damage) {
b->hp = 0;
} else {
b->hp -= damage;
}
return damage;
}
int escape(struct RPGCHARACTER *a) {
int n = randRan(0, 100);
if (n < a->lucky) {
return 1;
} else {
return 0;
}
}
int command1(struct RPGCHARACTER *a) {
int i;
printf("%sのターン\n", a->name);
printf("1:攻撃\n");
printf("2:逃げる\n");
printf("コマンドを入力してください:");
scanf("%d", &i);
return i;
}
int battle(struct RPGCHARACTER *a, struct RPGCHARACTER *b) {
while (1) {
puts("");
showStatus(a);
puts("");
switch (command1(a)) {
case 1:
puts("");
printf("%sが%sを攻撃しました\n", a->name, b->name);
printf("%sに%dのダメージを与えました\n", b->name, attack(a, b));
break;
case 2:
puts("");
printf("%sは逃げだしました\n", a->name);
switch (escape(a)) {
case 0:
printf("逃げることができませんでした\n");
break;
case 1:
printf("逃げることができました\n");
puts("");
return draw;
}
break;
}
puts("");
if (b->hp < 1) {
printf("%sとの戦闘に勝ちました\n", b->name);
puts("");
return win;
}
printf("%sが%sを攻撃しました\n", b->name, a->name);
printf("%sは%dのダメージを受けました\n", a->name, attack(b, a));
if (a->hp < 1) {
printf("%sとの戦闘に負けました\n", b->name);
puts("");
return lose;
}
}
}
void showStatus(struct RPGCHARACTER *a) {
printf("name: %s\n", a->name);
printf("hp : %d\n", a->hp);
printf("str : %d\n", a->str);
printf("def : %d\n", a->def);
printf("luc : %d\n", a->lucky);
}
int inputRange(char *mes, int min, int max) {
int n;
while (1) {
printf("%s", mes);
scanf("%d", &n);
if (min <= n && n <= max) {
return n;
}
printf("%dから%dまでの数字を入力してください\n", min, max);
}
}
void inputPlayer(struct RPGCHARACTER *a) {
printf("name : ");
scanf("%s", &a->name);
a->hp = inputRange("hp(50-100):", 50, 100);
a->str = inputRange("str(25-75):", 25, 75);
a->def = inputRange("def(25-75):", 25, 75);
a->lucky = inputRange("luc(0-100):", 0, 100);
}