강의 내에서 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])
# 인풋 값 받기
처음 로직을 생각 하고나서 코드를 작성 해 보았다.
로직은
- 단어가 담겨있는 배열에서 무작위로 단어를 추출한다.
- 단어의 인덱스 값 만큼 배열의 범위를 설정해 "_" 를 입력한다. 예를 들어 test 라는 단어를 추출 했을 경우 ['_', '_', '_', '_'] 의 배열과 ['t', 'e', 's', 't'] 배열을 생성한다.
- User 의 인풋 값을 받아서 인풋 값이 있다면 ? 배열안 해당 인풋 값이 위치하는 위치에 인풋 값을 넣는다 : 목숨 한개 가 깎이며 재 입력 창을 띄운다
- 목숨이 끝날때 까지 반복한다.
- 목숨 내로 단어를 모두 맞추면 이겼다는 메시지를 출력한다. 목숨이 끝나면 게임을 종료하고 졌다는 메시지를 출력한다.
더 명확히 정리하자면 위와 같다.
처음 코드를 작성할 때 일단 해보자라는 마음으로 단어 추출, 단어의 범위 만큼 다시 배열에 담는 코드를 작성했다.
# 단어의 범위 만큼 다시 배열에 담기
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) 해도 해당 배열이 가지고 있는 길이가 나옴
'프로그래밍 > Python' 카테고리의 다른 글
Python 부트 캠프 - 커피 머신 생성 (2) | 2023.05.19 |
---|---|
Python 부트 캠프 - 계산기 만들기 (0) | 2023.04.30 |
Python 부트 캠프 - 경매 게임 만들기 (0) | 2023.04.26 |
#230411 코딩 테스트 연습 (0) | 2023.04.11 |
Python 부트캠프 - tip 계산기 만들기 (0) | 2023.02.08 |