포스트

[Python 100일 챌린지] Day 10 - 미니 프로젝트: 숫자 맞추기 게임

[Python 100일 챌린지] Day 10 - 미니 프로젝트: 숫자 맞추기 게임

Phase 1 완성 프로젝트! 😊 지금까지 배운 변수, 조건문, 반복문을 모두 활용해서 진짜 동작하는 게임을 만들어봅시다! 단순히 코드를 따라 치는 것이 아니라, 왜 이렇게 설계했는지 이해하면서 단계별로 완성해보세요. 이 프로젝트를 완성하면 여러분은 이미 프로그래머입니다!

(35분 완독 ⭐⭐⭐)

🎯 오늘의 학습 목표

📚 사전 지식


🎯 학습 목표 1: Phase 1 배운 내용 복습하기

Phase 1에서 배운 내용 총정리

Day 1-3: Python 시작하기

  • Python 설치 및 개발 환경 구축
  • VS Code 설정 및 사용법
  • 첫 코드 실행 경험

Day 4-7: 기본 데이터 타입

  • 변수 선언 및 print() 함수
  • 숫자 연산 (int, float)
  • 문자열 처리 및 메서드
  • 리스트 생성 및 조작

Day 8-9: 제어문

  • 조건문 if/elif/else
  • 반복문 for와 range()
  • 중첩 반복문과 break/continue

오늘 만들 프로젝트

숫자 맞추기 게임 - Phase 1의 모든 내용을 활용합니다!

게임 설명

숫자 맞추기 게임

  • 컴퓨터가 1~100 사이의 숫자를 생각합니다
  • 사용자가 숫자를 맞춥니다
  • 힌트를 주며 몇 번 만에 맞췄는지 기록합니다

게임 흐름

1
2
3
4
5
6
7
8
컴퓨터: "1~100 사이의 숫자를 생각했어요!"
사용자: "50 입력"
컴퓨터: "더 큰 숫자입니다!"
사용자: "75 입력"
컴퓨터: "더 작은 숫자입니다!"
...
사용자: "67 입력"
컴퓨터: "정답! 5번 만에 맞췄습니다!"

🎯 학습 목표 2: input()으로 사용자와 대화하기

input() 기본 사용법

1
2
name = input("이름을 입력하세요: ")
print(f"안녕하세요, {name}님!")

실행 결과:

1
2
이름을 입력하세요: 홍길동
안녕하세요, 홍길동님!

숫자 입력 받기

1
2
3
4
5
6
7
# ⚠️ input()은 항상 문자열로 받음!
age = input("나이를 입력하세요: ")
print(type(age))  # <class 'str'>

# ✅ 숫자로 변환
age = int(input("나이를 입력하세요: "))
print(type(age))  # <class 'int'>

실습 예제

1
2
3
4
5
6
# 간단한 계산기
num1 = int(input("첫 번째 숫자: "))
num2 = int(input("두 번째 숫자: "))

result = num1 + num2
print(f"{num1} + {num2} = {result}")

실행 결과:

1
2
3
첫 번째 숫자: 10
두 번째 숫자: 20
10 + 20 = 30

🎯 학습 목표 3: random 모듈로 랜덤 숫자 생성하기

random.randint() 사용하기

1
2
3
4
5
import random

# 1부터 10까지 랜덤 숫자
number = random.randint(1, 10)
print(number)  # 예: 7 (실행할 때마다 다름)

💡 import: 다른 사람이 만든 기능을 가져오는 명령어

다양한 랜덤 기능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random

# 정수 랜덤
print(random.randint(1, 100))  # 1~100 사이

# 실수 랜덤
print(random.random())  # 0.0~1.0 사이

# 리스트에서 랜덤 선택
fruits = ["사과", "바나나", "포도"]
print(random.choice(fruits))

# 리스트 섞기
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers)

🎯 학습 목표 4: 게임 기본 버전 만들기

