2月10日課題提出 /*2月17日更新

#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();
}

コメント