본문 바로가기
수업자료

실습 : 행맨

by ^..^v 2024. 8. 4.
728x90
반응형

인터넷에서 가져온 임의의 단어를 주어진 횟수내에 맞추는 행맨 게임을 만들어 보겠습니다. 

 

먼저 requests 모듈을 사용해 랜덤 단어를 가져오는 함수를 정의합니다. 

import requests
import random

def get_random_word():
    response = requests.get("https://random-word-api.herokuapp.com/word?number=1")
    if response.status_code == 200:
        return response.json()[0]
    else:
        return None

get_random_word 함수는 랜덤 단어 API의 엔드포인트에 GET 요청을 보내어 단어를 가져옵니다. 요청이 성공하면 응답에서 단어를 추출해 반환하고, 실패하면 None을 반환합니다. 

 

사용자가 틀릴 때마다 행맨 그림을 출력하는 함수를 정의합니다. 

def display_hangman(tries):
    stages = [
        """
           -----
           |   |
           O   |
          /|\\  |
          / \\  |
               |
        --------
        """,
        	... (생략) ...
        """
           -----
           |   |
               |
               |
               |
               |
        --------
        """
    ]
    return stages[tries]

display_hangman 함수는 tries 값에 따라 각기 다른 행맨 그림을 반환합니다. tries 값이 감소할수록 그림은 점점 완성됩니다. 

 

게임의 주요 로직을 구현하는 play_hangman 함수를 정의합니다. 

def play_hangman():
    word = get_random_word()
    if not word:
        print("Error: Unable to fetch a word from the API.")
        return

먼저 get_random_word 함수를 호출하여 무작위 단어를 가져옵니다. 단어를 가져오는 데 실패하면 에러 메시지를 출력하고 함수를 종료합니다.

 

    tries = 6
    word = word.upper()
    correct_letters = set(word)
    guessed_letters = set()
    guessed_word = ["_"] * len(word)

    print("행맨 게임에 오신 것을 환영합니다!")
    print(display_hangman(tries))
    print(" ".join(guessed_word))
    print("\n")

게임에 필요한 변수들을 초기화합니다. tries는 사용자가 단어를 맞추기 위해 시도할 수 있는 횟수로 초기값은 6입니다. word는 API를 이용해 가져온 단어를 대문자로 변환한 것입니다. correct_letters는 맞춰야 할 단어의 문자 집합이고, guessed_letters는 사용자가 추측한 문자 집합이며, guessed_word는 맞춰야 할 단어를 _로 초기화한 리스트입니다. 

게임 시작을 알리는 메시지를 출력하고, 초기 상태의 행맨 그림과 단어 상태를 출력합니다. 

 

    while tries > 0 and set(guessed_word) != correct_letters:

게임은 사용자가 단어를 맞추거나 시도 횟수를 다 쓸 때까지 계속됩니다. 이 루프는 사용자로부터 입력을 받아 처리하고, 게임 상태를 업데이트하며, 필요한 경우 시도 횟수를 줄입니다. 

 

        guess = input("단어를 추측하세요: ").upper()

사용자로부터 단어를 추측하게 하고, 입력받은 문자를 대문자로 변환합니다. 

 

        if len(guess) == 1 and guess.isalpha():

입력된 문자가 유효한지 검사합니다. 문자가 한 글자이고 알파벳인지 확인합니다. 

 

            if guess in guessed_letters:
                print("이미 이 문자를 추측했습니다:", guess)

입력된 문자가 이미 추측한 문자라면, 사용자에게 이미 추측한 문자임을 알립니다. 

 

            elif guess in word:
                guessed_letters.add(guess)
                for idx, letter in enumerate(word):
                    if letter == guess:
                        guessed_word[idx] = guess

입력된 문자가 단어에 포함되어 있는 경우, guessed_letters에 문자를 추가하고, guessed_word를 업데이트합니다. 

 

            else:
                print("틀렸습니다. 이 문자는 단어에 없습니다:", guess)
                guessed_letters.add(guess)
                tries -= 1

입력된 문자가 단어에 포함되어 있지 않은 경우, guessed_letters에 문자를 추가하고, 시도 횟수를 감소시킵니다. 

 

        else:
            print("유효한 문자를 입력하세요.")

입력된 문자가 유효하지 않은 경우, 사용자에게 유효한 문자를 입력하라는 메시지를 출력합니다. 

 

        print(display_hangman(tries))
        print(" ".join(guessed_word))
        print("\n")

각 시도 후 현재 상태의 행맨 그림과 단어 상태를 출력합니다. 

 

    if set(guessed_word) == correct_letters:
        print("축하합니다! 단어를 맞췄습니다:", word)
    else:
        print("아쉽게도 졌습니다. 정답은:", word)

