파이썬 기초문법/파이썬 게임 만들기

파이썬 게임 만들기 - 행맨 게임 👨‍🎨

Family in August 2025. 3. 8. 10:36
반응형

파이썬으로 시작하는 게임 개발의 세계 🐍🎮

안녕하세요! Python Game Dev 블로그의 세 번째 포스팅입니다. 이전에는 숫자 맞추기 게임과 퀴즈 게임을 만들어보았는데요, 오늘은 전 세계적으로 유명한 단어 맞추기 게임인 **행맨 게임(Hangman)**을 만들어보겠습니다.

오늘의 게임: 행맨 게임 👨‍🎨

행맨 게임은 컴퓨터가 선택한 비밀 단어를 플레이어가 한 글자씩 추측하여 맞추는 게임입니다. 틀릴 때마다 교수대에 사람 그림이 하나씩 그려지며, 그림이 완성되기 전에 단어를 맞추면 승리합니다.

게임의 규칙 📜

  1. 컴퓨터가 무작위로 단어를 선택합니다.
  2. 플레이어는 한 번에 한 글자씩 추측합니다.
  3. 추측한 글자가 단어에 포함되어 있으면, 해당 위치가 공개됩니다.
  4. 추측한 글자가 단어에 없으면, 행맨 그림의 일부가 그려집니다.
  5. 행맨 그림이 완성되기 전에 단어를 맞추면 승리하고, 그림이 완성되면 패배합니다.

 

전체 코드 💻

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():
    """게임을 시작하고 재시작하는 함수입니다."""
    # ... 게임 시작 및 재시작 로직
  • 게임의 시작과 재시작을 관리하는 상위 함수입니다.

게임 실행 방법 🚀

  1. 위의 코드를 복사하여 텍스트 에디터에 붙여넣기
  2. 파일을 hangman.py와 같은 이름으로 저장
  3. 파이썬이 설치된 환경에서 터미널(명령 프롬프트)을 열고 파일을 저장한 디렉토리로 이동
  4. python hangman.py 명령어를 입력하여 게임 실행

확장 가능성 🌱

이 행맨 게임을 다음과 같은 방향으로 확장해볼 수 있습니다:

  1. 단어 목록을 외부 파일(텍스트 파일)에서 불러오기
  2. 주제별로 단어를 분류하고 사용자가 주제를 선택할 수 있게 하기
  3. 난이도 설정 추가 (쉬움: 더 많은 시도 기회, 어려움: 더 적은 시도 기회)
  4. 점수 시스템과 최고 기록 기능 추가
  5. 색상 추가 (colorama 패키지 활용)
  6. pygame을 활용하여 그래픽 인터페이스 구현

게임에서 사용된 프로그래밍 개념 📚

이번 게임을 통해 다음과 같은 파이썬 개념들을 활용해보았습니다:

  1. 문자열 처리와 조작
    • 문자열 인덱싱
    • join(), split() 메서드
    • 문자열-리스트 변환
  2. 집합(set) 자료형
    • 중복 제거를 위한 집합 활용
    • add() 메서드
  3. ASCII 아트를 활용한 텍스트 기반 그래픽
  4. 사용자 입력 검증
  5. 조건문과 반복문의 복합적 활용

알고리즘 설명 🧮

행맨 게임의 핵심 알고리즘은 다음과 같습니다:

  1. 무작위로 단어 선택
  2. 단어의 길이만큼 밑줄(_)로 표시된 초기 상태 생성
  3. 사용자 입력 받기 (한 글자 또는 전체 단어)
  4. 입력 검증 및 처리
    • 한 글자인 경우: 단어에 해당 글자가 있는지 확인 후 상태 업데이트
    • 전체 단어인 경우: 정답과 일치하는지 확인
  5. 틀렸을 경우 남은 시도 횟수 감소 및 행맨 그림 업데이트
  6. 승리 또는 패배 조건 확인:
    • 승리: 모든 글자를 맞추거나 정답 단어를 맞춤
    • 패배: 시도 횟수를 모두 소진

다음 포스팅에서는 "틱택토(TicTacToe) 게임"을 만들어 볼 예정입니다. 2차원 배열과 게임 상태 관리에 대해 배워보겠습니다.

텍스트 기반 게임 몇 가지를 더 소개한 후, pygame을 활용한 그래픽 게임 시리즈로 발전해 나갈 계획입니다. 계속 지켜봐 주세요! 궁금한 점이나 제안사항이 있으시면 댓글로 남겨주세요. 행복한 코딩 되세요! 🐍✨

반응형