1단계: 한 번만 입력받는 버전

1
2
3
4
5
6
7
8
9
10
11
12
13
import random

# 컴퓨터가 숫자 정하기
answer = random.randint(1, 100)

# 사용자 입력 받기
guess = int(input("숫자를 맞춰보세요 (1-100): "))

# 정답 확인
if guess == answer:
    print("정답입니다!")
else:
    print(f"틀렸습니다. 정답은 {answer}입니다.")

2단계: 힌트 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
import random

answer = random.randint(1, 100)
guess = int(input("숫자를 맞춰보세요 (1-100): "))

if guess == answer:
    print("정답입니다!")
elif guess < answer:
    print("더 큰 숫자입니다!")
else:
    print("더 작은 숫자입니다!")

print(f"정답은 {answer}입니다.")

🎯 학습 목표 5: 반복문으로 게임 완성하기

for문으로 여러 번 시도하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import random

answer = random.randint(1, 100)
attempts = 0  # 시도 횟수

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

for i in range(10):  # 최대 10번
    guess = int(input("\n숫자 입력: "))
    attempts += 1

    if guess == answer:
        print(f"정답! {attempts}번 만에 맞췄습니다!")
        break
    elif guess < answer:
        print("더 큰 숫자입니다!")
    else:
        print("더 작은 숫자입니다!")
else:
    print(f"\n게임 오버! 정답은 {answer}입니다.")

🎯 학습 목표 6: 추가 기능으로 게임 업그레이드하기

최종 완성 버전 (모든 기능 포함)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import random

def play_game():
    """숫자 맞추기 게임 메인 함수"""

    # 게임 설정
    answer = random.randint(1, 100)
    attempts = 0
    max_attempts = 7

    # 게임 시작
    print("\n" + "="*40)
    print("🎮 숫자 맞추기 게임에 오신 것을 환영합니다!")
    print("="*40)
    print(f"1부터 100 사이의 숫자를 맞춰보세요!")
    print(f"최대 {max_attempts}번의 기회가 있습니다.\n")

    # 게임 진행
    while attempts < max_attempts:
        try:
            # 사용자 입력
            guess = int(input(f"[{attempts + 1}/{max_attempts}] 숫자 입력: "))

            # 범위 체크
            if guess < 1 or guess > 100:
                print("⚠️  1부터 100 사이의 숫자를 입력하세요!")
                continue

            attempts += 1

            # 정답 확인
            if guess == answer:
                print("\n" + "🎉" * 10)
                print(f"축하합니다! {attempts}번 만에 정답을 맞췄습니다!")
                print("🎉" * 10)
                return True

            elif guess < answer:
                remaining = max_attempts - attempts
                print(f"⬆️  더 큰 숫자입니다! (남은 기회: {remaining}번)")

            else:
                remaining = max_attempts - attempts
                print(f"⬇️  더 작은 숫자입니다! (남은 기회: {remaining}번)")

        except ValueError:
            print("⚠️  숫자만 입력해주세요!")

    # 게임 오버
    print("\n" + "😢" * 10)
    print(f"게임 오버! 정답은 {answer}이었습니다.")
    print("😢" * 10)
    return False

def main():
    """게임 메인 루프"""

    print("👾 Python 숫자 맞추기 게임 👾")

    while True:
        # 게임 플레이
        play_game()

        # 재시작 여부
        replay = input("\n다시 하시겠습니까? (y/n): ").lower()
        if replay != 'y':
            print("\n게임을 종료합니다. 즐거우셨나요? 👋")
            break

# 게임 시작
if __name__ == "__main__":
    main()

추가 기능 1: 난이도 선택

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
print("난이도를 선택하세요:")
print("1. 쉬움 (1-50, 10번 기회)")
print("2. 보통 (1-100, 7번 기회)")
print("3. 어려움 (1-200, 5번 기회)")

