/////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h> // isalnum
/* 전역변수 */
char my_bocketmon[4][16] = {"이상해씨", "파이리", "꼬부기", "피카츄"}; // 아스키 아트로 해보자
char enemy[11][20] = {"뚜벅초", "피죤", "토케피", "야도란", "또가스",
"이브이", "버터풀", "치코리타", "잉어킹", "꼬마돌", "나무지기"};
int name_random, level_random;
int swit = 1;
int result; // 최종전투 결과
int special_ex = 5; // 트레이너 처치 시 특별 경험치 (유지보수)
#define ONE 1
// 1렙 기준으로 값 세팅 = 이후 렙업 시, att=렙업+2 이런식으로 늘리기?
int my_ex, my_level=1, my_att=3;
int my_hp, real_hp ;
int enemy_level, enemy_att, enemy_hp;
/* 함수 */
void f_my_bocketmon(); // 복켓몬 고르는 함수
/////////////////////////////////////////////////////////////////////////
/* 메인 */
int main()
{
// 목표: 30층 최종보스 잡고 챔피언이 되는 것!
// 1.포켓몬을 고른다
// 2.전투를 시작한다
// 3.전투가 끝나면 다음 층으로 넘어간다
// 4.5층마다 트레이너를 만난다
// 5.마지막 30층의 트레이너를 만난다
// n레벨 당 필요 경험치: n개
// 렙 1업 당 공격력+2, HP+5
/* 덩어리1) 포켓몬 선택 */
printf("=Welcome to BOCKET_MON world!\n");
printf("함께 모험을 떠날 복켓몬을 고르세요!\n");
for (int i=0; i < 4; i++) // 복켓몬 리스트
{
printf("%s ", my_bocketmon[i]);
}
int my_pick; // 나의 선택
printf("입력(1~4): ");
scanf("%d", &my_pick);
for (int i = 1; i <= 4; i++)
{
if (my_pick==i)
{
printf("%s를 고르셨군요.\n", my_bocketmon[i-1]);
}
} // 내 포켓몬 = my_bocketmon[my_pick-1]
/* 덩어리2) 전투 */
// 1. 5의 배수인지? n > 전투
// 2. 30층인지? n > 트레이너
my_level = 1, my_att = 3; // 최초 레벨 1일 때 세팅
my_hp = (my_level + 10); //내 피
printf("\n모험을 떠나볼까요?\n");
/* 적 복켓몬 or 적 트레이너 or 최종보스 */
for (int i = 1; i <= 30; i++) // 1층~30층
{
// 경험치가 다 쌓이면 렙업 (같을때라고 하면안됨)
if (my_ex >= my_level)
{
my_level += 1;
my_att += 5;
real_hp += 5;
my_ex = 0; //렙업했으면 경험치 초기화
}
my_hp = (my_level + 10 + real_hp);
printf("real:%d, my_hp:%d",real_hp,my_hp);
printf("\n%s의 레벨[lv.%d]/ 경험치:%d / 공격력:%d / HP:%d \n"
,my_bocketmon[my_pick-1],my_level,my_ex,my_att,my_hp);
printf("...%d층 도착...\n", i);
// 1. 적 복겟몬
if ((i % 5 != 0)) // 5의배수 층 아닐 때, 적포켓몬 만남
{
/* 적 랜덤 추출 */
printf("적 복켓몬을 만났다! ");
//int name_random, level_random;
srand(time(NULL)); // 이게 없으면 값이 고정됨
name_random = (rand() % 11) +1; // 종류: 1~11
printf("%s이다.", enemy[name_random]);
level_random = (rand() % 3) +1; // 레벨: 1,2,3
if (my_level <= 3) // 내 레벨이 1~3이면
{
printf("(lv.%d)\n", (my_level));
enemy_level = my_level;
}
else if (my_level > 3) // 레벨이 3 이상이면
{
enemy_level = (my_level - level_random);
printf("(lv.%d)\n", (enemy_level));
}
enemy_att = enemy_level;
enemy_hp = enemy_level+2;
while (swit) // 공격 or 치유
{
int attack_or_cure; // 선택지
int cure_chance = 1; // 치료는 1번뿐 (층 바뀌면 기회 충천됨)
// 1. 둘다 피가 있을 때
while (my_hp > 0 && enemy_hp > 0) // or가 아니라 and
{
printf("\n%s의 HP:%d / 적 %s의 HP:%d\n",
my_bocketmon[my_pick-1],my_hp,enemy[name_random],enemy_hp);
printf("무엇을 하겠습니까?[1.공격 / 2.치유]: ");
scanf("%d", &attack_or_cure);
// 1.공격
if (attack_or_cure == 1)
{
printf("적을 공격합니다. ");
enemy_hp -= my_att;
printf("--------------적 HP:(%d)\n", enemy_hp);
printf("%s(이)가 공격합니다. ", enemy[name_random]);
my_hp -= enemy_att;
printf("-우리 애 HP:(%d)\n", my_hp);
// 왜 안넘어가냐고~~~ 와 범위가 문제였음ㅋ..
}
// 2.치유
else if (attack_or_cure == 2)
{
if (cure_chance == 1)
{
printf("치유합니다.\n");
cure_chance = 0; // 치유는 층마다 1번 뿐
my_hp = (my_level + 10 + real_hp);
// 내포켓몬 피 꽉 채워주기
}
else
{
printf("더이상 치유 할 수 없습니다.\n");
break;
}
}
}
// 2. 둘중 하나가 죽었을 때
if (enemy_hp <= 0) // 적이 죽었을 때
{
char next_floor_ask;
printf("\n승리!\n");
my_ex += 1; // 경험치 획득
printf("현재 레벨:%d / 현재 경험치:%d\n",my_level,my_ex);
printf("\n다음 층으로 가시겠습니까?(y/n): ");
getchar();
scanf("%c", &next_floor_ask);
if (next_floor_ask == 'y')
{
printf("다음 층으로 넘어갑니다.(enter)\n");
getchar();
break;
}
else{
printf("다시 전투를 시작합니다.(enter)\n\n");
enemy_hp = enemy_level+2;
my_hp = (my_level + 10 + real_hp);
getchar();
continue;
}
getchar();
}
else if (my_hp <= 0) // 내 포켓몬이 죽었을 때
{
printf("패배\n");;
return 0;
}
}
}
// 2. 적 트레이너
else if (i % 5 == 0 && i<30) // 5의배수 층일 때, 적트레이너 만남
{
enemy_level = (i*2);
enemy_att = (i+5);
enemy_hp = (enemy_level);
printf("적트레이너를 만났다!!\n");
printf("적 복겟몬은 %s(lv.%d)이다.",enemy[name_random],enemy_level);
while (1) // 공격 or 치유
{
int attack_or_cure; // 선택지
int cure_chance = 1; // 치료는 1번뿐 (층 바뀌면 기회 충천됨)
// 1. 둘다 피가 있을 때
while (my_hp > 0 && enemy_hp > 0) // or가 아니라 and
{
printf("\n현재 %s의 HP:%d / 적 %s의 HP:%d\n",
my_bocketmon[my_pick-1],my_hp,enemy[name_random],enemy_hp);
printf("무엇을 하겠습니까?[1.공격 / 2.치유]: ");
scanf("%d", &attack_or_cure);
// 1.공격
if (attack_or_cure == 1)
{
printf("적을 공격합니다. ");
enemy_hp -= my_att;
printf("--------------적 HP:(%d)\n", enemy_hp);
printf("%s(이)가 공격합니다. ", enemy[name_random]);
my_hp -= enemy_att;
printf("-우리 애 HP:(%d)\n", my_hp);
// 왜 안넘어가냐고~~~ 와 범위가 문제였음ㅋ..
}
// 2.치유
else if (attack_or_cure == 2)
{
if (cure_chance == 1)
{
printf("치유합니다.\n");
cure_chance = 0; // 치유는 층마다 1번 뿐
my_hp = (my_level + 10 + real_hp);
}
else
{
printf("더이상 치유 할 수 없습니다.\n");
break;
}
}
}
// 2. 둘중 하나가 피가 없을 때
if (enemy_hp <= 0) // 적이 죽었을 때
{
char next_floor_ask;
printf("\n승리!\n");
my_ex += special_ex; // 경험치 획득
printf("트레이너를 무찔러 경험치를 %d나 얻었다!\n",special_ex);
printf("\n다음 층으로 가시겠습니까?(y/n): ");
getchar();
scanf("%c", &next_floor_ask);
if (next_floor_ask == 'y')
{
printf("다음 층으로 넘어갑니다.(enter)\n");
getchar();
break;
}
else{
printf("다시 전투를 시작합니다.(enter)\n\n");
enemy_hp = enemy_level;
my_hp = (my_level + 10 + real_hp);
getchar();
continue;
}
getchar();
}
else if (my_hp <= 0) // 내 포켓몬이 죽었을 때
{
printf("패배\n");
return 0;
}
}
}
// 3. 최종 보스
else
{
char boss = "흑화한 주영몬";
printf("드디어 30층이다..!\n");
printf("최종보스 '흑화한 주영몬'을 만났다;;\n");
enemy_level = 60;
enemy_att = 30;
enemy_hp = 100;
int attack_or_cure; // 선택지
int cure_chance = 1; // 치료는 1번뿐 (층 바뀌면 기회 충천됨)
// 1. 둘다 피가 있을 때
while (my_hp > 0 && enemy_hp > 0) // or가 아니라 and
{
printf("\n현재 %s의 HP:%d / 주영몬의 HP:%d\n",
my_bocketmon[my_pick-1], my_hp, enemy_hp);
printf("무엇을 하겠습니까?[1.공격 / 2.치유]: ");
scanf("%d", &attack_or_cure);
// 1.공격
if (attack_or_cure == 1)
{
printf("적을 공격합니다. ");
enemy_hp -= my_att;
printf("--------------적 HP:(%d)\n", enemy_hp);
printf("주영몬이 공격합니다. ");
my_hp -= enemy_att;
printf("-우리 애 HP:(%d)\n", my_hp);
// 왜 안넘어가냐고~~~ 와 범위가 문제였음ㅋ..
}
// 2.치유
else if (attack_or_cure == 2)
{
if (cure_chance == 1)
{
printf("치유합니다.\n");
cure_chance = 0; // 치유는 층마다 1번 뿐
my_hp = (my_level + 10 + real_hp);
}
else
{
printf("더이상 치유 할 수 없습니다.\n");
break;
}
}
}
// 2. 둘중 하나가 피가 없을 때
if (enemy_hp <= 0) // 적이 죽었을 때
{
char next_floor_ask;
printf("승리!\n");
printf("축하합니다! 당신은 복겟몬 마스터~\n");
getchar();
}
else if (my_hp <= 0) // 내 포켓몬이 죽었을 때
{
printf("ㅠㅠ졌습니다..마스터가 되고싶었는데..!\n");
return 0;
}
}
// 전투가 끝나고 반영을 해줘야하니까 전투끝에 위치
}
printf(" end ");
//끝지점
return 0;
}
/////////////////////////////////////////////////////////////////////////
'C언어 > 연습장' 카테고리의 다른 글
포인터 공부 (0) | 2025.04.01 |
---|---|
포인터 연습 (0) | 2025.03.27 |
복켓몬 코드 정리 (0) | 2025.03.18 |
로또 - 최종 코드 (디버깅 필요) (0) | 2025.03.16 |
로또 / 덩어리3 함수화 하기 전 (0) | 2025.03.16 |