[[TableOfContents]] == simplegame.cpp == * Total lines of code: 760(스압 주의) {{{ //simplegame.cpp simple huh? #include #include #include #include #include #define MAX_STRING 100 #define MAX_TOWN 5 #define MAX_ENEMY 5 #define MAX_ITEMS 40 #define FILE_NAME "csave.dat" typedef struct{ int base_hp; int hp; int max_hp; int att; int base_att; int def; int base_def; char name[MAX_STRING]; int townNum; int level; unsigned int xp; unsigned int next_xp; int money; }entity; typedef struct{ char name[MAX_STRING]; int att; int def; int hp_plus; char tooltip[MAX_STRING]; }inventory; typedef struct{ char name[MAX_STRING]; }town; town T[MAX_TOWN]; inventory inven[MAX_ITEMS]; inventory tmpInven; int i_top=-1; inventory storage[3]; int cost[3]; entity Main; entity Enemy[MAX_ENEMY]; FILE *state; bool gameover=false; void saveState(); bool loadGame(); void init(bool first); void itemPush(inventory item); inventory itemFind(int index); void discardItem(int index); void store(); void travel(town dest,int distance,int townNum); void setTravelDest(); void battle(); void rest(); void viewItems(); void setStat(); void start(bool first); void buyItem(inventory item,int index); int main(void){ char buff; while(true){ fflush(stdin); printf("<<중대생 rpg ver1.0 made by 신기호>>\n<<버그가 발생할 시 바로 알려주세요.>>\n"); printf("1.새로하기\n2.이어하기\n3.종료\n"); scanf("%c",&buff); switch(buff){ case '1': system("cls"); init(true); start(true); break; case '2': system("cls"); if(loadGame()){ init(false); start(false); } else{ init(true); start(true); } break; case '3': return 0; } system("cls"); } return 0; } bool loadGame(){ int count=0; inventory tmpItem; state=fopen(FILE_NAME,"r"); if(state==NULL){ return false; } printf("Loading...\n"); char buff[MAX_STRING]; while(strcmp(buff,"EOF")!=0){ fscanf(state,"%s",buff); if(strcmp(buff,"level:")==0) fscanf(state,"%d",&Main.level); else if(strcmp(buff,"base_hp:")==0) fscanf(state,"%d",&Main.base_hp); else if(strcmp(buff,"hp:")==0) fscanf(state,"%d",&Main.hp); else if(strcmp(buff,"base_att:")==0) fscanf(state,"%d",&Main.base_att); else if(strcmp(buff,"base_def:")==0) fscanf(state,"%d",&Main.base_def); else if(strcmp(buff,"name:")==0){ char tmp; char tmpName[MAX_STRING]; int i=0; fscanf(state,"%c",&tmp); do{ fscanf(state,"%c",&tmp); tmpName[i++]=tmp; }while(tmp!='\n'); tmpName[i-1]='\0'; strcpy(Main.name,tmpName); } else if(strcmp(buff,"townNum:")==0) fscanf(state,"%d",&Main.townNum); else if(strcmp(buff,"xp:")==0) fscanf(state,"%u",&Main.xp); else if(strcmp(buff,"next_xp:")==0) fscanf(state,"%u",&Main.next_xp); else if(strcmp(buff,"money:")==0) fscanf(state,"%d",&Main.money); else if(strcmp(buff,"inven:")==0){ int num; fscanf(state,"%d",&num); for(int i=0;i=1&&num<=i_top+1){ bool flag2=false; int num2; while(true){ if(flag2) break; fflush(stdin); tmp=itemFind(num-1); printf("<%s>\n옵션:\n1.살펴보기\n2.버리기\n3.취소\n",tmp.name); scanf("%d",&num2); switch(num2){ case 1: printf("%s\n",inven[num-1].tooltip); flag2=true; fflush(stdin); getchar(); system("cls"); break; case 2: printf("아이템을 버렸습니다.\n"); discardItem(num-1); flag2=true; system("cls"); break; case 3: flag2=true; system("cls"); break; } } } break; case '2': flag=true; break; } } } void setTravelDest(){ char buff; bool exit=false; int distance; printf("어디로 가시겠습니까?(거리에 따라 전투의 발생 횟수가 변할 수 있습니다.)\n"); for(int i=0;i=Main.next_xp){ Main.level++; Main.next_xp=Main.xp*2; Main.base_hp=Main.base_hp+Main.level*10; Main.base_att=Main.base_att+Main.level*2; Main.base_def=Main.base_def+Main.level; setStat(); printf("레벨업!\n현재 레벨: %d\t다음 레벨까지 남은 경험치: %d\n체력: %d\t공격력: %d\t방어력: %d",Main.level,Main.next_xp,Main.max_hp,Main.att,Main.def); } setStat(); fflush(stdin); getchar(); end=true; continue; } else if(Main.hp<=0){ printf("패배했습니다.\n"); fflush(stdin); getchar(); gameover=true; end=true; continue; } else{ printf("1.공격\n2.방어\n3.도망\n"); scanf("%c",&buff); switch(buff){ case '1': srand((unsigned)time(NULL)); en=rand()%10; printf("%s을(를) 공격했다!\n",tmpEn.name); fflush(stdin); getchar(); if(en<=4){ if(tmpEn.def-Main.att>0) tmpEn.hp--; else tmpEn.hp-=Main.att; printf("적 %s이(가) 공격했다!\n",tmpEn.name); fflush(stdin); getchar(); if(Main.def-tmpEn.att>0) Main.hp--; else Main.hp-=tmpEn.att; } else if(en>4&&en<=8){ if(tmpEn.def-Main.att>0) tmpEn.hp--; else tmpEn.hp-=Main.att-tmpEn.def; printf("적 %s이(가) 자신을 방어했다.\n",tmpEn.name); fflush(stdin); getchar(); } else{ printf("적 %s이(가) 도망갔다.\n",tmpEn.name); fflush(stdin); getchar(); end=true; continue; } break; case '2': srand((unsigned)time(NULL)); en=rand()%10; printf("방어했습니다.\n"); fflush(stdin); getchar(); if(en<=4){ printf("적 %s이(가) 공격했다!\n",tmpEn.name); fflush(stdin); getchar(); if(Main.def-tmpEn.att>0) Main.hp--; else Main.hp-=tmpEn.att-Main.def; } else if(en>4&&en<=8){ printf("적 %s이(가) 자신을 방어했다.\n",tmpEn.name); fflush(stdin); getchar(); } else{ printf("적 %s이(가) 도망갔다.\n",tmpEn.name); fflush(stdin); getchar(); end=true; continue; } break; case '3': srand((unsigned)time(NULL)); int flee=rand()%10; if(flee>=6){ printf("당신은 전투에서 도망쳤습니다.\n"); fflush(stdin); getchar(); end=true; continue; } else{ printf("당신은 도망칠 수 없었습니다.\n"); fflush(stdin); getchar(); break; } } } } } void setStat(){ Main.max_hp=Main.base_hp; Main.att=Main.base_att; Main.def=Main.base_def; for(int i=0;i<=i_top;i++){ Main.max_hp=Main.max_hp+inven[i].hp_plus; Main.att=Main.att+inven[i].att; Main.def=Main.def+inven[i].def; } } void itemPush(inventory item){ if(i_top>=MAX_ITEMS-1) return; inven[++i_top]=item; } inventory itemFind(int index){ return inven[index]; } void discardItem(int index){ inventory tmpItem; tmpItem=inven[index]; for(int i=index+1;i<=i_top;i++) inven[i-1]=inven[i]; i_top--; Main.max_hp-=tmpItem.hp_plus; Main.att-=tmpItem.att; Main.def-=tmpItem.def; } }}} -[신기호]-