소연의_개발일지
article thumbnail

 

 

 

미튜브 스타가 되자

 

 


개발계획서

 
참여인원
박소연
프로젝트 소개
미튜버 100만 스타가 되자 프로젝트 ⭐
활동일시
4/8(토) ~ 4/9(일)
주요 주제
반복문과 if문을 활용하여 미튜버가 100만 구독자를 달성하는 코드를 완성해라.
개발목적
조건문과 제어문, 반복문을 연습
개발환경
Visual Studio Code / Window OS / C언어
요구사항
[ 문제 규칙 ]
(함수 가능, 배열 불가능)
목표 : 구독자 0으로 시작해서 구독자 100만 미튜버 되기
2. 매일 스케쥴을 아래 1가지 선택
◦ 방송하기(최소치와 최대치 사이에서 랜덤하게 구독자가 오름, 단, 낮은 확률로 랜덤하게 악플러(악질)가 증가(구독자 많을수록 확률 증가), 구독자에 따라 조회수가 발생)
◦ 미튜브 공부하기(방송능력이 소량 증가함, 랜덤하게 올라가며, 실패할 확률이 있음.)
◦ 휴식(체력 관리)
◦ 미튜브 관리(악플러(악질)을 제거, 조회수에 따라 수입을 획득)
◦ 장비 또는 편집자 계약(방송능력이 현재 수치의 비율로 증가함, 대신 수입을 대량 사용, 5번만 사용가능)
3. 유지될 스텟 방송능력 : 방송시 구독자가 오르는 랜덤값의 최대치를 증가시켜줌. 체력 : 행동을하기 위한 스텟 부족할 경우 병원행(특정 주차만큼 기회 날림) 관리 : 악플러(악질)가 증가하면 감소함. 관리가 잘 되지 않았을 때 방송시 구독자 랜덤 상승치의 최소치가 점점 감소하여 안정적인 구독자 상승이 되지 않음
4. 100만이 되면 100만유튜버가 되기 위해 몇일 걸렸는지 보여줌.
구현기능
- 매일 스케쥴 1개 선택 가증(방송, 공부, 휴식, 관리, 장비 또는 편집자 계약) - 스탯 유지(방송능력, 체력, 관리) - 100만이 되면 몇 일 걸렸는지 보여줌 - 방송능력, 구독자, 악플러 등장 등에 랜덤한 함수를 넣어서 랜덤하게 등장하게 함
평가
- 문제에 따라만 했는데 엄청 밋밋한 기분. 게임은 정말 많은 사람의 노력이 필요하구나를 느꼈다…
일정표

 


순서도

여기에 백만 넘으면 종료되는거 추가해야합니다.


코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int random_fan_num(int broadcast_skill, int manage_point) // 랜덤으로 팬 숫자 반영하는 함수(방송능력과 관리점수에 따라 결정됨.)
{
    srand((unsigned)time(NULL));
    int random;
    for (int j = 1; j <= 10; j++)
    {
        if (broadcast_skill <= 100 * j)
        {
            random = rand() % 100 * j + 1;
            break;
        }
    }
    random = random * (1 - manage_point * 0.05); // 관리능력 1점당 5%씩 깎임. -> 관리능력 1점= -5%, 관리능력 2점 = -10%....
    return random;
}
int income_per(int subscribers_num) // 구독자에 따라 수입량 달라짐
{
    if (subscribers_num > 0)
    {
        if (subscribers_num <= 1000)
        {
            return subscribers_num * 20;
        }
        else if (subscribers_num > 1000 && subscribers_num <= 10000)
        {
            return subscribers_num * 50;
        }
        else if (subscribers_num >= 10000 && subscribers_num <= 100000)
        {
            return subscribers_num * 60;
        }
        else if (subscribers_num > 100000)
        {
            return subscribers_num * 50;
        }
    }
    else if (subscribers_num <= 0)
    {
        printf("구독자가 없어서 수입이 생기지 않았습니다. 관리가 필요합니다.\n");
        return 0;
    }
}
int anti_fan_appear(int subscribers_num) // 안티팬 확률 80프로로 등장
{
    int random = rand() & 100 + 1;
    if (random >= 80)
    {
        printf("안티팬이 나타났습니다!\n");
        int anti_num = subscribers_num * 0.1 + 0.5;
        printf("안티팬이 %d명 나타났습니다.\n", anti_num);
        return anti_num;
    }
    else
    {
        printf("안티팬이 나타나지 않았습니다.\n");
        return 0;
    }
}