게임 루프가 종료된 후, 사용자가 단어를 맞췄는지 여부에 따라 결과를 출력합니다. 사용자가 단어를 맞췄다면 축하 메시지를, 그렇지 않다면 정답을 출력합니다. 

 

전체 소스 코드는 다음과 같습니다. 

import requests
import random

# requests 모듈을 사용해 random-word-api에서 무작위 단어를 가져옵니다.
def get_random_word():
    # 무작위 단어를 가져오는 random-word-api 엔드포인트
    # https://random-word-api.herokuapp.com/word?number=1
    
    # random-word-api에서 무작위 단어를 가져오는데 성공하면 가져온 단어를 반환
    response = requests.get("https://random-word-api.herokuapp.com/word?number=1")
    if response.status_code == 200:
        return response.json()[0]
    else:
        return None

# tries 값에 따라 행맨 그림을 출력합니다.
def display_hangman(tries):
    stages = [
        """
           -----
           |   |
           O   |
          /|\\  |
          / \\  |
               |
        --------
        """,
        """
           -----
           |   |
           O   |
          /|\\  |
          /    |
               |
        --------
        """,
        """
           -----
           |   |
           O   |
          /|\\  |
               |
               |
        --------
        """,
        """
           -----
           |   |
           O   |
          /|   |
               |
               |
        --------
        """,
        """
           -----
           |   |
           O   |
           |   |
               |
               |
        --------
        """,
        """
           -----
           |   |
           O   |
               |
               |
               |
        --------
        """,
        """
           -----
           |   |
               |
               |
               |
               |
        --------
        """
    ]
    return stages[tries]

# 게임 로직을 구현합니다. 
def play_hangman():
    # word 변수에 get_random_word 함수를 호출해 무작위 단어를 가져옵니다. 
    # 단어를 가져오지 못 하면 에러 메시지를 출력하고 함수를 종료합니다. 
    word = get_random_word()
    if not word:
        print("Error: Unable to fetch a word from the API.")
        return

    # tries 변수는 사용자가 시도할 수 있는 횟수를 나타내며, 초기값은 6입니다. 
    tries = 6

    # word 변수를 대문자로 변환합니다. 
    # 로직 구현에 사용할 변수를 선언하고 초기화합니다. 
    #   correct_letters : 맞춰야 할 단어의 문자 집합
    #   guessed_letters : 사용자가 추측한 문자 집합
    #   guessed_word : 맞춰야 할 단어를 '_'로 초기화한 리스트
    word = word.upper()
    correct_letters = set(word)
    guessed_letters = set()
    guessed_word = ["_"] * len(word)

    # 게임 시작을 출력하고, 초기 행맨 그림과 단어 상태를 출력합니다. 
    print("행맨 게임에 오신 것을 환영합니다!")
    print(display_hangman(tries))
    print(" ".join(guessed_word))
    print("\n")

    # 사용자가 단어를 맞추거나 시도 횟수를 다 쓸 때까지 게임이 진행됩니다. 
    while tries > 0 and set(guessed_word) != correct_letters:
        # 사용자 추측을 입력받아 대문자로 변환합니다. 
        guess = input("단어를 추측하세요: ").upper()
        
        # 입력한 문자가 유효(한 글자의 알파벳)한지 확인합니다. 
        if len(guess) == 1 and guess.isalpha():
            # 이미 추측한 문자이면 메시지를 출력합니다. 
            if guess in guessed_letters:
                print("이미 이 문자를 추측했습니다:", guess)
            elif guess in word:
                # 맞춘 문자는 guessed_letters에 추가하고, guessed_word를 업데이트합니다. 
                guessed_letters.add(guess)
                for idx, letter in enumerate(word):
                    if letter == guess:
                        guessed_word[idx] = guess
            else:
                # 틀린 문자는 guessed_letters에 추가하고, tries를 감소합니다. 
                print("틀렸습니다. 이 문자는 단어에 없습니다:", guess)
                guessed_letters.add(guess)
                tries -= 1
        else:
            print("유효한 문자를 입력하세요.")
        
        # 행맨 그림과 단어 상태를 출력합니다.
        print(display_hangman(tries))
        print(" ".join(guessed_word))
        print("\n")

    # 게임 결과를 출력합니다. 
    if set(guessed_word) == correct_letters:
        print("축하합니다! 단어를 맞췄습니다:", word)
    else:
        print("아쉽게도 졌습니다. 정답은:", word)

# 게임을 시작합니다. 
if __name__ == "__main__":
    play_hangman()

 

728x90
반응형

댓글