[2025.03.18] 복켓몬 키우기_2일차_개발 완료 보고서 및 개발 일지

2025. 3. 18. 22:03·C/개인프로젝트02 - 복켓몬 키우기

[개발 완료 보고서]

 

 

 

[손으로 그린 대략적인 순서도]

 

 

 

 

[코드]

// 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
'C/개인프로젝트02 - 복켓몬 키우기' 카테고리의 다른 글
  • [2025.03.17] 복켓몬 키우기_1일차_개발 계획서 및 개발 일지
polibo
polibo
Polibo의 개발 성장기 지켜봐주십슈 (콩 싫어해요.)
  • polibo
    Polibo와 개발 콩나무 키우기
    polibo
  • 전체
    오늘
    어제
    • 분류 전체보기 (64)
      • Python (23)
      • C (32)
        • 본수업 (19)
        • 예습 (7)
        • 개인프로젝트01 - 로또 (3)
        • 개인프로젝트02 - 복켓몬 키우기 (2)
        • 개인프로젝트03 - 김복천국 POS기 (1)
        • 팀프로젝트01 - 용사 복이의 대모험 RPG (0)
        • 팀프로젝트02 - 메일 프로그램 (0)
      • TCP_IP (0)
      • DB (1)
      • C++ (7)
      • QT (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩
    조건문
    Python
    파이썬
    while문
    if문
    파이썬조건문
    C
    반복문
    파이썬 숫자야구
    문자열
    파이썬반복문
    순서도
    파이썬예제
    c우선순위
    c언어
    for문
    파이썬게임
    c언어 scanf
    else if
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
polibo
[2025.03.18] 복켓몬 키우기_2일차_개발 완료 보고서 및 개발 일지
상단으로

티스토리툴바