본문 바로가기
Python

11. 실습: 숫자 맞추기 게임 만들기

by 샤나엘 2026. 2. 21.
반응형

실습: 숫자 맞추기 게임

11. 실습: 숫자 맞추기 게임 만들기

조건문과 반복문을 모두 배웠으니, 이제 이것들을 합쳐서 진짜 동작하는 프로그램을 만들어보자. 오늘의 목표는 컴퓨터가 생각한 숫자를 맞추는 게임이다!


프로젝트 소개

게임 규칙

  1. 컴퓨터가 1~100 사이의 랜덤 숫자를 하나 정한다
  2. 플레이어가 숫자를 입력한다
  3. 컴퓨터가 힌트(더 높은지, 낮은지)를 알려준다
  4. 정답을 맞출 때까지 반복한다
  5. 시도 횟수에 따라 등급을 매긴다

사용할 개념들

개념 역할
while True + break 정답 맞출 때까지 반복, 맞추면 탈출
if-elif-else 정답/높은지/낮은지 판별, 등급 매기기
input() + int() 사용자 숫자 입력받기
random 모듈 랜덤 숫자 생성
변수 시도 횟수 카운트, 정답 저장

 

숫자 맞추기 게임 흐름도


random 모듈 소개

random은 파이썬에 기본 내장된 모듈로, 랜덤 값을 만들 때 사용한다.

import random   # 맨 위에 한 번만 써주면 된다

# 1~100 사이의 랜덤 정수
number = random.randint(1, 100)
print(number)   # 실행할 때마다 다른 값

# 1~10 사이의 랜덤 정수
dice = random.randint(1, 6)
print(f"주사위: {dice}")
함수 설명
random.randint(a, b) a 이상 b 이하의 랜덤 정수
random.random() 0.0 이상 1.0 미만의 랜덤 실수
random.choice(리스트) 리스트에서 하나를 랜덤으로 선택
random.shuffle(리스트) 리스트를 랜덤으로 섞기
import random

# choice: 랜덤 선택
menus = ["김치찌개", "된장찌개", "비빔밥", "돈까스", "파스타"]
today = random.choice(menus)
print(f"오늘의 메뉴: {today}")

# shuffle: 순서 섞기
cards = [1, 2, 3, 4, 5]
random.shuffle(cards)
print(f"섞은 결과: {cards}")

💡 import random은 파일 맨 위에 한 번만 쓰면 된다. 모듈에 대해서는 21편에서 자세히 배운다.


단계별 만들기

Step 1: 기본 틀 만들기

먼저 가장 단순한 형태부터 시작하자.

import random

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

print("숫자 맞추기 게임!")
print("1~100 사이의 숫자를 맞춰보세요.")

while True:
    guess = int(input("입력: "))
    attempts += 1

    if guess == answer:
        print(f"정답! {attempts}번 만에 맞추셨습니다!")
        break
    elif guess < answer:
        print("UP! 더 큰 수입니다")
    else:
        print("DOWN! 더 작은 수입니다")

이것만으로도 게임이 동작한다! 이제 하나씩 기능을 추가해보자.

Step 2: 시도 횟수 제한 추가

import random

answer = random.randint(1, 100)
max_attempts = 10
attempts = 0

print("숫자 맞추기 게임!")
print(f"1~100 사이의 숫자를 맞춰보세요. (기회: {max_attempts}번)")
print("-" * 40)

while attempts < max_attempts:
    remaining = max_attempts - attempts
    guess = int(input(f"[남은 기회: {remaining}] 입력: "))
    attempts += 1

    if guess == answer:
        print(f"\n🎉 정답! {attempts}번 만에 맞추셨습니다!")
        break
    elif guess < answer:
        print("⬆️ UP! 더 큰 수입니다")
    else:
        print("⬇️ DOWN! 더 작은 수입니다")
else:
    print(f"\n💀 기회를 모두 소진했습니다. 정답은 {answer}이었습니다.")

💡 while-else 활용! 9편에서 배운 것처럼, break 없이 while이 끝나면 else가 실행된다.

Step 3: 등급 시스템 추가

import random

answer = random.randint(1, 100)
max_attempts = 10
attempts = 0
won = False

print("=" * 40)
print("       🎯 숫자 맞추기 게임 🎯")
print("=" * 40)
print(f"1~100 사이의 숫자를 맞춰보세요!")
print(f"기회는 {max_attempts}번입니다.")
print("-" * 40)

