
지난 포스팅에서 게임의 기본 설정(게임 제목, 플레이어 이름 입력)과 UI 구성을 마쳤습니다.
이번에는 본격적인 게임의 알맹이라고 할 수 있는 난수 생성, 사용자 입력 유효성 검사, 정답 판별, 그리고 재시작 로직(Stage 4 ~ Stage 7)을 완성해 보겠습니다.
절차적 프로그래밍에서는 중첩된 반복문(while)과 조건문(if)을 어떻게 제어하고 탈출하는지가 핵심입니다.
단계별로 코드를 어떻게 발전시키는지 세세하게 살펴보겠습니다.
Stage 4: AI 난수 생성 (게임 준비)
요구사항
|
게임을 시작하면 AI가 플레이어가 맞춰야 할 1부터 100 사이의 임의의 숫자(난수)를 생성해야 합니다.
import random # 파이썬 내장 난수 모듈 가져오기
# 1부터 100 사이(양끝 값 포함)의 임의의 정수 1개 생성
ai_number = random.randint(1, 100)
print(f"AI가 숫자를 생성했습니다! (테스트용 출력: {ai_number})")
Stage 5: 플레이어의 추측값 입력 및 철저한 유효성 검사
요구사항
|
플레이어에게 숫자를 입력받는 단계입니다.
개발자는 사용자가 항상 완벽한 숫자만 입력할 것이라고 기대해서는 안 됩니다.
공백, 문자, 범위를 벗어난 숫자 등 모든 예외 상황을 통제해야 프로그램이 멈추지 않습니다.
유효성 검사 4단계 (문자열 -> 수치 변환)
- 빈 값 및 스페이스바 입력 차단
- 숫자 형태의 문자열인지 확인 (isnumeric() 활용)
- 문자열을 실제 정수형(int)으로 변환
- 1~100 사이의 유효 범위 확인
while True:
player_number = input('AI가 생성한 1 ~ 100 사이의 정수값을 맞추시오\n').strip()
# 1. 입력값이 비어 있는지 체크
if not player_number:
print('정확하게 입력하세요. (빈 칸 입력 불가)')
continue
# 2. 정수 형태의 문자열인지 체크 (ex: '3.14', 'hello' 차단)
if not player_number.isnumeric():
print('정확하게 입력하세요. 정수만 입력할 수 있습니다.')
continue
# 3. 안전하게 정수형(int)으로 변환
player_number = int(player_number)
# 4. 유효 범위(1 <= n <= 100) 체크
if player_number < 1 or player_number > 100:
print('정확하게 입력하세요. 숫자는 1에서 100 사이만 가능합니다.')
continue
# 모든 검사를 무사히 통과했다면 정상 입력 완료! (입력 무한루프 탈출)
break
Stage 6: 값 비교 및 힌트 제공 (핵심 로직)
입력받은 player_number와 AI가 생성한 ai_number를 비교합니다.
크고 작음에 따라 힌트를 주고, 정답을 맞혔을 경우 시도 횟수를 기반으로 점수를 계산합니다.
player_try_count = 0 # 시도 횟수 초기화
# ... (Stage 5의 입력 로직 완료 후 아래 로직 실행) ...
player_try_count += 1 # 정상 입력되었으므로 시도 횟수 1 증가
if player_number > ai_number:
print('입력값이 정답보다 큽니다. 더 작은 숫자를 입력하세요.')
# 이후 다시 Stage 5 입력 단계로 돌아가야 합니다. (전체 통합 코드에서 확인)
elif player_number < ai_number:
print('입력값이 정답보다 작습니다. 더 큰 숫자를 입력하세요.')
else:
# player_number == ai_number 인 경우 (정답!)
# 점수 계산: (10 - 시도횟수) * 10
score = (10 - player_try_count) * 10
print(f'🎉 정답입니다! 총 {player_try_count}번 시도하셨습니다. (점수: {score}점)')
# 정답을 맞췄으므로 게임 루프를 탈출하여 Stage 7로 이동합니다.
Stage 7: 게임 재시작 여부 확인 및 데이터 정규화
게임이 끝난 후 다시 플레이할지 묻는 단계입니다. 사용자들은 'yes', 'Y', 'YES', 'yEs' 등 아주 다양한 형태로 입력할 수 있습니다.
💡 데이터 정규화 꿀팁: .lower() 모든 경우의 수를 if문으로 다 적는 것은 비효율적입니다. 입력받은 문자열을 .lower() 함수를 사용해 모두 소문자로 강제 변환(정규화)하면 판별 로직이 매우 단순해집니다.
while True:
prompt = '다시 게임을 하시겠습니까? (yes | y | no | n)\n'
# 앞뒤 공백 제거 후 모두 소문자로 변환
player_answer = input(prompt).strip().lower()
if player_answer == 'yes' or player_answer == 'y':
print("게임을 다시 시작합니다!")
break # 현재 재시작 확인 루프 탈출 후 게임 로직 처음으로 이동
elif player_answer == 'no' or player_answer == 'n':
print('bye bye ~!! 게임을 종료합니다.')
break # 게임 완전 종료 처리가 필요함
else:
print('정확하게 입력하세요. (yes 또는 no)')
최종 통합: 전체 게임 루프 구조 (Stage 4 ~ 7)
모든 Stage를 하나로 합쳐보겠습니다. 가장 눈여겨보셔야 할 부분은 is_game_play라는 플래그(Flag) 변수입니다.
게임 루프(Stage 4~6) 안에서 재시작 확인 루프(Stage 7)가 돌기 때문에, 중첩된 while문이 발생합니다.
파이썬의 break는 자신을 감싼 단 1개의 반복문만 탈출하므로, 한 번에 가장 바깥쪽 루프까지 뚫고 나가 완전히 게임을 종료시키기 위해 불리언(Boolean) 변수를 활용하는 것이 가장 우아하고 확실한 방법입니다.
import random
# 전체 게임의 실행 상태를 관리하는 플래그(Flag) 변수
is_game_play: bool = True
while is_game_play: # 🎮 [메인 루프] 게임 전체 시작
# [Stage 4] AI 난수 생성
ai_number = random.randint(1, 100)
player_try_count = 0
print("\n--- 새로운 게임이 시작되었습니다! ---")
while True: # 🔁 [진행 루프] 정답을 맞출 때까지 반복
# [Stage 5] 플레이어 입력 및 유효성 검사
while True:
player_number = input('AI가 생성한 1 ~ 100 사이의 정수값을 맞추시오: ').strip()
if not player_number:
print('정확하게 입력하세요.')
continue
if not player_number.isnumeric():
print('정확하게 입력하세요. 정수만 입력됩니다.')
continue
player_number = int(player_number)
if player_number < 1 or player_number > 100:
print('정확하게 입력하세요. 숫자는 1에서 100 사이만 가능합니다.')
continue
break
# [Stage 6] 값 비교 및 판단
player_try_count += 1
if player_number > ai_number:
print('📉 입력값이 더 큽니다.')
elif player_number < ai_number:
print('📈 입력값이 더 작습니다.')
else:
score = (10 - player_try_count) * 10
print(f'🎉 정답입니다! (시도: {player_try_count}회, 획득 점수: {score}점)')
break # 🔁 [진행 루프] 탈출! -> Stage 7로 이동
# [Stage 7] 재시작 여부 확인
while True: # 🔄 [확인 루프] 정확한 의사를 밝힐 때까지 반복
prompt = '다시 게임을 하시겠습니까? (yes/y 또는 no/n): '
player_answer = input(prompt).strip().lower()
if player_answer == 'yes' or player_answer == 'y':
break # 🔄 [확인 루프]만 탈출하여 자연스럽게 🎮 [메인 루프]의 처음으로 돌아감
elif player_answer == 'no' or player_answer == 'n':
print('bye bye ~!!')
is_game_play = False # 플래그를 False로 변경하여 🎮 [메인 루프]를 죽임!
break # 🔄 [확인 루프] 탈출
else:
print('정확하게 입력하세요.')
# is_game_play가 False가 되었으므로 메인 루프가 종료되고 프로그램이 완전히 끝납니다.
오늘의 한 마디
이렇게 해서 절차적 프로그래밍으로 숫자 맞추기 게임을 만들어봤는데요. ㅎㅎ 요새는 사실 ai를 이용해서 코드를 생성하면 금방 만들어주지만 처음 언어를 배울 때는 자동완성도 거의 쓰지 않고 직접 만들어보는 것도 재밌는 것 같습니다.
오늘은 뭔가 저를 키워주시고 지원해 주시는 부모님에게 감사의 마음이 들어 감사의 인사를 드리고 싶네요 ㅎㅎ 저도 훗날에는 부모님과 같은 사람이 되려고 노력해야겠습니다. 제 주변 사람들에게 좋은 그런 사람
'코딩 개발 > Python' 카테고리의 다른 글
| Python - 함수의 종류와 활용법 (0) | 2026.07.20 |
|---|---|
| Python - 함수 (Function) (0) | 2026.07.17 |
| Python - 절차적 프로그래밍1 (숫자 맞추기 만들기 step1 ~ step3) (0) | 2026.07.15 |
| Python - 반복문(break, continue, else, while) (0) | 2026.07.14 |
| Python - 반복문 (for) (0) | 2026.07.13 |