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번 만에 맞췄습니다!"
|
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})")
|
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 완료! 배운 내용 총정리
기본 문법
- 변수: 데이터를 담는 상자
- print(): 출력하기
- input(): 입력받기
데이터 타입
- 숫자: int (정수), float (실수)
- 문자열: str (텍스트)
- 리스트: 여러 데이터를 담는 자료구조
제어문
- if문: 조건에 따라 다르게 실행
- for문: 반복 작업 자동화
추가 기능
- random: 랜덤 값 생성
- 에러 처리: try-except
🎯 도전 과제
최종 프로젝트: 향상된 숫자 맞추기 게임
다음 기능을 모두 추가해보세요:
- 난이도 선택 (쉬움/보통/어려움)
- 점수 시스템
- 최고 기록 저장
- 힌트 범위 좁히기
- 게임 통계 (총 게임 수, 승률 등)
🏆 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 |