#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
struct _mon{
char name[10];
int hp;
int at;
int df;
};
typedef struct _mon M;
struct _option{
int Speed; /* 戦闘速度 1 = 1倍速 2 = 2倍速 3 = 省略 */
int Formula; /* 戦闘時攻撃計算式 */
};
typedef struct _option OP;
void Menu1(int,M *,OP *);
void Menu2(OP *);
void Show(int,M *);
void Enter1(int,M *,OP *);
void Enter2(int,M *);
void Lever1(OP *);
void Lever2(OP *);
void Quick(OP *);
void Next();
int main(void){
M mon[10];
OP op[1];
op[0].Speed = 1;
op[0].Formula = 1;
int i,j,n;
char X[256];
for(n=0;n<10;n++){ /* n = データ件数 */
printf("モンスター名を入力?(@end入力で終了) ");
scanf("%5s",mon[n].name);
if(!strcmp(mon[n].name,"@end"))break;
while(1){
printf("体力?(1~9999) ");
scanf("%s",X);
sscanf(X,"%d",&mon[n].hp);
if(mon[n].hp > 0 && mon[n].hp < 10000)break;
else printf("《1 ~ 9999》の範囲で設定してください\n\n");
}
while(1){
printf("攻撃力?(0~9999) ");
scanf("%s",X);
sscanf(X,"%d",&mon[n].at);
if(mon[n].at >= 0 && mon[n].at < 10000)break;
else printf("《0 ~ 9999》の範囲で設定してください\n\n");
}
while(1){
printf("防御力?(0~9999) ");
scanf("%s",X);
sscanf(X,"%d",&mon[n].df);
if(mon[n].df >= 0 && mon[n].df < 10000)break;
else printf("《0 ~ 9999》の範囲で設定してください\n\n");
}
}
Menu1(n,mon,op);
return 0;
}
void Menu1(int n,M *p,OP *q){
int menu;
char X[256];
while(1){
Show(n,p);
printf(" 1) モンスター同士を戦わせてみる(自動戦闘)\n");
printf(" 2) データを変更する\n");
printf(" 3) 設定\n");
printf(" 4) 終了\n");
printf(" >> ");
scanf("%s",X);
sscanf(X,"%d",&menu);
if(menu>0 && menu<=4){
if(menu == 1)Enter1(n,p,q);
else if(menu == 2)Enter2(n,p);
else if(menu == 3)Menu2(q);
else if(menu == 4)break;
}
else{
printf("\n《エラーが発生しました》\n");
printf("《1 ~ 4 の数字を入力してください》\n\n");
}
}
}
void Menu2(OP *q){
int menu;
char X[256];
while(1){
printf("設定したい項目を選んでください\n");
printf("1) 戦闘速度\n");
printf("2) 攻撃計算式\n");
printf("3) 戻る\n");
printf(" >> ");
scanf("%s",X);
sscanf(X,"%d",&menu);
if(menu>0 && menu<=3){
if(menu == 1)Lever1(q);
else if(menu == 2)Lever2(q);
else if(menu == 3)break;
}
else{
printf("\n《エラーが発生しました》\n");
printf("《1 ~ 3 の数字を入力してください》\n\n");
}
}
}
void Show(int n,M *p){
int i;
printf("\nーーーーーーーーーーーーーーー\n");
printf(" 名前 体力 攻撃 防御\n\n");
for(i=0;i<n;i++){
printf("%3d %5s %5d %5d %5d \n",i+1,(p+i)->name,(p+i)->hp,(p+i)->at,(p+i)->df);
}
printf("ーーーーーーーーーーーーーーー\n\n");
}
void Enter1(int n,M *p,OP *q){
int i,j,turn=0,ran1,ran2,to1=0,to2=0,dam,hoge,flag;
M m1,m2;
char X[256];
Show(n,p);
while(1){
printf("\nモンスターを選んでください(1体目) >> ");
scanf("%s",X);
sscanf(X,"%d",&i);
if(i > 0 && i <= n)break;
else printf("1~%dの範囲から選択してください\n\n",n);
}
m1 = *(p+i-1);
while(1){
printf("\nモンスターを選んでください(2体目) >> ");
scanf("%s",X);
sscanf(X,"%d",&j);
if(j > 0 && j <= n)break;
else printf("1~%dの範囲から選択してください\n\n",n);
}
m2 = *(p+j-1);
printf("\nーーーーーーーーーーーーーーー\n");
printf(" 名前 体力 攻撃 防御\n\n");
printf("%3d %5s %5d %5d %5d \n",i,m1.name,m1.hp,m1.at,m1.df);
printf("%3d %5s %5d %5d %5d \n",j,m2.name,m2.hp,m2.at,m2.df);
printf("ーーーーーーーーーーーーーーー\n\n");
printf("戦闘を開始します");
for(i=0;i<3;i++){
sleep(1);
printf(".");
}
sleep(1);
printf("\n");
while(1){
srand((unsigned)time(NULL));
printf("\n < %d ターン目 >\n",++turn);
Quick(q);
printf(" %s の攻撃\n",m1.name); /* 先に選択したモンスターのターン */
Quick(q);
ran1 = rand() % 3; /* 攻撃にばらつきを持たせてる */
if(q->Formula == 1){
dam = (m1.at + ran1) - m2.df;
if(dam <= 0)dam = 0;
}
else if(q->Formula == 2){
dam = (m1.at + ran1) / m2.df;
if(dam < 1 && dam > 0)dam = 1;
}
printf(" %s に %d ダメージ\n",m2.name,dam);
Quick(q);
m2.hp -= dam;
to1 += dam;
if(m2.hp <= 0){
Quick(q);
break;
}
printf(" %s の攻撃\n",m2.name); /* 後に選択したモンスターのターン */
Quick(q);
ran2 = rand() % 3; /* 攻撃にばらつきを持たせてる */
if(q->Formula == 1){
dam = (m2.at + ran2) - m1.df;
if(dam <= 0)dam = 0;
}
else if(q->Formula == 2){
dam = (m2.at + ran2) / m1.df;
if(dam < 1 && dam > 0)dam = 1;
}
printf(" %s に %d ダメージ\n",m1.name,dam);
Quick(q);
m1.hp -= dam;
to2 += dam;
if(m1.hp <= 0){
Quick(q);
break;
}
if(turn % 10 == 0 && m1.hp > 0 && m2.hp > 0){
printf(" \n %dターンが経過しました\n",turn);
printf(" 決着がついていません\n");
while(1){
printf("\n このまま続けますか?");
printf("1: Yes / 2: No >> ");
scanf("%s",X);
sscanf(X,"%d",&hoge);
if(hoge == 1){
printf(" このまま戦闘を続けます\n");
Next();
break;
}
else if(hoge == 2){
printf(" 戦闘を終了します\n");
flag = 1;
Next();
break;
}
else printf(" 1 または 2 を入力してください\n\n");
}
}
if(flag == 1){
flag = 0;
printf(" %sのトータルダメージ : %d\n",m1.name,to1);
printf(" %sのトータルダメージ : %d\n",m2.name,to2);
printf(" 経過ターン : %d\n",turn);
printf(" 決着がつきませんでした...\n");
Next();
break;
}
}
if(m2.hp <= 0){
printf("\n %s が勝利しました\n",m1.name);
printf(" トータルダメージ : %d\n",to1);
printf(" 経過ターン : %d\n",turn);
Next();
}
if(m1.hp <= 0){
printf("\n %s が勝利しました\n",m2.name);
printf(" トータルダメージ : %d\n",to2);
printf(" 経過ターン : %d\n",turn);
Next();
}
}
void Enter2(int n,M *p){
int i;
char X[256];
Show(n,p);
while(1){
printf("データを変更します\n");
printf("変更したいデータを選んでください >> ");
scanf("%s",X);
sscanf(X,"%d",&i);
if(i > 0 && i <= n)break;
else printf("1 ~ %dの範囲で設定してください\n",n);
}
printf("\nーーーーーーーーーーーーーーー\n");
printf(" 名前 体力 攻撃 防御\n\n");
printf("%3d %5s %5d %5d %5d \n",i,(p+i-1)->name,(p+i-1)->hp,(p+i-1)->at,(p+i-1)->df);
printf("ーーーーーーーーーーーーーーー\n\n");
printf("名前? ");
scanf("%5s",(p+i-1)->name);
while(1){
printf("体力?(1~9999) ");
scanf("%s",X);
sscanf(X,"%d",&(p+i-1)->hp);
if((p+i-1)->hp > 0 && (p+i-1)->hp < 10000)break;
else printf("《1 ~ 9999》の範囲で設定してください\n");
}
while(1){
printf("攻撃?(0~9999) ");
scanf("%s",X);
sscanf(X,"%d",&(p+i-1)->at);
if((p+i-1)->at >= 0 && (p+i-1)->at < 10000)break;
else printf("《0 ~ 9999》の範囲で設定してください\n");
}
while(1){
printf("防御?(0~9999) ");
scanf("%s",X);
sscanf(X,"%d",&(p+i-1)->df);
if((p+i-1)->df >= 0 && (p+i-1)->df < 10000)break;
else printf("《0 ~ 9999》の範囲で設定してください\n");
}
printf("変更が完了しました\n");
}
void Lever1(OP *p){
char X[256];
while(1){
printf("戦闘速度を設定します\n\n");
printf("1) 1倍速");
if(p->Speed == 1)printf(" (現在)\n");
else printf("\n");
printf("2) -故障中-\n"); /* 実際には2倍速を入れる予定だったが、諸事情により省略 */
printf("3) 省略");
if(p->Speed == 3)printf(" (現在)\n");
else printf("\n");
printf(" >> ");
scanf("%s",X);
sscanf(X,"%d",&p->Speed);
if(p->Speed == 1 || p->Speed == 3)break;
else{
printf("\n《エラーが発生しました》\n");
printf("《1または3の値を入れてください》\n\n");
}
}
}
void Lever2(OP *p){
char X[256];
while(1){
printf("戦闘の際の計算方法を設定します\n\n");
printf("1) 体力 ー (攻撃 ー 防御) = ダメージ");
if(p->Formula == 1)printf(" (現在)\n");
else printf("\n");
printf("2) 体力 ー (攻撃 ÷ 防御) = ダメージ");
if(p->Formula == 2)printf(" (現在)\n");
else printf("\n");
printf(" >> ");
scanf("%s",X);
sscanf(X,"%d",&p->Formula);
if(p->Formula == 1 || p->Formula == 2)break;
else{
printf("\n《エラーが発生しました》\n");
printf("《1 または 2を入力してください》\n\n");
}
}
}
void Quick(OP *q){
if(q->Speed == 1)sleep(1);
else if(q->Speed == 3)sleep(0);
}
void Next(){
rewind(stdin);
printf("\t\t\t\t Enterキーで次へ >>");
getchar();
}
コメント