[#10] switch문과 숫자 맞추기 게임 만들기

 

 

10강에서는 switch문을 배워보고, 최종적으로 지금까지 배운 것들, 특히 최근에 배운 것들을 주로 활용해서 숫자 맞추기 게임을 만들어 보겠습니다.

 

생각보다 강의가 길어졌지만, 그만큼 여러분들에게 하나하나 더 확실하게 정보를 제공했다 생각하고 있습니다.


🔶 switch

 

switch문은 하나의 변수 값에 따라 여러 경우(case)를 나누어 실행하는 조건 분기문입니다.
if문보다 코드가 더 깔끔하고 명확하게 표현될 수 있어, 값이 고정된 조건 분기에 유리하죠.

조금 더 쉽게 설명하자면, switch문은 어떤 값이 뭔지에 따라
“이럴 땐 이렇게 해줘~ 저럴 땐 저렇게 해줘~” 하고 정해진 행동을 나눠서 시키는 도구입니다.

if문처럼 복잡하게 쓰지 않아도, 값 하나로 딱딱 나눠서 처리하기 편하죠.

 

switch문을 제대로 이해하기 위해, 숫자 맞추기 게임을 만들기 전 간단하게 '가위 바위 보'를 한 번 만들어 보겠습니다.

또한 switch문을 시작하기 전에 먼저 이전에 배웠던 if문과 else문을 활용해 가위바위보를 만들어 보겠습니다.

 

 

🔹if, else if, else문으로 만든 가위바위보

 

먼저 가위바위보를 하기 위해선 무작위로 무언가를 뽑는 행위가 필요합니다.

전 시간에 배웠던 srand(time(NULL))을 활용하면 이 행위는 간단히 해결이 되겠죠? 그럼 코드를 짜 봅시다.

printf("가위 바위 보 게임을 시작합니다.\n\n");
srand(time(NULL));
int i = rand() % 3;

if (i == 0)
    printf("가위\n");
else if (i == 1)
    printf("바위\n");
else if (i == 2)
    printf("보\n");
else
    printf("잘못된 입력입니다.\n");
  • printf로 가위바위보 게임임을 화면에 알려줍니다.
  • srand(time(NULL))을 써서 무작위 숫자를 뽑을 수 있도록 해줬습니다.
  • 먼저 rand() % 3을 통해 0~2 사이의 무작위 숫자를 뽑아줬습니다.
  • 그후 if와 else if를 이용해 0~2까지 총 세가지 수에 각각 가위(0), 바위(1), 보(2)를 할당해 줬죠
  • 마지막 else에는 그 어떤 조건도 해당하지 않았을 때를 대비해 "잘못된 입력입니다."를 출력하게 해 줬습니다.

이렇게 if문을 가지고도 가위바위보 정도는 충분히 구현이 가능하긴 합니다.

다만, 이 방식은 간단하고 직관적이긴 하나, 조건이 늘어나면 코드가 길어지고 복잡해지기 쉽다는 단점이 있죠.

 

 

🔹 switch문으로 같은 로직 바꿔보기

 

가위바위보 게임을 만들 때 if문 대신 switch문을 사용하면 같은 결과를 더 깔끔하게 표현할 수 있습니다.

switch문은 기본적으로 아래와 같은 형태를 띄고 있습니다.

switch (값)
{
    case 경우1:
        실행할 내용;
        break;
    case 경우2:
        실행할 내용;
        break;
    default:
        모든 경우에 해당하지 않을 때 실행할 내용;
        break;
}

이전에 배운 것들과는 달라서 조금 낯설 수 있는데, 자세히 들여다보면 매우 간단하고 직관적인 걸 알 수 있습니다.

  • 먼저 맨 위에 switch(값)이 들어갑니다.
  • 그 아래로 case를 입력하고 그 뒤에 경우가 들어갑니다.
  • 경우 뒤에는 실행할 내용이 들어갑니다.
  • 마지막으로 break를 입력해 줘서 조건 충족 시 다른 케이스(case)가 나오지 않도록 합니다.

이게 switch의 기본적인 구조입니다. 자 이제 이걸 그대로 가위바위보에 대입만 하면 됩니다.

printf("가위 바위 보 게임을 시작합니다.\n\n");
srand(time(NULL));
int i = rand() % 3;

switch (i)
{
    case 0: printf("가위\n"); break;
    case 1: printf("바위\n"); break;
    case 2: printf("보\n"); break;
    default: printf("잘못된 값입니다.\n"); break;
}
  • 이 코드에서 값은 i이므로 switch의 ()안에는 (i)가 들어옵니다.
  • 가위바위보 값은 동일하게 rand () % 3을 줬으니 0~2사이의 숫자가 나오게 됩니다.
  • if문과 마찬가지로 0, 1, 2 각각을 case에 대입해 줍니다.
  • printf로 가위, 바위, 보를 각각 출력해주고 마지막마다 break를 출력해줍니다.
  • default는 else처럼 어떤 조건에도 해당되지 않을 때 실행됩니다.

특히 이 break를 잘 활용하면, 이전에 만들었던 '초중고생 구분하기'도 switch 문으로 제작할 수 있습니다.

int age = 17;

switch (age)
{
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
    printf("초등학생입니다.\n");
    break;
case 14:
case 15:
case 16:
	printf("중학생입니다.\n");
    break;
case 17:
case 18:
case 19:
    printf("고등학생입니다.\n");
    break;
default:
    printf("초중고생은 아니네요.\n");
    break;
}
  • 변수 age17이라는 값을 줬습니다. 17살은 고등학생이겠죠?
  • switch문에는 변수인 age를 넣어 switch(age)라고 해줍니다.
  • 0~7세까지는 필요가 없으니 case로 넣어줄 필요가 없습니다. 그래서 초등학교 1학년인 8세, case 8부터 시작하죠.
  • 초등학교 6학년이 되는 13에서 break를 걸어줬습니다. 이렇게 되면 8~13까지는 다 "초등학생입니다"가 출력되죠.
  • 마찬가지 14~16세는 중학생, 17~19세는 고등학생으로 break를 걸어줬습니다.
  • 여기서 age값이 17이니 실행 시 "고등학생입니다"가 출력되게 됩니다.
  • 만약 age에 0~7까지의 숫자를 입력하거나, 20 이상의 숫자를 입력한다면 default값이 출력되게 됩니다.

 

 

🔹 if vs switch 비교 요약


항목 if문 switch문
조건 표현 범위, 복합 조건 가능 단일 값 기준만 가능
코드 구조 자유롭지만 길어질 수 있음 명확하게 정리됨
가독성 조건이 많아지면 복잡 같은 변수 조건 분기에 유리
사용 예시 숫자 범위, 부등호 고정된 값 분기 (0, 1, 2 등)
 

즉, 조건이 다양하거나 복잡하면 if, 값 하나로 딱 나눌 수 있는 경우엔 switch가 유리합니다.

 


 

🔶 'Up! and Down!' 숫자 맞추기 게임

 

드디어 대망의 숫자 맞추기 게임 제작입니다.

먼저 만들 게임의 개요는 아래와 같습니다.

 

컴퓨터가 랜덤으로 1~100 사이의 숫자를 하나 정합니다.
사용자는 5번의 기회 안에 그 숫자를 맞혀야 합니다.

컴퓨터는 사용자의 입력값이 정답보다 낮은 숫자면 "Up!"
사용자의 입력값이 정답보다 높은 숫자면 "Down!"을 외칩니다.
정답을 맞히면 게임 종료, 끝까지 못 맞히면 정답을 알려주고 종료됩니다.

 

 

① 컴퓨터가 숫자를 "무작위로" 하나 정하기

먼저 컴퓨터가 1~100사이의 수 사이에서 무작위로 숫자 하나를 뽑도록 만들어야 합니다.
이건 간단합니다. 우리가 썼던 srand와 rand()를 이용하면 됩니다.
srand(time(NULL));             // 현재 시간을 기준으로 시드 초기화
int num = rand() % 100 + 1;    // 1~100 사이의 숫자 생성
  • rand() 100+1이라는 값을 줬습니다.
  • 100이 아닌 100+1이라는 값을 준 이유는 컴퓨터는 0부터 카운팅하기 때문입니다.
  • 만약 100+1을 하지 않으면 1~100이 아닌 0~99가 되어 버립니다.

 

② 플레이어에게 5번의 기회 주기

 

게임에서 플레이어에게는 총 5번의 기회를 줄 예정입니다.

이 기회는 숫자만 바꾸면 원하는 수치로 변경이 가능하겠죠??

    int answer = 0;
    int chance = 5;

    printf("숫자 맞추기 게임을 시작합니다!\n\n");

    while (chance > 0)
        printf("남은 기회: %d\n", chance--);
  • 1~100을 설정해준 다음
  • 그 아래에 answer(대답)라는 변수를 0으로 줍니다.
  • answer 아래에는 chance(기회)라는 변수를 5로 줍니다.
  • 이제 게임을 만들기 위한 로직을 작성하기 전에 printf로 게임이 뭔지 알려줍시다.
  • 아래에는 while과 그 안에 chance > 0을 넣어줍니다. 이는 만약(while) 기회(chance)가 0보다 크다면을 뜻합니다.
  • 그리고 그 while문이 작동할 때 "남은 기회 : %d"가 출력되게 해 주고 chance--를 넣어 while문이 반복될 때 마다 chance 값이 하나씩 줄어들게 설정해 줍니다.
  • 즉, 플레이어가 숫자를 한 번 입력할 때마다 chance--로 인해 기회가 1씩 줄어들게 됩니다.

현재 이 상태에서는 실행을 시켜봤자 뭔가를 할 수 없습니다. 계속 나아가 봅시다.

 

 

③ 플레이어에게 입력받는 창 만들기

 

이제 플레이어에게 숫자를 입력받을 수 있는 창을 만들어야 합니다.

이는 예전에 배웠던 scanf_s를 활용해야 합니다.

printf("숫자를 입력하세요 (1~100): ");
scanf_s("%d", &answer);

방법은 간단합니다. 숫자를 입력받는 적당한 멘트를 집어넣고

scanf_s로 변수 answer를 불러와주면 됩니다.

 

 

④ Up and Down 만들기

 

Up and Down은 if문을 이용해서 만들어 줄 수 있습니다.

if (answer > num)
{
    printf("Down! ↓\n");
}
else if (answer < num)
{
    printf("Up! ↑\n");
}
else
{
    printf("\n%d! 정답입니다!\n");
    break;
}
  • if문에 answer > num 을 넣어주고 printf로 멘트를 추가했습니다. 이를 해석하면 만약(if) 대답(answer)이 숫자(num)보다 크다면 "Down! ↓"을 출력한다 입니다.
  • else if문에는 answer < num을 넣어주고 printf로 멘트를 추가했습니다. 이를 해석하면 if가 아니었을때(else if)  대답(answer)이 숫자(num)보다 작다면 "Up! ↑"을 출력한다 입니다.
  • else 문에는 "%d! 정답입니다!"를 출력한 후 break를 걸어줬습니다.
  • else는 해석해보면 결국 "대답이 숫자보다 크지도 않고 작지도 않다면 같다는 뜻이니 else를 출력해야겠군"이 됩니다. 그러니 반복문을 탈출해주는 break 명령어를 넣어야 하는 것이죠.
  • 그 아래에 answer(대답)라는 변수를 0으로 줍니다.

 

⑤ 기회를 다 써도 못 맞췄을 경우

 

기회는 총 5번 뿐이기 때문에, 플레이어가 기회를 다 써도 못맞추는 경우도 반드시 생기게 됩니다.

이 때는 게임이 종료됐다는 것을 알려줌과 동시에, 정답이 뭐였는지 출력을 해주면 되겠네요.

다시 if문을 써서 간단히 만들어 봅시다.

if (chance == 0)
{
    printf("기회를 모두 사용했습니다. 정답은 %d 였습니다.\n", num);
}
  • if문에 chance == 0을 넣어줬습니다. 해석하자면 만약(if) 기회(chance)가 0이 됐다면이 됩니다.
  • 기회가 0이 돼서 모두 소진되면 printf를 통해 "기회를 모두 사용했습니다. 정답은 %d 였습니다"가 출력되고 게임이 종료됩니다.

 

⑥ 게임 완성하기

 

자, 이제 위의 내용들을 다 입력하면 최종적으로는 이런 코드가 완성됩니다.

    srand(time(NULL));
    int num = rand() % 100 + 1; // 1~100
    
    int answer = 0;
    int chance = 5;

    printf("숫자 맞추기 게임을 시작합니다!\n\n");

    while (chance > 0)
    {
        printf("남은 기회: %d\n", chance--);
        
        printf("숫자를 입력하세요 (1~100): ");
        scanf_s("%d", &answer);

        if (answer > num)
        {
            printf("Down! ↓\n\n");
        }
        else if (answer < num)
        {
            printf("Up! ↑\n\n");
        }
        else
        {
            printf("\n%d! 정답입니다!\n", num);
            break;
        }

        if (chance == 0)
        {
            printf("기회를 모두 사용했습니다. 정답은 %d 였습니다.\n", num);
        }
    }

 

이 코드와 게임 흐름을 요약한 순서도를 그리자면 아래와 같습니다.

[시작]
 ↓
컴퓨터가 숫자 선택 (1~100)
 ↓
사용자에게 숫자 입력 요청 (총 5번까지 반복)
 ↓
입력값과 정답 비교
 → 크면 "Down!"
 → 작으면 "Up!"
 → 같으면 "정답입니다!" → 게임 종료
 ↓
기회 소진 시 정답 공개
[끝]

 

 

🖋️ int answer에 '0'이 들어가는 이유

 

코드를 작성하다가 뭔가 이상한점을 발견한 사람도 있을 겁니다.

바로 int answer = 0; 부분이죠. 대체 왜 answer라는 변수에 0이라는 숫자가 들어가는 걸까요?

 

사실 이 0이라는 값은 값 자체는 별로 중요하지 않습니다. 이는 '쓰레기 값(garbage) 방지용'으로 쓰는 숫자일 뿐이기 때문입니다.

 

만약

int answer;

 만 선언하면, 그 안에는 아무 값이나 들어갈 수 있고, 컴파일러가 경고하거나 오작동이 될 수 있습니다.

그러니 이 안에는 아무 값이나 넣어야 합니다.

 

어차피 그 뒤에 scanf_s를 통해 직접 입력을 받을 것이기 때문에, 이 값은 어떠한 값을 넣어도 상관이 없습니다.

즉 0대신 -1을 넣든 10을 넣든 999를 넣든 하등 상관이 없는거죠.

 

다만 0을 쓰는 이유는 0이라는 숫자가 보통 '기본값' 또는 '초기값'이라는 느낌을 주는 가장 흔한 숫자라서 그렇습니다.

코딩 세계에서 일종의 암묵적인 룰같은 거라고 보시면 됩니다.

 


 

 

🔶 AI피드백

 

Q. 오늘은 switch문을 배우고 지금까지 배웠던 내용들을 활용해서 'Up and Down 숫자 1~100까지 맞추기 게임'을 만들어 봤어. 생각보다 게임을 만드는 과정은 꽤 복잡했는데, 왠지 완성하고 난 뒤에는 여러곳에 쓰임새가 많을 것 같다 느꼈지.

 

오늘 배운 switch문과 숫자 맞추기 게임을 만들면서 썼던 로직들이 C에서 얼마나 중요한 부분인지를 냉철하게 알려줬으면 좋겠고, 실제 게임제작을 할 때 어느정도 비중으로 쓰이는지 알려줬으면 좋곘어.

 

A. 오늘 너는 단순한 조건문 수준을 넘어서, “게임 로직의 구조”를 직접 구성하고, 그걸 기반으로 플레이 흐름까지 만들어낸 거야.

이건 실제 게임 개발의 출발점이라고 봐도 될 정도로 중요한 단계야.

 


 

✅ 오늘 사용한 기능들, C 언어에서 얼마나 중요할까?


기능 중요도 설명
switch 문 ⭐⭐⭐ (중) 다중 조건 분기에서 if보다 가독성 좋고 실행 빠름
if, else ⭐⭐⭐⭐ (상) 모든 조건 판단의 기본! 거의 모든 코드에 등장
rand() + srand() ⭐⭐⭐ (중) 랜덤성 구현의 핵심, 게임, 보안, 테스트 등 전방위 활용
while, break ⭐⭐⭐⭐ (상) 게임 루프, 조건 반복, 중단 로직 등에서 핵심 제어문
scanf_s, printf ⭐⭐⭐ (중) 입출력 기반 인터랙션, 테스트, 사용자 피드백 처리 필수 도구
 

즉, 오늘 쓴 대부분의 코드가 C 언어의 근간을 이루는 기능들이고,
실제 소프트웨어나 게임 개발에서도 매우 자주 사용되는 것들이야.

 

 

🎮 실전 게임개발에서의 활용도는?

📌 1. switch 문

  • 게임 메뉴 선택 (1. 시작하기 / 2. 옵션 / 3. 종료)
  • 캐릭터 직업 선택 분기
  • 키보드 입력 처리 (switch (key))

📌 2. if / else

  • 체력 0이면 → 게임 오버
  • 아이템 있으면 → 능력 부여
  • 퀘스트 조건 만족하면 → 보상

📌 3. 랜덤 + 반복 + 조건

  • 몬스터 AI 행동 결정 (공격/도망/기술 등 랜덤)
  • 미니게임 생성 (Up & Down, 주사위 게임 등)
  • 아이템 드랍율 (확률 기반)

 

 

💡 숫자 맞추기 게임은 단순하지만 강력한 구조를 갖고 있어

  • 무작위 숫자 생성 (rand)
  • 사용자 입력 대기 (scanf)
  • 조건 분기 (if, else if)
  • 반복 기회 (while)
  • 중간 종료 (break)
  • 게임 종료 처리 (chance == 0)

이건 사실상 하나의 게임 루프 구조야.

그리고 이 로직은 언리얼 엔진 같은 고급 환경에서도 거의 그대로 쓰여.
C++으로 바꾸면 형태만 달라질 뿐, 흐름은 동일해.

 

 

🎯 결론 요약


   
질문 대답
switch문과 if문, 게임 로직은 실제로 얼마나 중요한가? 핵심 중의 핵심! 게임의 뇌와 혈관을 만드는 코드 구조
이런 구조는 게임제작에 얼마나 쓰이나? 거의 모든 게임에서 반복적으로 등장하는 기본 구성
지금 내가 만든 게임은 단순한 수준인가? 형태는 단순하지만, 구조는 진짜 게임 개발의 시작
C에서 이런 로직들은 얼마나 중요한가? 전산 논리와 프로그램 흐름 제어의 핵심 개념들