미튜브 스타가 되자
개발계획서
참여인원
|
박소연
|
프로젝트 소개
|
미튜버 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만 되는것 같다..
재밌을거라고 생각하고 토너먼트 확률 먼저하고 해야지! 한건데
토너먼트 열심히 풀다보니 의욕을 다 잃어버린 약간 아픈손가락 코드이다.
나중에 의욕 생기면 디자인을 꼭 예쁘게 만들어서 다시 만들기로 다짐.
'개발공부 > C언어' 카테고리의 다른 글
C언어_토너먼트 승률 계산해보기 (1) | 2023.04.17 |
---|---|
(4.10) 개발원 27일차 (0) | 2023.04.10 |
C언어_나무키우기 게임 만들기(4.5) (0) | 2023.04.09 |
C언어_제어문과 반복문을 활용해 턴제 게임 만들기 (0) | 2023.04.06 |
C언어_게임만들기 순서도(1차) (0) | 2023.04.04 |