인터넷에서 가져온 임의의 단어를 주어진 횟수내에 맞추는 행맨 게임을 만들어 보겠습니다.
먼저 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()
'수업자료' 카테고리의 다른 글
실습 : 가위, 바위, 보 게임 (1) | 2024.08.04 |
---|---|
실습 : 다양한 형태의 피라미드 출력 (0) | 2024.08.04 |
실습 : 주민등록번호를 이용한 나이, 성별 추출 (0) | 2024.08.02 |
실습 : 주문 처리 함수 (0) | 2024.08.01 |
실습 : 구구단 출력 (0) | 2024.07.31 |
댓글