반응형
structure1.h
#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <Windows.h>
struct character {
int iHP;
int iAttack;
int iBlock;
int iHeal;
};
character PC = { 30, 10, 5, 10 };
character Enemy = { 0,0,0,0 };
void phase0();
void phase1();
void phase2();
void phase3();
void(*phase) ();
void CreativeEnemy(int difficulty, character PC, character* Enemy)
{
int BasePercent;
switch (difficulty) {
case 1: //쉬움
BasePercent = 70;
break;
case 2: //보통
BasePercent = 80;
break;
case 3: //어려움
BasePercent = 90;
break;
}
Enemy->iHP = (int)(PC.iHP * ((BasePercent + (rand() % 41)) / 100.0));
Enemy->iAttack = (int)(PC.iAttack * ((BasePercent + (rand() % 41)) / 100.0));
Enemy->iBlock = (int)(PC.iBlock * ((BasePercent + (rand() % 41)) / 100.0));
Enemy->iHeal = (int)(PC.iHeal * ((BasePercent + (rand() % 41)) / 100.0));
}
void action(character* PC, character* Enemy, int iActionCode)
{
switch (iActionCode) {
case 1: // attack/attack
{
{
printf("내 행동: 공격, 적 행동 : 공격 \n");
int damage_PtoE = PC->iAttack - Enemy->iBlock;
if (damage_PtoE < 0) { // 방어가 공격보다 높으면 0으로 처리.
damage_PtoE = 0;
}
Enemy->iHP = Enemy->iHP - damage_PtoE;
}
{
int damage_EtoP = Enemy->iAttack - PC->iBlock;
if (damage_EtoP < 0) { // 방어가 공격보다 높으면 0으로 처리.
damage_EtoP = 0;
}
PC->iHP = PC->iHP - damage_EtoP;
}
break;
}
case 2: // attack/block
{
printf("내 행동: 공격, 적 행동 : 방어 \n");
{
int damage_PtoE = PC->iAttack - Enemy->iBlock * 2;
if (damage_PtoE < 0) { // 방어가 공격보다 높으면 0으로 처리.
damage_PtoE = 0;
}
Enemy->iHP = Enemy->iHP - damage_PtoE;
}
break;
}
case 3: // attack/heal
{
printf("내 행동: 공격, 적 행동 : 회복 \n");
{
int damage_PtoE = PC->iAttack;
Enemy->iHP = Enemy->iHP - damage_PtoE;
Enemy->iHP = Enemy->iHP + Enemy->iHeal;
}
break;
}
case 4: // block/attack
{
printf("내 행동: 방어, 적 행동 : 공격 \n");
{
int damage_EtoP = Enemy->iAttack - PC->iBlock*2;
if (damage_EtoP < 0) { // 방어가 공격보다 높으면 0으로 처리.
damage_EtoP = 0;
}
PC->iHP = PC->iHP - damage_EtoP;
}
break;
}
case 5: // block/block
{
printf("내 행동: 방어, 적 행동 : 방어 \n");
break;
}
case 6: //block/heal
{
printf("내 행동: 방어, 적 행동 : 회복 \n");
Enemy->iHP = Enemy->iHP + Enemy->iHeal;
break;
}
case 7: //heal/attack
{
printf("내 행동: 회복, 적 행동 : 공격 \n");
int damage_EtoP = Enemy->iAttack;
PC->iHP = PC->iHP - damage_EtoP;
PC->iHP = PC->iHP + PC->iHeal;
break;
}
case 8: //heal/block
{
printf("내 행동: 회복, 적 행동 : 방어 \n");
PC->iHP = PC->iHP + PC->iHeal;
break;
}
case 9: //heal/heal
{
printf("내 행동: 회복, 적 행동 : 회복 \n");
PC->iHP = PC->iHP + PC->iHeal;
Enemy->iHP = Enemy->iHP + Enemy->iHeal;
break;
}
}//케이스문 끝
}
void reward(character* PC, character* Enemy)
{
system("cls");
int iRewardSelect;
for (int iCnt = 3; iCnt > 0; iCnt--) {
printf("올리고 싶은 능력치를 선택하세요.\n");
printf("1. 공격력 (현재 : %d) \n",PC->iAttack);
printf("2. 방어력 (현재 : %d) \n",PC->iBlock);
printf("3. 회복력 (현재 : %d) \n",PC->iHeal);
printf("보상 선택 기회가 %d번 남았습니다. \n", iCnt);
scanf_s("%d", &iRewardSelect);
switch (iRewardSelect)
{
case 1: //공격력
PC->iAttack += rand() % 3 + 1;
break;
case 2: //방어력
PC->iBlock += rand() % 3 + 1;
break;
case 3: //회복력
PC->iHeal += rand() % 3 + 1;
break;
}
}
}
void savedata()
{
FILE* fp;
fopen_s(&fp, "savedata.bin", "wb");
fwrite(&PC, sizeof(character), 1, fp);
// fprintf(fp, "%4d %4d %4d %4d", PC.iHP, PC.iAttack, PC.iBlock, PC.iHeal);
fclose(fp);
}
void loaddata()
{
FILE* fp;
fopen_s(&fp, "savedata.bin", "rb");
fread(&PC, sizeof(character), 1, fp);
// fscanf_s(fp, "%4d %4d %4d %4d", &PC.iHP, &PC.iAttack, &PC.iBlock, &PC.iHeal);
fclose(fp);
}
void phase0()
{
while (true) {//phase0:
Sleep(500);
system("cls");
int input_0;
printf("메뉴를 선택하세요 : \n");
printf("1. 게임 시작 \n");
printf("2. 불러오기 \n");
printf("3. 종료 \n");
scanf_s("%d", &input_0);
if (input_0 < 1 || input_0 > 3) {
printf("잘못 입력하셨습니다. \n");
_getch();
continue;
}
switch (input_0) {
case 1: //게임시작
phase = phase1;
return;
//goto phase1;
break;
case 2: //불러오기
loaddata();
printf("불러왔습니다.\n");
break;
case 3: //종료
printf("게임을 종료합니다. \n");
phase = phase3;
return;
break;
}
}//while문 0번 끝
}
void phase1()
{
while (true) { //phase1:
Sleep(500);
system("cls");
printf("PC's HP : %d \n", PC.iHP);
printf("PC's AttackPoint : %d \n", PC.iAttack);
printf("PC's BlockPoint : %d \n", PC.iBlock);
printf("PC's HealPoint : %d \n", PC.iHeal);
int input_1;
printf("\n난이도를 선택하세요 : \n");
printf("1. 쉬움 2. 보통 3. 어려움\n");
printf("4. 저장하기 5. 불러오기 6. 뒤로가기\n");
scanf_s("%d", &input_1);
if (input_1 < 1 || input_1 > 6) {
printf("잘못 입력하셨습니다. \n");
_getch();
continue;
}
switch (input_1) {
case 4:
savedata();
printf("저장했습니다. \n");
continue;
case 5:
loaddata();
printf("불러왔습니다. \n");
continue;
case 6:
phase = phase0;
return;
//goto phase0;
break;
}
CreativeEnemy(input_1, PC, &Enemy);
printf("적을 생성했습니다. \n");
printf("Enemy's HP : %d \n", Enemy.iHP);
printf("Enemy's AttackPoint : %d \n", Enemy.iAttack);
printf("Enemy's BlockPoint : %d \n", Enemy.iBlock);
printf("Enemy's HealPoint : %d \n", Enemy.iHeal);
_getch();
phase = phase2;
return;
// goto phase2;
} // while문 1번 끝
}
void phase2()
{
while (true) {
//phase2: //전투 화면
system("cls");
printf("PC's HP : %d \n", PC.iHP);
printf("PC's AttackPoint : %d \n", PC.iAttack);
printf("PC's BlockPoint : %d \n", PC.iBlock);
printf("PC's HealPoint : %d \n", PC.iHeal);
printf("\n");
printf("Enemy's HP : %d \n", Enemy.iHP);
printf("Enemy's AttackPoint : %d \n", Enemy.iAttack);
printf("Enemy's BlockPoint : %d \n", Enemy.iBlock);
printf("Enemy's HealPoint : %d \n", Enemy.iHeal);
int input_2;
printf("\n행동을 선택하세요 : \n");
printf("1. 공격, 2. 방어, 3. 회복 4.도망가기\n");
scanf_s("%d", &input_2);
if (input_2 < 1 || input_2 > 4) {
printf("잘못 입력하셨습니다. \n");
_getch();
continue;
}
switch (input_2) {
case 1:
action(&PC, &Enemy, 1 + rand() % 3);
break;
case 2:
action(&PC, &Enemy, 4 + rand() % 3);
break;
case 3:
action(&PC, &Enemy, 7 + rand() % 3);
break;
case 4:
phase = phase1;
return;
//goto phase1;
break;
}
if (PC.iHP <= 0) {
printf("졌습니다.\n");
phase = phase0;
//goto phase0; //첫 화면으로 보냄
}
if (Enemy.iHP <= 0) {
printf("이겼습니다. \n");
Sleep(500);
reward(&PC, &Enemy);
phase = phase1;
return;
//goto phase1; //전투 선택 화면으로 보냄
}
Sleep(500);
}//while문 2번 끝
}
void phase3()
{
Sleep(500);
system("cls");
return;
}main.cpp
#include "structure.h"
int main()
{
phase = phase0;
srand((unsigned)time(NULL));
while (true) {
phase();
if (phase == phase3) {
return 0;
}
}
}//메인함수 끝반응형