int random_broadcast_skill() // 방송능력 결정하는 함수
{
    int random_get = rand() % 100 + 1;
    int random_score = rand() % 100 + 1;
    if (random_get >= 20)
    {
        printf("공부를 열심히 했습니다..!\n");
        printf("방송능력이 %d만큼 증가합니다.\n", random_score);
        return random_score;
    }
    else
    {
        printf("눈만 감았는데 밤이 되었습니다...\n");
        printf("방송능력이 그대로 유지됩니다.\n");
    }
}
int click_number(int subscribers_num) // 조회수 함수
{
    if (subscribers_num > 0)
    {
        return subscribers_num * 1.5; // 조회수는 구독자 수의 1.5배 늘어남.
    }
    else if (subscribers_num <= 0)
    {
        printf("구독자가 없어서 조회수도 늘지 않았습니다. \n");
    }
}

int main()
{
    int game_start;                     // 게임 시작
    int user_choice;                    // 선택창 옵션 선택
    int day = 0;                        // 날짜
    int hp = 100;                       // 체력
    int income = 0;                     // 수입
    int manage_point = 0;               // 관리필요도
    int subscribers_num = 0;            // 구독자 수
    int holic_fan = 0;                  // 열정팬
    int anti_fan = 0;                   // 안티팬
    int click_num = 0;                  // 조회수
    int random_number_for_fan;          // 구독자비율
    int random_number_for_anti_fan;     // 악플러 나타날 확률
    int random_num_for_broadcast_skill; // 방송능력 느는 함수
    int broadcast_skill = 100;          // 방송능력
    int boost_choice;                   // 5번항목 부스트 뭐할지 선택
    int over_five = 0;                  // 5번항목-> 5번 이상 선택할 수 없음
    int game_over = 0;

    // 방송시작 및 안내
    printf("미튜브 키우기 시작! \n");
    printf("열심히 관리해서 100만유튜바 달성을 위해 가봅시다.\n");
    printf("가보시겠어요? 1 선택: ");
    scanf("%d", &game_start);
    // system("clear");

    if (game_start == 1)
    {
        printf("잘 선택하셨습니다!\n");
        // 여기에 규칙 추가 printf로
        while (game_over != 1)
        {
            day++;
            printf("아침이 밝았습니다.\n");
            printf("                                                   미튜브 활동 %d일차\n", day);
            printf("+=========================당신의 스탯창=============================+\n");
            printf("+ 당신의 스탯창: 방송능력: %d점, 체력: %d점, 관리점수: %d점\n", broadcast_skill, hp, manage_point);
            printf("+ 구독자: %d명, 악플러: %d명, 누적조회수: %d건, 방송능력: %d점, 수입: %d원\n", subscribers_num, anti_fan, click_num, broadcast_skill, income);
            printf("+===================================================================+\n");
            printf("1. 방송하기 2. 미튜브 공부하기 3. 휴식 4. 미튜브 관리 5. 장비또는 편집자 계약\n");
            printf("선택하세요: ");
            scanf("%d", &user_choice);
            // system("clear");
 

 

            if (user_choice == 1)
            {
                printf("방송을 선택하셨습니다. \n");
                if (hp < 10)
                {
                    printf("너무 피곤했던 것일까요... 방송을 키려고했는데 잠들고 말았습니다.\n");
                    printf("그대로 깊은 잠에 빠져듭니다. \n"); //
                    printf("규칙적인 방송을 하지 못해 악플러가 증가합니다...\n");
                    anti_fan *= 1.1;
                    continue;
                }
                printf("체력이 10점 줄어듭니다.\n");
                hp -= 10;
                printf("구독자가 %d명 늘어납니다.\n", random_fan_num(broadcast_skill, manage_point));
                subscribers_num += random_fan_num(broadcast_skill, manage_point);
                click_num += click_number(subscribers_num); // 조회수는 구독자의 1.5배 늘어남. 함수 내에 추가할 수 있나?
                printf("조회수도 %d만큼 늘어납니다.\n", click_number(subscribers_num));
                printf("수입이 %d원 만큼 증가합니다.\n", income_per(subscribers_num)); // 수입은 조회수에 비례하여 늘어남.
                income += income_per(subscribers_num);

                printf("안티팬이 나타날 수 있습니다... \n"); // 여기에 usleep 넣는다면?
                int anti_num = anti_fan_appear(subscribers_num);
                anti_fan += anti_num;
                if (anti_fan > 0)
                {
                    printf("안티팬이 있으니 관리가 필요합니다! \n");
                    printf("관리필요도가 1 증가합니다..\n");
                    manage_point++;
                }
            }
            if (user_choice == 2)
            {
                printf("미튜브 공부하기를 선택하셨습니다. \n");
                if (hp < 10)
                {
                    printf("너무 피곤했던 것일까요... 공부하려고 했는데 책상 앞에서 그만 잠들고 말았습니다.\n");
                    printf("그대로 깊은 잠에 빠져듭니다. \n"); //
                    continue;
                }
                printf("체력이 10점 깎입니다.\n");
                hp -= 10;
                printf("방송능력이 결정되는 중입니다....\n");
                broadcast_skill += random_broadcast_skill();
                // 여기에 랜덤으로 방송능력 결정되는 함수 넣기
            }
            if (user_choice == 3)
            {
                printf("휴식을 선택하셨습니다. \n");
                printf("체력이 50 늘어납니다.\n"); // 여기에 어떻게 체력이 늘어날건지 자세하게 추가
                hp += 50;
                // 잠자기, 노래듣기, 맛있는 것 먹기, 친구들 만나기,,, 등에 따라 체력 늘어남-> 나중에 추가
            }
            if (user_choice == 4)
            {
                if (hp < 10)
                {
                    printf("너무 피곤했던 것일까요... 미튜브 관리를 하려고 했는데 잠들고 말았습니다.\n");
                    printf("그대로 깊은 잠에 빠져듭니다. \n"); //
                    printf("규칙적인 방송을 하지 못해 악플러가 증가합니다...\n");
                    anti_fan *= 1.1;
                    continue;
                }
                printf("미튜브 관리를 선택하셨습니다. \n");
                printf("체력이 10 깎입니다.\n");
                hp -= 10;
                if (manage_point > 0)
                {
                    printf("관리로 인해 관리점수가 줄어듭니다. \n");
                    printf("관리점수가 늘어나지 않게 주의하세요! \n");
                    manage_point = 0; // 관리점수 최저값은 0으로 유지시키기
                }
                else
                {
                    printf("관리점수가 없어서 열정팬이 늘어납니다");
                    holic_fan += subscribers_num * 0.05; // 구독자의 0,05 퍼센트씩 증가
                }
                if (subscribers_num > 0)
                {
                    printf("수입이 %d원  만큼 증가합니다.\n", income_per(subscribers_num));
                    income += income_per(subscribers_num);
                }
                else
                {
                    printf("수입이 없어서 볼 내역이 없습니다.\n");
                }
                if (anti_fan > 0)
                {
                    printf("악플러가 제거됩니다.\n");
                    anti_fan *= 0.1; // 악플러는 일단 90프로씩 제거함. 관리능력에 따라 증가하면 좋을 것 같음.
                }
                else if (anti_fan == 0)
                {
                    printf("안티팬이 없네요! 다행입니다.\n ");
                }
                else if (anti_fan < 0)
                {
                    anti_fan == 0;
                }
            }
 
            if (user_choice == 5)
            {
                if (over_five < 5)
                {
                    if (hp < 20)
                    {
                        printf("너무 피곤했던 것일까요... 움직이지 않습니다.\n");
                        printf("119를 부릅니다... 오늘은 일하지 못할 것 같습니다. \n"); //
                        printf("병원비로 10만원을 썼습니다...");
                        income -= 100000;
                        continue;
                    }
                    over_five++;
                    printf("장비 또는 편집자 계약을 선택하셨습니다. \n");
                    printf("어떤 것을 할지 선택하세요: 장비구매, 유명 유튜버와 합방, 편집자 계약: ");
                    scanf("%d", &boost_choice);
                    if (boost_choice == 1)
                    {
                        printf("장비 구매를 선택하셨습니다.\n"); // 어떤 장비를 살지 추가하기
                        if (income < 1000000)
                        {
                            printf("돈이 부족한 것 같습니다... 다른 선택을 합시다.\n");
                            day--;
                            continue;
                        }
                        else if (income >= 1000000)
                        {
                            printf("백만원을 소비했습니다. \n");
                            income -= 1000000;
                            printf("갑자기 달라진 고퀄 영상에 구독자가 떡상합니다.\n");
                            subscribers_num *= 5;
                        }
                    }
                    else if (boost_choice == 2)
                    {
                        printf("유튜버와 합방을 선택했습니다. \n"); // 햇님, 쯔양, 잇섭, 등등
                        if (income < 1000000)
                        {
                            printf("돈이 부족한 것 같습니다... 다른 선택을 합시다.\n");
                            day--;
                            continue;
                        }
                        else
                        {
                            printf("출연료 1천만원을 소비했습니다. \n");
                            income -= 10000000;
                            printf("햇님의 팬들이 몰려옵니다... 갑자기 구독자가 많아집니다.\n");
                            subscribers_num *= 10;
                        }
                    }
                    else if (boost_choice == 3)
                    {
                        if (income < 1000000)
                        {
                            printf("돈이 부족한 것 같습니다... 다른 선택을 합시다.\n");
                            day--;
                            continue;
                        }
                        else
                        {
                            printf("편집자 계약을 선택하셨습니다.\n");
                            printf("200만원을 소비했습니다. \n");
                            income -= 2000000;
                            printf("유튜브 알고리즘에 뜨기 시작했습니다..이제 당신은 구독자가 지속적으로 늘어납니다.\n");
                            subscribers_num * 7;
                        }
                    }
                    printf("오랜만에 바쁘게 일했습니다. 체력이 20 깎입니다.\n");
                    hp -= 20;
                }
                else
                {
                    printf("이 항목은 5번 까지만 선택할 수 있습니다.\n");
                    printf("다시 선택해 주세요.\n");
                    continue;
                }
            }

            // 저녁(스탯 정리 및 안내)
            printf("=============================================================\n");
            printf("저녁이 되었습니다.\n");
            printf("오늘의 내역을 정산합니다. \n");
            printf("구독자: %d명, 누적조회수: %d건, 방송능력: %d점, 수입: %d원\n", subscribers_num, click_num, broadcast_skill, income);
            printf("잠에 듭니다..\n");
            printf("=============================================================\n");
            // char enter = getchar();
            // system("clear");

            // 백만일 경우
            if (subscribers_num >= 1000000)
            {
                // system("clear");
                printf("드디어 100만 유튜바가 되었습니다! 축하합니다. \n");
                printf("지금까지 달려온 눈물겨운 날들이 %d일, 벌어들인 수익은 %d원, 누적조회수는 %d건, 구독자는 %d명 입니다.\n", day, income, click_num, subscribers_num);
                printf("노란 유튜바 뱃지를 달고 코리아 유튜바 축제에 참가 초청을 받았습니다.\n");
                printf("당신은 지금까지 숨기고 있던 사직서를 당당히 가슴에 품고 웃으며 집을 나섭니다. 발걸음이 날아갈 것 같습니다.\n");
                game_over = 1;
            }
        }
    }
    else
    {
        printf("당신은 꿈에서 깨어납니다. 7시 알람이 울립니다.\n 유튜브 100만으로 성공해서 백만장자가 된 행복한 삶이 한순간의 허황된 꿈이었던 겁니다...\n");
    }
    // 다시 하시겠습니까 추가
    return 0;
}
 

 

