[개발 완료 보고서]
[손으로 그린 대략적인 순서도]
[코드]
// 2025.03.18.(화) - 복켓몬 키우기 2일차 - 덩어리 만들기
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define USER_ATK_RATE 20
#define USER_HP_RATE 35
#define USER_EXP_RATE 120
#define ENEMY_ATK_RATE 10
#define ENEMY_HP_RATE 25
#define ENEMY_EXP_RATE 70
#define SIZE 20
char initial_mons[4][SIZE] = {"이상해씨", "파이이리", "꼬부우기", "피카아츄"}; // 사용자 초기 선택 복켓몬
int initial_mons_ability[4][SIZE] = {{14, 50}, {13, 55}, {10, 60}, {18, 45}}; // 사용자 초기 선택 복켓몬 능력
char pockets[][SIZE] = {"리자드", "어니부기", "버터플", "구구", "고지", "니드리노", "나인테일", "뚜벅쵸", "나옹이", "발챙이", "모다피"};
char *mons;
int mons_ability[3] = {0, 0, 0}; // 상대방 {레벨, 공격력, HP}
int user_ability[4] = {1, 0, 0, 0}; // 사용자 {레벨, 공격력, HP, 경험치}
int user_max_hp;
int turn; // 턴 횟수
int num_floor = 1; // 층 수
int heal = 0; // 치료받았으면 1, 안받았으면 0
int user_select1; // 사용자 초기 포켓몬 선택
int user_select3; // 다음층 갈건지 선택
int result_fight; // 1: 사용자 승 | 2: 사용자 패
int switch1 = 0; // 처음 한판은 초기 능력으로 진행하기 위한 스위치
int switch2 = 0;
void intro();
void select_boketmon(char initial_mons[4][SIZE], int initial_mons_ability[4][SIZE]);
void fight(int user_ability[4], int mons_ability[3], int user_max_hp);
int main()
{
intro();
// 내 포켓몬 선택하기 (최초 1번만 진행 => 반복X)
select_boketmon(initial_mons, initial_mons_ability);
system("clear");
user_ability[1] = initial_mons_ability[user_select1-1][0];
user_ability[2] = initial_mons_ability[user_select1-1][1];
printf("%d번 [%s] (공격력 %d, HP %d) 선택!\n", user_select1, initial_mons[user_select1-1], user_ability[1], user_ability[2]);
while(num_floor <= 30 && switch2 == 0) // 게임을 30층 까지만 진행함.
{
turn = 1, heal = 0; // 턴, 힐 받은거 초기화
if (num_floor % 5 == 0) // 5의 배수층에서는 트레이너를 만남. 레벨 = 2*층수
{
mons_ability[0] = 2 * num_floor;
printf("%d층 TRAINER인 나에게 오다니,, 용감하군..! 덤버라!!!!\n", num_floor);
}
else // 5의 배수층이 아니면 사용자의 레벨의 -1 ~ -3 랜덤 계산
{
mons_ability[0] = user_ability[0] - ((rand() % 3) + 1); // 상대방 복켓몬 레벨 계산
}
if (mons_ability[0] <= 0) // 상대방 복켓몬 레벨 <= 0 이면 1~2레벨
{
mons_ability[0] = (rand() % 2) + 1;
}
mons_ability[1] = mons_ability[0] * ENEMY_ATK_RATE;
mons_ability[2] = mons_ability[0] * ENEMY_HP_RATE;
if (switch1 == 1 && user_ability[0] > 1) // 처음에는 초기 설정 능력 부여, 다음 레벨부터는 레벨의 배수로 부여
{
user_ability[1] = user_ability[0] * USER_ATK_RATE;
user_ability[2] = user_ability[0] * USER_HP_RATE;
}
switch1 = 1;
mons = pockets[(rand() % 11)]; // 랜덤으로 상대방 복켓몬 1마리 선택
printf("\n--------------< %d층 %d턴>--------------\n", num_floor, turn);
printf("이번에 만난 복켓몬은 [%s] 입니다.\n\n", mons);
printf("[상대방] Lv. %d\t | 공격력 %d\t | HP %d\n", mons_ability[0], mons_ability[1], mons_ability[2]);
printf("[사용자] Lv. %d\t | 공격력 %d\t | HP %d\t | 경험치 %d/%d\n", user_ability[0], user_ability[1], user_ability[2], user_ability[3], user_ability[0]*USER_EXP_RATE);
// 나랑 상대방이랑 번갈아가면서 싸움 (치료받을지 싸울지 선택)
user_max_hp = user_ability[2]; // 사용자의 최대 HP 저장 (치료할때 쓰임)
fight(user_ability, mons_ability, user_max_hp);
system("clear");
switch (result_fight) // 전투 결과에 따른 switch-case문
{
case 1: // 전투에서 사용자가 승리한 경우
{
user_ability[3] += mons_ability[0]*ENEMY_EXP_RATE; // 경험치 추가
if (user_ability[3] >= user_ability[0]*USER_EXP_RATE) // 경험치가 초과하면 레벨업
{
user_ability[3] -= user_ability[0]*USER_EXP_RATE; // 레벨업 하고 남은 경험치 다음 레벨에 추가
user_ability[0] += 1; // 레벨업
printf("LEVEL UP!👍\n");
}
user_ability[2] = user_max_hp; // 전투가 끝나면 사용자 HP 풀로 회복됨
printf("\n--------------< %d층 %d턴>--------------\n", num_floor, turn);
printf("🤟[%s] 무찌르기 성공!!🤟\n\n", mons);
printf("[상대방] Lv. %d\t | 공격력 %d\t | HP %d\n", mons_ability[0], mons_ability[1], mons_ability[2]);
printf("[사용자] Lv. %d\t | 공격력 %d\t | HP %d\t | 경험치 %d/%d\n", user_ability[0], user_ability[1], user_ability[2], user_ability[3], user_ability[0]*USER_EXP_RATE);
if (num_floor == 30)
{
switch2 = 1;
break;
}
printf("다음 층 Go❓❓ [1. ⭕ | 2. ❌] : ");
scanf("%d", &user_select3);
system("clear");
if (user_select3 == 1) // 다음층 선택
{
num_floor++;
continue;
}
else if (user_select3 == 2) // 현재 층에서 재전투
{
continue;
}
}
case 2:
{
printf("GAME OVER...!😭\n");
switch2 = 1;
break;
}
}
}
if (switch2 == 0)
{
printf("🎊최종 보스를 물리쳤습니다!!!!!!!🎊\n");
printf("당신은 [ 복켓몬 마스터 ] 입니다!!!!\n");
}
return 0;
}
// =============================== 함수 ================================
// 인트로
void intro()
{
printf("🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\t🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\t🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\n");
printf("🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\t🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\t🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\n");
printf("🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\t🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\t🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\n");
printf("🟨⬛⬜🟨🟨🟨🟨🟨⬛⬜🟨\t🟨⬛⬜🟨🟨🟨🟨🟨⬛⬜🟨\t🟨⬛⬜🟨🟨🟨🟨🟨⬛⬜🟨\n");
printf("🟨⬛⬛🟨🟨🟨🟨🟨⬛⬛🟨\t🟨⬛⬛🟨🟨🟨🟨🟨⬛⬛🟨\t🟨⬛⬛🟨🟨🟨🟨🟨⬛⬛🟨\n");
printf("🟨⬛⬛🟨🟨⬛🟨🟨⬛⬛🟨\t🟨⬛⬛🟨🟨⬛🟨🟨⬛⬛🟨\t🟨⬛⬛🟨🟨⬛🟨🟨⬛⬛🟨\n");
printf("🟥🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥\t🟥🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥\t🟥🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥\n");
printf("🟥🟥🟨🟨🟨⬛🟨🟨🟨🟥🟥\t🟥🟥🟨🟨🟨⬛🟨🟨🟨🟥🟥\t🟥🟥🟨🟨🟨⬛🟨🟨🟨🟥🟥\n");
printf("🟥🟥🟨🟨⬛🟨⬛🟨🟨🟥🟥\t🟥🟥🟨🟨⬛🟨⬛🟨🟨🟥🟥\t🟥🟥🟨🟨⬛🟨⬛🟨🟨🟥🟥\n");
printf("🟥🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥\t🟥🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥\t🟥🟨🟨🟨🟨🟨🟨🟨🟨🟨🟥\n");
printf("🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\t🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\t🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨🟨\n\n");
}
// 내 캐릭터 선택 함수
void select_boketmon (char initial_mons[4][SIZE], int initial_mons_ability[4][SIZE])
{
printf("❤️🩷🧡💛💚💙🩵💜🤎🖤🩶🤍 복켓몬 키우기 🤍🩶🖤🤎💜🩵💙💚💛🧡🩷❤️\n");
printf("당신의 여정을 응원합니다~~ 당신의 첫 복켓몬을 선택해주세요!\n\n");
printf("\t 1. %s (공격력 %d, HP %d)\n", initial_mons[0] , initial_mons_ability[0][0], initial_mons_ability[0][1]);
printf("\t 2. %s (공격력 %d, HP %d)\n", initial_mons[1] , initial_mons_ability[1][0], initial_mons_ability[1][1]);
printf("\t 3. %s (공격력 %d, HP %d)\n", initial_mons[2] , initial_mons_ability[2][0], initial_mons_ability[2][1]);
printf("\t 4. %s (공격력 %d, HP %d)\n", initial_mons[3] , initial_mons_ability[3][0], initial_mons_ability[3][1]);
printf("===========================================================\n");
scanf("%d", &user_select1);
printf("%d번 [%s]를 선택하였습니다.\n", user_select1, initial_mons[user_select1-1]);
// return user_select1;
}
// 사용자와 상대방 전투 함수
void fight(int user_ability[4], int mons_ability[3], int user_max_hp)
{
int user_select2;
while (user_ability[2] > 0 || mons_ability[2] > 0)
{
turn++;
printf("🤕치료 or 전투🔥 [1. 치료 | 2. 전투] : ");
scanf("%d", &user_select2);
system("clear");
if (user_select2 == 1 && heal == 0) // 치료를 선택한 경우(heal = 0 이면 아직 치료를 안받은거)
{
user_ability[2] = user_max_hp;
heal = 1;
turn--;
printf("🩹회복!! HP %d 입니다.🩹\n\n", user_max_hp);
}
else if (user_select2 == 2)
{
mons_ability[2] -= user_ability[1]; // 사용자가 먼저 공격함.
if (mons_ability[2] <= 0) // 상대방이 죽으면 result_fight = 1
{
mons_ability[2] = 0;
result_fight = 1;
break;
}
else // 상대방이 죽지 않았으면 상대방이 공격
{
user_ability[2] -= mons_ability[1];
}
if (user_ability[2] <= 0) // 사용자가 죽으면 result_fight = 2
{
user_ability[2] = 0;
result_fight = 2;
break;
}
}
printf("\n--------------< %d층 %d턴>--------------\n", num_floor, turn);
printf("이번에 만난 복켓몬은 [%s] 입니다.\n\n", mons);
printf("[상대방] Lv. %d\t | 공격력 %d\t | HP %d\n", mons_ability[0], mons_ability[1], mons_ability[2]);
printf("[사용자] Lv. %d\t | 공격력 %d\t | HP %d\t | 경험치 %d/%d\n", user_ability[0], user_ability[1], user_ability[2], user_ability[3], user_ability[0]*USER_EXP_RATE);
}
}
[출력결과]
'C > 개인프로젝트02 - 복켓몬 키우기' 카테고리의 다른 글
[2025.03.17] 복켓몬 키우기_1일차_개발 계획서 및 개발 일지 (0) | 2025.03.17 |
---|