🎯 파이썬으로 숫자 맞히기 게임 만들기

2026. 7. 19. 16:23파이썬

수업 시간: 60~90분 | 대상: input(), if, while 기초를 배운 학습자 | 형태: 실습 중심


📌 오늘 만들 것

컴퓨터가 1~100 사이 숫자를 정하고, 사용자가 맞힐 때까지 UP/DOWN 힌트를 주는 게임.

> 숫자를 입력하세요: 50
UP
> 숫자를 입력하세요: 75
DOWN
> 숫자를 입력하세요: 63
🎉 정답입니다! 3번 만에 맞혔습니다.

배우는 개념: random, input/int, if-elif-else, while+break/continue, try-except, 함수


1️⃣ 설계부터: 코드 짜기 전에 순서를 말로 정리하기

코딩보다 먼저 할 일 — 흐름을 문장으로 써보기:

  1. 컴퓨터가 정답을 정한다
  2. 사용자가 숫자를 입력한다
  3. 정답과 비교해서 UP/DOWN/정답을 알려준다
  4. 맞힐 때까지 2~3을 반복한다

💡 이 순서 정리가 바로 알고리즘입니다. 코드보다 먼저 설계하는 습관을 들이는 게 이 수업의 진짜 목표입니다.


2️⃣ 최소 기능부터: 딱 한 번만 맞혀보기

욕심내지 않고, 반복 없이 딱 한 번 비교하는 코드부터 만듭니다.

import random

answer = random.randint(1, 100)          # 1~100 중 무작위 정답
guess = int(input("숫자를 입력하세요: "))  # 입력은 항상 문자열 → int()로 변환

if guess < answer:
    print("UP")
elif guess > answer:
    print("DOWN")
else:
    print("정답입니다!")

꼭 짚어줄 포인트

개념 왜 중요한가

random.randint(1, 100) 1과 100을 포함한 정수 반환
int(input(...)) input()은 항상 문자열 → 비교하려면 숫자로 변환 필수
if / elif / else 세 가지 결과(작다/크다/같다)를 분기 처리

✅ 확인 문제: random.randint(10, 20)은 몇부터 몇까지의 숫자를 만들까요? → 10~20 (둘 다 포함)


3️⃣ 반복시키기: while + break

한 번으로는 게임이 아니죠. 맞힐 때까지 반복하고, 시도 횟수도 세어봅니다.

import random

answer = random.randint(1, 100)
count = 0

while True:                                    # 무한 반복
    guess = int(input("숫자를 입력하세요: "))
    count += 1

    if guess < answer:
        print("UP")
    elif guess > answer:
        print("DOWN")
    else:
        print(f"정답입니다! {count}번 만에 맞혔습니다.")
        break                                   # 반복 탈출

while True는 탈출구(break)가 반드시 있어야 무한루프에 빠지지 않습니다. 이 관계를 꼭 강조해주세요.


4️⃣ 안전장치 달기: 잘못된 입력 막기

지금 코드는 안녕 같은 문자를 넣거나 999처럼 범위 밖 숫자를 넣으면 뻗거나 이상하게 동작합니다. 두 가지를 막습니다.

import random

answer = random.randint(1, 100)
count = 0

while True:
    try:
        guess = int(input("1~100 사이 숫자를 입력하세요: "))
    except ValueError:
        print("숫자만 입력해 주세요.")
        continue                      # 다시 입력받기 (횟수 증가 X)

    if not (1 <= guess <= 100):
        print("1~100 사이 숫자만 입력하세요.")
        continue

    count += 1
    if guess < answer:
        print("UP")
    elif guess > answer:
        print("DOWN")
    else:
        print(f"정답입니다! {count}번 만에 맞혔습니다.")
        break

상황 처리 방법

문자를 입력 (ValueError) try / except로 감싸고 다시 입력받기
범위 밖 숫자 if not (1 <= guess <= 100) 검사 후 continue
잘못된 입력의 공통점 시도 횟수(count)를 올리지 않는다 — 놓치기 쉬운 디테일!

5️⃣ 완성도 높이기: 함수로 정리 + 다시 하기

기능을 함수로 나누면 코드가 읽기 쉬워지고, "다시 시작" 같은 기능도 붙이기 편해집니다.