level = int(input("선택: "))

if level == 1:
    max_num = 50
    max_attempts = 10
elif level == 2:
    max_num = 100
    max_attempts = 7
else:
    max_num = 200
    max_attempts = 5

answer = random.randint(1, max_num)

추가 기능 2: 점수 시스템

1
2
3
4
5
6
7
8
9
10
11
# 시도 횟수에 따른 점수
if attempts == 1:
    score = 1000
elif attempts <= 3:
    score = 500
elif attempts <= 5:
    score = 300
else:
    score = 100

print(f"획득 점수: {score}점!")

추가 기능 3: 최고 기록 저장

1
2
3
4
5
6
7
8
# 최고 기록 저장
best_score = None

if best_score is None or attempts < best_score:
    best_score = attempts
    print(f"🏆 신기록! 최고 기록: {best_score}")
else:
    print(f"현재 최고 기록: {best_score}")

💻 실전 예제

예제 1: 가위바위보 게임

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import random

choices = ["가위", "바위", ""]

print("=== 가위바위보 게임 ===")
user = input("가위/바위/보 중 선택: ")
computer = random.choice(choices)

print(f"컴퓨터: {computer}")

if user == computer:
    print("무승부!")
elif (user == "가위" and computer == "") or \
     (user == "바위" and computer == "가위") or \
     (user == "" and computer == "바위"):
    print("당신이 이겼습니다!")
else:
    print("컴퓨터가 이겼습니다!")

예제 2: 주사위 게임

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import random

print("=== 주사위 게임 ===")
input("엔터를 눌러 주사위를 굴리세요...")

dice1 = random.randint(1, 6)
dice2 = random.randint(1, 6)
total = dice1 + dice2

print(f"🎲 주사위 1: {dice1}")
print(f"🎲 주사위 2: {dice2}")
print(f"합계: {total}")

if total == 7:
    print("🎉 대박! 합이 7입니다!")
else:
    print("아쉽습니다. 다시 도전하세요!")

💡 실전 팁 & 주의사항

Tip 1: 에러 처리로 안정성 높이기

1
2
3
4
try:
    guess = int(input("숫자 입력: "))
except ValueError:
    print("숫자만 입력해주세요!")

Tip 2: 입력 범위 검증하기

1
2
3
4
if 1 <= guess <= 100:
    # 정상 처리
else:
    print("1~100 사이의 숫자를 입력하세요!")

Tip 3: 동적 힌트 범위로 난이도 조절

1
2
3
4
5
6
7
8
9
min_range = 1
max_range = 100

if guess < answer:
    min_range = guess + 1
    print(f"더 큰 숫자! ({min_range}~{max_range})")
else:
    max_range = guess - 1
    print(f"더 작은 숫자! ({min_range}~{max_range})")

Tip 4: input()은 항상 문자열 반환

1
2
3
4
5
6
7
# ❌ 잘못된 예
num = input("숫자: ")
if num > 50:  # 에러! 문자열과 숫자 비교 불가

# ✅ 올바른 예
num = int(input("숫자: "))
if num > 50:  # 정상 작동

Tip 5: break로 무한 루프 탈출하기

1
2
3
4
5
# break로 탈출
while True:
    guess = int(input("숫자: "))
    if guess == answer:
        break  # 루프 탈출

Tip 6: for-else로 모든 기회 소진 처리

1
2
3
4
5
6
7
for i in range(10):
    guess = int(input("숫자 입력: "))
    if guess == answer:
        print("정답!")
        break
else:  # break 없이 for문이 끝나면 실행
    print("게임 오버!")

🧪 연습 문제

문제 1: UP & DOWN 힌트 개선

기본 게임에 “많이 차이나요”/”조금 차이나요” 힌트를 추가하세요.

💡 힌트
1
2
3
4
5
diff = abs(guess - answer)  # 절댓값으로 차이 계산
if diff > 20:
    print("많이 차이나요!")
