파이썬 기초문법/파이썬 게임 만들기
파이썬 게임 만들기 - 행맨 게임 👨🎨
Family in August
2025. 3. 8. 10:36
반응형
파이썬으로 시작하는 게임 개발의 세계 🐍🎮
안녕하세요! Python Game Dev 블로그의 세 번째 포스팅입니다. 이전에는 숫자 맞추기 게임과 퀴즈 게임을 만들어보았는데요, 오늘은 전 세계적으로 유명한 단어 맞추기 게임인 **행맨 게임(Hangman)**을 만들어보겠습니다.
오늘의 게임: 행맨 게임 👨🎨
행맨 게임은 컴퓨터가 선택한 비밀 단어를 플레이어가 한 글자씩 추측하여 맞추는 게임입니다. 틀릴 때마다 교수대에 사람 그림이 하나씩 그려지며, 그림이 완성되기 전에 단어를 맞추면 승리합니다.
게임의 규칙 📜
- 컴퓨터가 무작위로 단어를 선택합니다.
- 플레이어는 한 번에 한 글자씩 추측합니다.
- 추측한 글자가 단어에 포함되어 있으면, 해당 위치가 공개됩니다.
- 추측한 글자가 단어에 없으면, 행맨 그림의 일부가 그려집니다.
- 행맨 그림이 완성되기 전에 단어를 맞추면 승리하고, 그림이 완성되면 패배합니다.
전체 코드 💻
import random
import os
def clear_screen():
"""화면을 깨끗하게 지우는 함수입니다."""
os.system('cls' if os.name == 'nt' else 'clear')
def get_word():
"""무작위로 단어를 선택하는 함수입니다."""
words = [
"사과", "바나나", "오렌지", "딸기", "포도",
"컴퓨터", "키보드", "마우스", "모니터", "프린터",
"파이썬", "자바", "자바스크립트", "루비", "코틀린",
"한국", "미국", "일본", "중국", "프랑스",
"축구", "야구", "농구", "배구", "테니스"
]
return random.choice(words)
def display_hangman(tries):
"""현재 행맨 상태를 표시하는 함수입니다."""
stages = [
# 최종 상태: 패배
'''
--------
| |
| O
| \\|/
| |
| / \\
-
''',
# 남은 기회 1번
'''
--------
| |
| O
| \\|/
| |
| /
-
''',
# 남은 기회 2번
'''
--------
| |
| O
| \\|/
| |
|
-
''',
# 남은 기회 3번
'''
--------
| |
| O
| \\|
| |
|
-
''',
# 남은 기회 4번
'''
--------
| |
| O
| |
| |
|
-
''',
# 남은 기회 5번
'''
--------
| |
| O
|
|
|
-
''',
# 남은 기회 6번
'''
--------
| |
|
|
|
|
-
''',
# 초기 상태
'''
--------
|
|
|
|
|
-
'''
]
return stages[tries]
def play_hangman():
"""행맨 게임의 메인 함수입니다."""
word = get_word()
word_completion = "_" * len(word) # 단어의 길이만큼 밑줄로 표시
guessed = False
guessed_letters = set() # 이미 추측한 글자들
guessed_words = set() # 이미 추측한 단어들
tries = 7 # 남은 시도 횟수
# 게임 시작 메시지
print("="*50)
print(" 행맨 게임에 오신 것을 환영합니다! ")
print("="*50)
print(display_hangman(tries))
print(f"현재 단어: {' '.join(word_completion)}")
print("\n")
# 게임 루프
while not guessed and tries > 0:
guess = input("글자나 단어를 추측해보세요: ").lower()
# 입력값 검증
if len(guess) == 1 and guess.isalpha():
# 이미 추측한 글자인 경우
if guess in guessed_letters:
print(f"이미 추측한 글자입니다: {guess}")
# 추측한 글자가 단어에 없는 경우
elif guess not in word:
print(f"'{guess}'는 단어에 없습니다.")
tries -= 1
guessed_letters.add(guess)
# 추측한 글자가 단어에 있는 경우
else:
print(f"좋아요! '{guess}'는 단어에 있습니다!")
guessed_letters.add(guess)
# 단어 상태 업데이트
word_as_list = list(word_completion)
for i, letter in enumerate(word):
if letter == guess:
word_as_list[i] = letter
word_completion = "".join(word_as_list)
# 모든 글자를 맞췄는지 확인
if "_" not in word_completion:
guessed = True
# 단어를 추측한 경우
elif len(guess) == len(word) and guess.isalpha():
# 이미 추측한 단어인 경우
if guess in guessed_words:
print(f"이미 추측한 단어입니다: {guess}")
# 추측한 단어가 틀린 경우
elif guess != word:
print(f"{guess}는 정답이 아닙니다.")
tries -= 1
guessed_words.add(guess)
# 추측한 단어가 맞는 경우
else:
guessed = True
word_completion = word
# 잘못된 입력인 경우
else:
print("유효하지 않은 입력입니다. 한글 글자나 단어를 입력해주세요.")
# 현재 상태 표시
print(display_hangman(tries))
print(f"현재 단어: {' '.join(word_completion)}")
print(f"남은 시도 횟수: {tries}")
print(f"시도한 글자들: {', '.join(guessed_letters)}")
print("\n")
# 게임 결과 표시
if guessed:
print("축하합니다! 단어를 맞추셨습니다!")
else:
print(f"아쉽네요. 행맨이 완성되었습니다. 정답은 '{word}'였습니다.")
def main():
"""게임을 시작하고 재시작하는 함수입니다."""
while True:
play_hangman()
# 다시 플레이할지 확인
play_again = input("다시 플레이하시겠습니까? (y/n): ")
if play_again.lower() != 'y':
print("행맨 게임을 종료합니다. 이용해 주셔서 감사합니다!")
break
clear_screen()
# 게임 시작
if __name__ == "__main__":
main()
코드 설명 📝
1. 필요한 모듈 가져오기
import random
import os
- random 모듈: 단어 목록에서 무작위로 단어를 선택하기 위해 사용합니다.
- os 모듈: 화면을 지우는 기능을 위해 사용합니다.
2. 단어 선택 함수
def get_word():
"""무작위로 단어를 선택하는 함수입니다."""
words = [
"사과", "바나나", "오렌지", "딸기", "포도",
# ... 단어 목록
]
return random.choice(words)
- 여러 주제(과일, 컴퓨터 관련 용어, 프로그래밍 언어, 국가, 스포츠)의 단어를 포함하는 리스트에서 무작위로 하나를 선택합니다.
- 실제 프로젝트에서는 이 단어 목록을 외부 파일에서 불러오는 것이 좋습니다.
3. 행맨 그림 표시 함수
def display_hangman(tries):
"""현재 행맨 상태를 표시하는 함수입니다."""
stages = [
# ... ASCII 아트
]
return stages[tries]
- 남은 시도 횟수에 따라 다른 ASCII 아트를 반환합니다.
- 총 8단계의 그림이 있으며, 7번의 틀린 기회가 주어집니다.
4. 게임 메인 함수
def play_hangman():
"""행맨 게임의 메인 함수입니다."""
# ... 게임 로직
- 단어 선택, 사용자 입력 처리, 게임 상태 업데이트, 결과 표시 등 게임의 핵심 로직을 담당합니다.
- 집합(set) 자료형을 사용하여 이미 추측한 글자와 단어를 효율적으로 관리합니다.
5. 문자열 처리
# 단어 상태 업데이트
word_as_list = list(word_completion)
for i, letter in enumerate(word):
if letter == guess:
word_as_list[i] = letter
word_completion = "".join(word_as_list)
- 문자열은 불변(immutable) 자료형이므로, 리스트로 변환하여 업데이트한 후 다시 문자열로 변환합니다.
- enumerate() 함수를 사용하여 인덱스와 값을 함께 순회합니다.
6. 게임 컨트롤 함수
def main():
"""게임을 시작하고 재시작하는 함수입니다."""
# ... 게임 시작 및 재시작 로직
- 게임의 시작과 재시작을 관리하는 상위 함수입니다.
게임 실행 방법 🚀
- 위의 코드를 복사하여 텍스트 에디터에 붙여넣기
- 파일을 hangman.py와 같은 이름으로 저장
- 파이썬이 설치된 환경에서 터미널(명령 프롬프트)을 열고 파일을 저장한 디렉토리로 이동
- python hangman.py 명령어를 입력하여 게임 실행
확장 가능성 🌱
이 행맨 게임을 다음과 같은 방향으로 확장해볼 수 있습니다:
- 단어 목록을 외부 파일(텍스트 파일)에서 불러오기
- 주제별로 단어를 분류하고 사용자가 주제를 선택할 수 있게 하기
- 난이도 설정 추가 (쉬움: 더 많은 시도 기회, 어려움: 더 적은 시도 기회)
- 점수 시스템과 최고 기록 기능 추가
- 색상 추가 (colorama 패키지 활용)
- pygame을 활용하여 그래픽 인터페이스 구현
게임에서 사용된 프로그래밍 개념 📚
이번 게임을 통해 다음과 같은 파이썬 개념들을 활용해보았습니다:
- 문자열 처리와 조작
- 문자열 인덱싱
- join(), split() 메서드
- 문자열-리스트 변환
- 집합(set) 자료형
- 중복 제거를 위한 집합 활용
- add() 메서드
- ASCII 아트를 활용한 텍스트 기반 그래픽
- 사용자 입력 검증
- 조건문과 반복문의 복합적 활용
알고리즘 설명 🧮
행맨 게임의 핵심 알고리즘은 다음과 같습니다:
- 무작위로 단어 선택
- 단어의 길이만큼 밑줄(_)로 표시된 초기 상태 생성
- 사용자 입력 받기 (한 글자 또는 전체 단어)
- 입력 검증 및 처리
- 한 글자인 경우: 단어에 해당 글자가 있는지 확인 후 상태 업데이트
- 전체 단어인 경우: 정답과 일치하는지 확인
- 틀렸을 경우 남은 시도 횟수 감소 및 행맨 그림 업데이트
- 승리 또는 패배 조건 확인:
- 승리: 모든 글자를 맞추거나 정답 단어를 맞춤
- 패배: 시도 횟수를 모두 소진
다음 포스팅에서는 "틱택토(TicTacToe) 게임"을 만들어 볼 예정입니다. 2차원 배열과 게임 상태 관리에 대해 배워보겠습니다.
텍스트 기반 게임 몇 가지를 더 소개한 후, pygame을 활용한 그래픽 게임 시리즈로 발전해 나갈 계획입니다. 계속 지켜봐 주세요! 궁금한 점이나 제안사항이 있으시면 댓글로 남겨주세요. 행복한 코딩 되세요! 🐍✨
반응형