while attempts < max_attempts:
    remaining = max_attempts - attempts
    guess = int(input(f"[{remaining}번 남음] 숫자 입력: "))
    attempts += 1

    if guess == answer:
        won = True
        break
    elif guess < answer:
        print("⬆️ 더 큰 수입니다!")
    else:
        print("⬇️ 더 작은 수입니다!")

    # 근접도 힌트
    diff = abs(answer - guess)
    if diff <= 5:
        print("🔥 아주 가까워요!")
    elif diff <= 15:
        print("🌡️ 따뜻해요!")
    elif diff <= 30:
        print("❄️ 차갑습니다...")

print()
print("=" * 40)

if won:
    print(f"🎉 정답입니다! 정답: {answer}")
    print(f"시도 횟수: {attempts}번")

    # 등급 매기기
    if attempts == 1:
        grade = "👑 전설! 한 방에 맞추다니!"
    elif attempts <= 3:
        grade = "🥇 천재! 3번 이내 성공!"
    elif attempts <= 5:
        grade = "🥈 대단해요! 감이 좋습니다!"
    elif attempts <= 7:
        grade = "🥉 잘했어요! 평균 이상입니다!"
    else:
        grade = "👍 성공! 끝까지 포기하지 않았네요!"

    print(f"등급: {grade}")
else:
    print(f"💀 실패! 정답은 {answer}이었습니다.")
    print("다음에 다시 도전해보세요!")

print("=" * 40)

 

등급 시스템


완성된 코드 (최종 버전)

입력 검증까지 추가한 최종 버전이다.

import random

def play_game():
    answer = random.randint(1, 100)
    max_attempts = 10
    attempts = 0
    history = []

    print("\n" + "=" * 40)
    print("       🎯 숫자 맞추기 게임 🎯")
    print("=" * 40)
    print(f"1~100 사이의 숫자를 맞춰보세요!")
    print(f"기회는 {max_attempts}번입니다.")
    print("-" * 40)

    while attempts < max_attempts:
        remaining = max_attempts - attempts

        # 입력 검증
        try:
            guess = int(input(f"\n[{remaining}번 남음] 숫자 입력: "))
        except ValueError:
            print("⚠️ 숫자만 입력해주세요!")
            continue

        if guess < 1 or guess > 100:
            print("⚠️ 1~100 사이의 숫자를 입력하세요!")
            continue

        attempts += 1
        history.append(guess)

        if guess == answer:
            print(f"\n🎉 정답! {answer}을(를) {attempts}번 만에 맞추셨습니다!")

            if attempts == 1:
                print("👑 전설! 한 방에 맞추다니!")
            elif attempts <= 3:
                print("🥇 천재! 3번 이내 성공!")
            elif attempts <= 5:
                print("🥈 대단해요! 감이 좋습니다!")
            elif attempts <= 7:
                print("🥉 잘했어요! 평균 이상입니다!")
            else:
                print("👍 성공! 끝까지 포기하지 않았네요!")
            break

        elif guess < answer:
            print("⬆️ 더 큰 수입니다!")
        else:
            print("⬇️ 더 작은 수입니다!")

        # 근접도 힌트
        diff = abs(answer - guess)
        if diff <= 5:
            print("🔥 아주 가까워요!")
        elif diff <= 15:
            print("🌡️ 따뜻해요!")

    else:
        print(f"\n💀 실패! 정답은 {answer}이었습니다.")

    print(f"\n📋 시도 기록: {history}")
    print("=" * 40)

# 게임 실행
while True:
    play_game()
    retry = input("\n다시 하시겠습니까? (y/n): ")
    if retry.lower() != "y":
        print("게임을 종료합니다. 다음에 또 만나요! 👋")
        break

💡 여기서 def play_game():함수를 정의하는 문법이다. 17편에서 자세히 배우니 지금은 "게임 코드를 하나로 묶었다" 정도로 이해하면 된다. try-except는 22편에서 배울 에러 처리인데, 여기서는 숫자가 아닌 입력을 걸러내는 역할을 한다.


코드 분석

핵심 구조 정리

# 1. 준비: 랜덤 숫자 생성, 변수 초기화
answer = random.randint(1, 100)
attempts = 0