import random


def get_number():
    """유효한 숫자 하나를 입력받아 반환"""
    while True:
        try:
            n = int(input("1~100 사이 숫자를 입력하세요: "))
        except ValueError:
            print("숫자만 입력해 주세요.")
            continue
        if not (1 <= n <= 100):
            print("1~100 사이 숫자만 입력하세요.")
            continue
        return n


def play_game():
    """게임 한 판 실행"""
    answer = random.randint(1, 100)
    count = 0
    print("\n🎮 숫자 맞히기 게임 시작!")

    while True:
        guess = get_number()
        count += 1

        if guess < answer:
            print("UP")
        elif guess > answer:
            print("DOWN")
        else:
            print(f"🎉 정답! {count}번 만에 맞혔습니다.")
            break


def main():
    """전체 실행 흐름 관리"""
    while True:
        play_game()
        if input("다시 하시겠습니까? (y/n): ").lower() != "y":
            print("게임을 종료합니다.")
            break


main()

역할 분담

  • get_number() → 입력 받기 + 검증만 담당
  • play_game() → 게임 한 판의 규칙만 담당
  • main() → 반복 실행 여부만 담당

함수마다 하나의 책임만 갖게 나누는 것이 핵심입니다 (일명 "관심사 분리").


🛠️ 실습 문제 (난이도순)

  1. 범위 바꾸기 — randint(1, 100) → randint(1, 50)으로 바꾸고 안내 문구도 수정
  2. 시도 횟수 제한 — 10번 안에 못 맞히면 실패 처리 (if count >= 10: ... break)
  3. 정답 공개 — 실패 시 정답이 몇이었는지 출력
  4. 난이도 선택 — 시작 전에 쉬움(1~50)/보통(1~100)/어려움(1~500) 선택
  5. 최고 기록 저장 — best_score 변수에 최소 시도 횟수를 저장하고, 경신 시 축하 메시지

🚀 도전 과제 (자유 선택)

  • 힌트: 차이가 5 이하면 "거의 다 왔습니다!", 30 이상이면 "많이 떨어져 있습니다"
  • 제한 시간 두기 / 이름 입력받아 기록 남기기 / 컴퓨터와 역할 바꾸기(사용자가 숫자를 내고 컴퓨터가 맞히기)

🤖 AI에게 요청해보기

같은 걸 AI에게 시켜보고 직접 만든 것과 비교합니다.

파이썬으로 숫자 맞히기 게임을 만들어줘.
1~100 사이 숫자를 컴퓨터가 정하고, UP/DOWN 힌트를 주고,
맞힐 때까지 반복하고 시도 횟수를 출력해줘.
초보자용 주석도 달아줘.

체크리스트

  • [ ] 직접 실행해서 요구사항대로 동작하는지 확인했나?
  • [ ] 이해 안 되는 줄은 없나? (있으면 "이 줄이 뭐하는 거야?"로 되물어보기)
  • [ ] 기능은 한 번에 다 요청하지 말고 단계별로 추가 요청했나?
  • [ ] 에러가 나면 에러 메시지 전체를 그대로 AI에게 붙여넣었나?

📖 핵심 문법 요약

문법 한 줄 정리

random.randint(a, b) a~b 포함 무작위 정수
int(input(...)) 문자열 입력 → 정수 변환
if / elif / else 조건별 분기
while True: ... break 탈출 조건이 있는 무한 반복
continue 이번 반복만 건너뛰고 다음으로
try / except ValueError 잘못된 형 변환 예외 처리
def 함수이름(): 기능 단위로 코드 묶기

✅ 마무리 확인 문제

  1. input()의 결과값 자료형은? → 문자열(str)
  2. "50"을 정수로 바꾸는 코드는? → int("50")
  3. 반복문을 완전히 끝내는 키워드는? → break
  4. 이번 반복만 건너뛰는 키워드는? → continue
  5. 숫자가 아닌 값을 int()에 넣으면 나는 오류는? → ValueError

오늘의 결과물

무작위 정답 · 입력 검증 · 반복/시도 횟수 · 예외 처리 · 함수 분리 · 재시작까지 갖춘 완성형 숫자 맞히기 게임

숫자맞히기게임_수업자료.md.pdf
0.76MB