#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(); }
コメント