
11. 실습: 숫자 맞추기 게임 만들기
조건문과 반복문을 모두 배웠으니, 이제 이것들을 합쳐서 진짜 동작하는 프로그램을 만들어보자. 오늘의 목표는 컴퓨터가 생각한 숫자를 맞추는 게임이다!
프로젝트 소개
게임 규칙
- 컴퓨터가 1~100 사이의 랜덤 숫자를 하나 정한다
- 플레이어가 숫자를 입력한다
- 컴퓨터가 힌트(더 높은지, 낮은지)를 알려준다
- 정답을 맞출 때까지 반복한다
- 시도 횟수에 따라 등급을 매긴다
사용할 개념들
| 개념 | 역할 |
|---|---|
| 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. 결과: 성공/실패에 따른 출력
이 프로젝트에서 배운 것
- while + break 패턴: 게임의 핵심 루프
- if-elif-else 연쇄: 판별 로직과 등급 시스템
- random 모듈: 랜덤 값 생성
- 변수 활용: 시도 횟수 카운트, 기록 저장
- 입력 검증: 잘못된 입력 처리 (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교육
'Python' 카테고리의 다른 글
| 13. 딕셔너리 - 이름표를 붙인 데이터 (0) | 2026.02.22 |
|---|---|
| 12. 리스트 - 데이터를 줄 세우기 (0) | 2026.02.22 |
| 10. 중첩 반복문 - 별 찍기로 연습하기 (0) | 2026.02.21 |
| 09. 반복문 (2) - while문과 반복 제어 (0) | 2026.02.21 |
| 08. 반복문 (1) - for문 (0) | 2026.02.21 |
댓글