프로그래밍/Python

Python 부트 캠프 - hangman 게임 만들기

Nowon9159 2023. 4. 18. 16:50
반응형

Python (https://towardsdatascience.com/the-zen-of-python-a-guide-to-pythons-design-principles-93f3f76d088a)

강의 내에서 hangman이라는 게임을 제작 해보고 있다.

hangman이라는 게임에 대한 설명은 아래 링크에 있다.

https://namu.wiki/w/%ED%96%89%EB%A7%A8

#로직 생각해보기
# 단어를 무작위 추출
# 단어의 범위 만큼 배열에 담기
# 인풋 값을 받아서 알파벳 비교, 배열의 인덱스 값에 따라 알파벳 비교
# 알파벳이 있다면 프린트 없다면 목숨-1
# 목숨 안에 단어를 맞추면 성공 -> 모든 빈칸이 채워졌는가?
# 목숨 안에 단어를 못 맞추면 실패 -> 목숨이 0일때 모든 빈칸이 채워지지 않았는가?

import random

# 단어 배열에서 아무거나 추출
words = ["book", "phone", "chair", "table", "cup", "pen", "pencil", "bag", "door", "key"]
ran_word = random.choice(words)

# 단어의 범위 만큼 다시 배열에 담기
selected_word = []
for i in range(0,len(ran_word)):
    selected_word.append(ran_word[i])

# 인풋 값 받기

처음 로직을 생각 하고나서 코드를 작성 해 보았다.

 

로직은

  1. 단어가 담겨있는 배열에서 무작위로 단어를 추출한다.
  2. 단어의 인덱스 값 만큼 배열의 범위를 설정해 "_" 를 입력한다. 예를 들어 test 라는 단어를 추출 했을 경우 ['_', '_', '_', '_'] 의 배열과 ['t', 'e', 's', 't'] 배열을 생성한다. 
  3. User 의 인풋 값을 받아서 인풋 값이 있다면 ? 배열안 해당 인풋 값이 위치하는 위치에 인풋 값을 넣는다 : 목숨 한개 가 깎이며 재 입력 창을 띄운다
  4. 목숨이 끝날때 까지 반복한다.
  5. 목숨 내로 단어를 모두 맞추면 이겼다는 메시지를 출력한다. 목숨이 끝나면 게임을 종료하고 졌다는 메시지를 출력한다.

더 명확히 정리하자면 위와 같다.

처음 코드를 작성할 때 일단 해보자라는 마음으로 단어 추출, 단어의 범위 만큼 다시 배열에 담는 코드를 작성했다.

# 단어의 범위 만큼 다시 배열에 담기
selected_word = []
for i in range(0,len(ran_word)):
    selected_word.append(ran_word[i])

* range를 설정할 때 랜덤 word를 len 함수로 감싸지 않아도 된다.
=> for i in range(0, ran_word) 로 설정해 주어도 str의 개수를 자동으로 세주어 준다.

# 인풋 값 받기
guess_word = input("Guess a letter : ")

# 유저 인풋 값 확인해서 선택된 배열의 값과 비교
for i in range(0,len(ran_word)):
    if guess_word == selected_word[i] :
        print("Right")
    else:
        print("Wrong")

그 다음 인풋 값을 받아서 변수에 담았고 변수 값을 단어를 쪼개어 담았던 배열과 비교해 주어
일치 하다면 Right 아니라면 Wrong을 출력해 값을 비교할 수 있도록 로직을 작성 해 주었다.
=> 일단 확인을 하기 위해서

#로직 생각해보기
# 단어를 무작위 추출
# 단어의 범위 만큼 배열에 담기
# 인풋 값을 받아서 알파벳 비교, 배열의 인덱스 값에 따라 알파벳 비교
# 알파벳이 있다면 프린트 없다면 목숨-1
# 목숨 안에 단어를 맞추면 성공 -> 모든 빈칸이 채워졌는가?
# 만약 모든 빈칸이 채워지지 않고 목숨이 0 초과라면 계속 input
# 목숨 안에 단어를 못 맞추면 실패 -> 목숨이 0일때 모든 빈칸이 채워지지 않았는가?

import random

# 단어 배열에서 아무거나 추출
words = ["book", "phone", "chair", "table", "cup", "pen", "pencil", "bag", "door", "key", "spoon"]
ran_word = random.choice(words)
len_word = len(ran_word)

mark_word = []
# 단어의 범위 만큼 언더 바 추가
for i in range(len_word):
    mark_word += "_"

print(ran_word)

life = len_word

end_of_game = False

while not end_of_game:
    # 인풋 값 받기
    input_word = input("Guess a letter: ").lower()

    # 단어 배열이랑 인풋 값이랑 비교해서 일치하면 _ 배열에 insert
    for i in range(len_word):
        if ran_word[i] == input_word:
            mark_word[i] = input_word
    
    print(mark_word)

    if mark_word.count("_") == 0 :
        end_of_game = True
        print("You Win")

디버깅하며 코딩을 진행해서 진행 상황이 많이 스킵된 느낌이 있는데, 로직을 완성했다.

while 반복 문을 이용해서 input 값을 받고 게임을 진행하는 로직을 "_" 값이 없을 때 까지 진행하게 했고, "_" 값이 없으면 특정 변수를 True 값으로 바꾸어 while 반복 문의 조건을 False로 만들어 주었다.
그리고 Right 출력문을 바꾸어 단어 배열의 원소 값과 인풋 값을 비교해 일치하다면 "_" 가 담겨있는 배열에 넣어 주었다.

 

아쉬운 점 : 
함수를 생성해 좀더 명확히 작성 할 수 있었을 텐데 아쉽고 len(배열) 을 그냥 배열 값만 넣어도 되는 점을 간과하고 있었다.
완벽히 내 힘으로 로직을 구현한 게 아니라 아쉽다.

range(배열) 하여도 배열의 길이가 나온다 range(ran_word) 해도 해당 배열이 가지고 있는 길이가 나옴

반응형