코드 실행 화면

 

디자인은 아주 포기했습니다.

두달만에 100만 완성 ㅋ

 

 


 

오류 수정 및 고민

 

1)구독자가 늘어도 while문이 빠져나가지 않는..이상한 일이 생겨서

코드를 다시 확인해봄

→ 구독자 == 100만으로 되어있었던 것임... >=(이상)으로 수정했다.

 

2) 그리고 조회수와 수입이 -(마이너스)가 되는 문제가 있음.

→ 관리포인트가 구독자에 영향을 미치고, 구독자가 조회수와 수입에 영향을 미치는 구조인데, 관리 포인트가 0 이하로 떨어지게 되는 상황이 발생해서 이 문제가 생겼다. 그래서 그냥 관리포인트 관리하려고 하면 0으로 변경되게 만들었다.

 

3) 코드 오류

comparison between pointer and integer

char 타입과 숫자형 타입과이 차이에서 나오는 에러. if문에 함수()==0 부분에 ()를 넣지 않아서 생긴 오류였음.

 

passing argument 1 of ‘option_result’ makes pointer from integer without a cast [-Wint-conversion]

'option_result'의 첫 번째 인자는 포인터인데, 정수로 형변환을 시도했기 때문에 발생한 오류였다. 이 오류는 '-Wint-conversion'으로 표시된다고 한다.

→ 포인터 안 배웠으니까 일단 포기. 포인터가 아닌 함수인자로 바꾸는걸로 수정해줌

 

incompatible implicit declaration of built-in function ‘round’ [-Wbuiltin-declaration-mismatch]

이 오류는 'round' 함수가 이전에 정의되지 않았다는 것을 의미한다. 일반적으로 math.h 헤더 파일을 포함하지 않았거나 함수의 이름을 잘못 입력한 경우에 발생할 수 있다고 한다.

 #include <math.h> 추가했으나 해결되지 않음. 0.5를 더해주는 식으로 세미 해결함


개발일지

미튜브 밸런스 패치를 해야겠음. 너무 빨리 100만 되는것 같다..

재밌을거라고 생각하고 토너먼트 확률 먼저하고 해야지! 한건데

토너먼트 열심히 풀다보니 의욕을 다 잃어버린 약간 아픈손가락 코드이다.

나중에 의욕 생기면 디자인을 꼭 예쁘게 만들어서 다시 만들기로 다짐.

 

 

 

 

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!