# 2. 게임 루프: while + break 패턴
while attempts < max_attempts:
    guess = int(input(...))
    attempts += 1

    # 3. 판별: if-elif-else
    if guess == answer:
        break       # 정답이면 탈출
    elif guess < answer:
        print("UP")
    else:
        print("DOWN")

# 4. 결과: 성공/실패에 따른 출력

이 프로젝트에서 배운 것

  1. while + break 패턴: 게임의 핵심 루프
  2. if-elif-else 연쇄: 판별 로직과 등급 시스템
  3. random 모듈: 랜덤 값 생성
  4. 변수 활용: 시도 횟수 카운트, 기록 저장
  5. 입력 검증: 잘못된 입력 처리 (continue)

직접 해보기

문제 1. 게임에 난이도 선택 기능을 추가해보자.

난이도를 선택하세요:
1. 쉬움 (1~50, 15번 기회)
2. 보통 (1~100, 10번 기회)
3. 어려움 (1~200, 7번 기회)

문제 2. 가위바위보 게임을 만들어보자.

- 사용자 vs 컴퓨터 (random.choice 사용)
- 3판 2선승제
- 결과 출력: "2승 1패 - 승리!"

문제 3. 랜덤 메뉴 추천기를 만들어보자.

메뉴 리스트에서 랜덤으로 3개를 추천
마음에 안 들면 다시 추천 (y/n)
정답 보기
import random
‍
# 문제 1: 난이도 선택
print("난이도를 선택하세요:")
print("1. 쉬움 (1~50, 15번 기회)")
print("2. 보통 (1~100, 10번 기회)")
print("3. 어려움 (1~200, 7번 기회)")
‍
level = int(input("선택: "))
if level == 1:
    max_num, max_try = 50, 15
elif level == 3:
    max_num, max_try = 200, 7
else:
    max_num, max_try = 100, 10
‍
answer = random.randint(1, max_num)
attempts = 0
while attempts < max_try:
    guess = int(input(f"[{max_try - attempts}번 남음] 입력: "))
    attempts += 1
    if guess == answer:
        print(f"정답! {attempts}번 만에 맞추셨습니다!")
        break
    elif guess < answer:
        print("UP!")
    else:
        print("DOWN!")
else:
    print(f"실패! 정답은 {answer}이었습니다.")
‍
# 문제 2: 가위바위보 3판 2선승
choices = ["가위", "바위", "보"]
win_count = 0
lose_count = 0
round_num = 0
‍
while win_count < 2 and lose_count < 2:
    round_num += 1
    user = input(f"[{round_num}라운드] 가위/바위/보: ")
    computer = random.choice(choices)
    print(f"컴퓨터: {computer}")
‍
    if user == computer:
        print("무승부!")
    elif (user == "가위" and computer == "보") or \
         (user == "바위" and computer == "가위") or \
         (user == "보" and computer == "바위"):
        print("이겼습니다!")
        win_count += 1
    else:
        print("졌습니다!")
        lose_count += 1
‍
print(f"\n결과: {win_count}승 {lose_count}패", end=" - ")
print("승리!" if win_count > lose_count else "패배!")
‍
# 문제 3: 메뉴 추천기
menus = ["김치찌개", "된장찌개", "비빔밥", "돈까스", "파스타",
         "초밥", "햄버거", "떡볶이", "냉면", "삼겹살"]
‍
while True:
    picks = random.sample(menus, 3)
    print(f"\n오늘의 추천: {', '.join(picks)}")
    again = input("다시 추천? (y/n): ")
    if again.lower() != "y":
        print(f"좋은 선택! '{picks[0]}'으로 가시죠!")
        break

오늘의 정리

항목 내용
random 모듈 import random → randint, choice, shuffle 등
게임 루프 while True: ... break 또는 while 조건:
입력 검증 범위 체크 + continue로 잘못된 입력 건너뛰기
종합 활용 변수 + 조건문 + 반복문 + 모듈을 합쳐 프로그램 완성

다음 편 예고: 리스트 - 데이터를 줄 세우기

지금까지 변수 하나에 값 하나만 담았다. 그런데 학생 30명의 점수를 저장하려면 변수 30개가 필요할까? 아니다! 리스트 하나면 된다. 파이썬에서 가장 많이 쓰이는 자료구조를 만나보자.


태그: 파이썬 Python 파이썬독학 파이썬게임 숫자맞추기 random 실습 프로젝트 파이썬기초 IT교육

반응형

댓글