elif diff > 10:
    print("조금 차이나요!")
✅ 정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import random

answer = random.randint(1, 100)

for i in range(7):
    guess = int(input("숫자 입력: "))
    diff = abs(guess - answer)

    if guess == answer:
        print("정답!")
        break
    elif guess < answer:
        if diff > 20:
            print("⬆️ 더 큰 숫자! (많이 차이나요)")
        else:
            print("⬆️ 더 큰 숫자! (조금 차이나요)")
    else:
        if diff > 20:
            print("⬇️ 더 작은 숫자! (많이 차이나요)")
        else:
            print("⬇️ 더 작은 숫자! (조금 차이나요)")

문제 2: 1A2B 숫자야구 게임

3자리 숫자를 맞추는 게임을 만드세요. (중복 숫자 없음)

  • Strike(A): 숫자와 위치가 모두 일치
  • Ball(B): 숫자는 있지만 위치가 다름
💡 힌트
1
2
3
4
import random

# 1~9 중 3개 랜덤 선택
answer = random.sample(range(1, 10), 3)
✅ 정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import random

answer = random.sample(range(1, 10), 3)

print("=== 숫자야구 게임 ===")
print("1~9 중 서로 다른 3자리 숫자를 맞춰보세요!")

for attempt in range(1, 10):
    guess_str = input(f"[{attempt}회] 3자리 숫자: ")
    guess = [int(d) for d in guess_str]

    strike = 0
    ball = 0

    for i in range(3):
        if guess[i] == answer[i]:
            strike += 1
        elif guess[i] in answer:
            ball += 1

    if strike == 3:
        print(f"🎉 정답! {attempt}번 만에 맞췄습니다!")
        break
    else:
        print(f"{strike}S {ball}B")
else:
    print(f"게임 오버! 정답: {answer}")

📝 Phase 1 완료! 배운 내용 총정리

기본 문법

  1. 변수: 데이터를 담는 상자
  2. print(): 출력하기
  3. input(): 입력받기

데이터 타입

  1. 숫자: int (정수), float (실수)
  2. 문자열: str (텍스트)
  3. 리스트: 여러 데이터를 담는 자료구조

제어문

  1. if문: 조건에 따라 다르게 실행
  2. for문: 반복 작업 자동화

추가 기능

  1. random: 랜덤 값 생성
  2. 에러 처리: try-except

🎯 도전 과제

최종 프로젝트: 향상된 숫자 맞추기 게임

다음 기능을 모두 추가해보세요:

  1. 난이도 선택 (쉬움/보통/어려움)
  2. 점수 시스템
  3. 최고 기록 저장
  4. 힌트 범위 좁히기
  5. 게임 통계 (총 게임 수, 승률 등)

🏆 Phase 1 완료 축하합니다!

1
2
3
4
5
6
7
8
  _____ _                   _
 |  __ \ |                 | |
 | |__) | |__   __ _ ___  _| |
 |  ___/| '_ \ / _` / __|/ _ |
 | |    | | | | (_| \__ \  __/
 |_|    |_| |_|\__,_|___/\__|

      1 완료! 🎉

다음 단계 미리보기

Phase 2에서는:

  • while문 (무한 루프)
  • 딕셔너리 (dict)
  • 함수 만들기 (def)
  • 파일 읽고 쓰기
  • 에러 처리 등을 배웁니다!

🔗 관련 자료


📚 이전 학습

Day 9: 반복문 for

어제는 for문으로 반복 작업을 하는 방법을 배웠습니다!

📚 다음 학습

Day 11: 튜플 다루기 (tuple) ⭐⭐

Phase 2에서는 수정 불가능한 데이터 타입인 튜플을 배웁니다!


“늦었다고 생각할 때가 가장 빠른 시기입니다!” 🚀

Day 10/100 Phase 1 완료! 🎉 #100DaysOfPython
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.