이번은 랜덤으로 선택되는 단어를 맞추는 게임. 일명 Hangman 게임이라고 불리는 게임이다.
먼저 이번과제의 요구사항을 확인해보자.
위의 요구사항을 토대로 과제를 해결해보자.
먼저 랜덤으로 선택될 단어의 리스트를 작성해둔다. 그건 너무 길어서 생략하겠다 ..
그리고 랜덤 단어를 선택하는 함수를 작성하였다.
import random
randomWord = ["airplane", "apple", "arm", "bakery", ..... ]
# 랜덤 단어를 선택하는 함수
def choiceRandomWord(randomWord):
randomWord = random.choice(randomWord)
print('선택된 단어 : {}'.format(randomWord))
return randomWord, len(randomWord)
# 함수 실행
randomWord , randonWordLen = choiceRandomWord(randomWord)
앞의 과제에서 활용했던 random 모듈의 choice()함수를 사용하여 randomWord 리스트의 단어 중 한가지를 랜덤으로 선택하는 함수를 작성하였다. 그리고 함수를 실행하면 랜덤으로 선택한 단어와 그 단어의 길이를 반환해주도록 작성을 했다.
랜덤으로 선택한 단어에 대한 길이 값을 이용하여 그 길이 만큼의 리스트를 생성해주었다. 리스트를 생성할 때는 range()함수를 이용하여 리스트를 생성했다.
guessWord = list(range(0, randomWordLen))
randomWordLen의 값이 만약 7이라면 guessWord 변수에는 [0,1,2,3,4,5,6] 이라는 값을 가진 리스트가 저장되게 될 것이다.
일단 사용자에게 주어진 기회는 총 9번의 기회가 있기 때문에 단어맞추는 과정을 9번 반복해야한다. 이때 반복문을 사용하면 되는데, 여기서 반복문은 다른 리스트의 요소를 반복해서 처리하는 것이 아닌 9번의 횟수가 주어진 반복을 해야한다.
그렇기때문에 나는 while 문을 사용하여 반복 처리를 하였다.
while문은 for문과 동일한 반복문이다. while문은 반복문의 조건이 참일 때 반복을 진행하는 반복문이다. 사용법을 간단히 살펴보고 넘어가겠다.
while 조건 입력:
반복될 코드 작성
이렇게 보면 이해가 안될테니 해당 과제에서 요구하는 요구사항을 토대로 간단히 사용하는 방법을 작성해보겠다.
guessCount = 9
while guessCount > 0:
# 단어 입력받기
# 단어 일치 여부 확인
if 단어가 일치할 때 :
일치 처리
else:
guessCount -= 1 # 맞출수 있는 기회 감소
간단히 작성을 해보았는데, 위의 코드를 보면 알 수 있듯이 사용자가 단어에 포함되지 않은 알파벳을 입력할 경우 guessCount를 1 감소시킨다. 단어를 계속 틀려 guessCount가 0이 되면 반복 조건인 guessCount > 0 조건을 만족시키지 못하기 때문에 반복문은 종료가 된다.
이렇게 while문과 guessCount라는 변수 값을 사용하여 while문을 작성하고 그 안에 사용자에게 단어를 받는 부분에 대한 코드를 아래와 같이 작성하였다.
guessCount = 9 # 목숨 카운트
while guessCount > 0:
while True:
inputAlphabet = input('알파벳을 하나 선택해주세요 : ')
if len(inputAlphabet) == 1 and inputAlphabet.isalpha():
break
else:
print('한 글자의 알파벳만 입력해주세요.')
입력 부분 코드 아래의 조건문 코드는 알파벳을 한글자 이상 입력했을 때 다시 입력을 받는 코드이다.
위의 과정을 통해 사용자에게 입력받은 단어를 inputAlphabet 라는 변수에 저장을 해두었다. 이제 이값이 랜덤으로 선정된 단어에 포함이 되는지를 판단해야한다.
나는 일치여부를 판단하고 일치 / 불일치에 대한 처리를 아래의 순서대로 코드를 작성했다.
위와 같은 과정으로 처리를 했는데, 이걸 코드로 작성하면 아래와 같다.
# searchValue: 입력한 글자가 랜덤 단어에 있을 시 True 처리
searchValue = False
for i, alphabet in enumerate(randomWord):
# 입력한 단어와 랜덤 단어 글자 비교
if inputAlphabet == alphabet:
searchValue = True
guessWord[i] = alphabet
# 입력한 단어가 랜덤 단어에 포함되지 않을 때 목숨 감소
if searchValue == False:
guessCount -= 1
print('입력한 단어가 없습니다. \n>> 남은 목숨 : {}'.format(guessCount))
if guessCount == 0:
print('단어 맞추기를 실패하셨습니다.\n>> 정답은 \"{}\" 입니다'.format(randomWord))
다음은 현재까지 사용자가 맞춘 단어 현황을 출력하도록 해보겠다.
위의 과정을 통해 사용자가 맞춘 알파벳의 위치에 맞게 guessWord 리스트에 문자가 치환되도록 처리를 했다.
그렇다면 현재 guessWord 리스트 변수의 상태는 정수형 값과 문자형 값이 같이 저장되어있는 상태일 것 이다. ex) "bank"라는 문자를 맞추는 과정에서 사용자가 'n'을 입력했을 때, guessWord의 값은 n의 자리값인 2번 인덱스가 갱신된 형태로 저장되어 있을 것이다. -> [0, 1, 'n', 3]
이렇게 저장되어 있는 리스트를 하나의 단어로 조합하여 사용자에게 보여주어야 하는데, 숫자는 '_'라는 문자로 변환하여 보여주도록 처리를 해보려 한다.
리스트를 문자열 형태로 바꿔주기 위해 join()함수를 사용해보겠다.
리스트 값을 하나의 문자열로 합쳐주는 함수이다.
'구분자'.join(리스트)
위의 형태로 사용하면 되는데 구분자에는 리스트들을 문자열을 합칠때 리스트 요소요소 사이에 들어갈 구분자에 대한 문자를 작성하면 된다.
phoneList = ['010', '1234', '5678']
phoneNumber = '-'.join(phoneList)
print(phoneNumber) # 출력값 : 010-1234-5678
guessWord = [0, 1, 'n', 3]
guessWord = ''.join(guessWord)
print(guessWord) # 출력값 : 01n3
위의 join()를 참고하여 아래와 같이 코드를 작성하였다.
# 현재까지 맞춘 단어 출력처리
word = ''.join('_' if isinstance(s, int) else str(s) for s in guessWord)
print('>> 현재 맞춘 글자 : {}'.format(word))
guessWord의 리스트 변수를 반복돌면서 정수형 값이면 '_'라는 문자로 치환하고, 문자형이면 그대로 두고 리스트를 하나의 문자열로 join하여 word라는 변수에 담는 과정이다.
유저가 맞춘 값을 저장하는 guessWord가 랜덤으로 선택된 단어와 일치하면 게임을 종료하는 코드를 작성하여 게임 종료까지 처리를 해주었다.
# guessWord의 모든 값을 문자열로 치환해서 비교 후 일치하면 게임 종료
if ''.join(str(s) for s in guessWord) == randomWord:
print('>> 정답 : {}'.format(''.join(str(s) for s in guessWord)))
print('단어를 모두 맞추었습니다. 게임을 종료합니다.')
guessCount = 0
내가 작성한 전체코드는 아래와 같다.
import random
randomWord = [
"airplane",
"apple",
"arm",
"bakery",
"banana",
"bank",
.... # 여기에 단어 더 추가 해서 사용
]
# 랜덤 단어를 선택하는 함수
def choiceRandomWord(randomWord):
randomWord = random.choice(randomWord)
print('단어 자릿수: {}'.format(len(randomWord)))
return randomWord, len(randomWord)
# 단어 유추 함수
def guessWord(randomWord, randomWordLen):
guessWord = list(range(0, randomWordLen))
guessCount = 9 # 목숨 카운트
while guessCount > 0:
while True:
inputAlphabet = input('알파벳을 하나 선택해주세요 : ')
# exit 입력 시 종료 / 한글자 이상 입력 시 재 입력하도록 처리
if inputAlphabet == 'exit':
guessCount = 0
break
elif len(inputAlphabet) == 1 and inputAlphabet.isalpha():
break
else:
print('한 글자의 알파벳만 입력해주세요.')
# searchValue: 입력한 글자가 랜덤 단어에 있을 시 True 처리
searchValue = False
for i, alphabet in enumerate(randomWord):
# 입력한 단어와 랜덤 단어 글자 비교
if inputAlphabet == alphabet:
searchValue = True
guessWord[i] = alphabet
# 입력한 단어가 랜덤 단어에 포함되지 않을 때 목숨 감소
if searchValue == False:
guessCount -= 1
print('입력한 단어가 없습니다. \n>> 남은 목숨 : {}'.format(guessCount))
if guessCount == 0:
print('단어 맞추기를 실패하셨습니다.\n>> 정답은 \"{}\" 입니다'.format(randomWord))
# 현재까지 맞춘 단어 출력처리
word = ''.join('_' if isinstance(s, int) else str(s) for s in guessWord)
print('>> 현재 맞춘 글자 : {}'.format(word))
# guessWord의 모든 값을 문자열로 치환해서 비교 후 일치하면 게임 종료
if ''.join(str(s) for s in guessWord) == randomWord:
print('>> 정답 : {}'.format(''.join(str(s) for s in guessWord)))
print('단어를 모두 맞추었습니다. 게임을 종료합니다.')
guessCount = 0
randomWord , randonWordLen = choiceRandomWord(randomWord)
guessWord(randomWord, randonWordLen)
실행을 하면 아래와 같이 실행되는 것을 확인 해 볼 수 있을 것이다.

저번보다 조건이 조금더 복잡했던 문제였던 것 같다. 처음 무작정 코드부터 작성하려고 보니 좀 막막해서 노트를 펴고 순서도 처럼 처리 로직에 대해서 작성해보니 어느정도 갈피가 잡혔던 것 같다. 역시 ,, 코드 작성 전에 먼저 로직에 대해서 정리하는 시간은 무조건 필요한 것 같다 ㅠ
다음에 시간이 난다면 이 과제를 다른 언어로 풀어보는 시간을 가져도 재밌을 것 같다. 웬지 파이썬으로 작성해서 살짝 쉽게 푼 기분..