파이썬복습의 마지막이자 지난번 과제에서 가장 어려웠던 과제인 단어맞추기 게임이다. 방법은 동일하게 주어진 기회 안에 알파벳을 입력해서 단어의 빈칸을 채워나가는 것이다. 이번에는 기본적인 작동 외에도 한글을 입력할 경우 다시 입력하라는 메시지를 출력하려고 한다.(지난번에는 입력한 문자의 판별을 위해서 isalpha()를 사용했기때문에 영어와 한글을 구별할 수 없었다.)
제일 먼저 정답이 될 단어의 목록을 입력하고 해당 목록에서 무작위 단어를 추출할 수 있도록 random을 import해준다. 그리고 이 함수를 Hangman이라는 이름으로 작성해보자.
import random
index = []
def Hangman(index):
지난번과 마찬가지로 길이가 너무 길어지기 때문에 index안의 내용물은 지워두었다.
def Hangman(index):
correct = list(random.choice(index).upper())
input_correct = list('-'*len(correct))
print(correct)
chance = 9
print(f'현재 남은 기회 : {chance}')
index에서 정답이 될 단어를 무작위로 추출한 뒤에 그것을 리스트로 변환 시킨다. print(correct)부분은 함수의 작동을 확인하기 위해서 임시로 넣었으며 완성이 된다면 삭제할 예정이다. 그리고 기회를 9번으로 설정하고 입력받은 단어를 사용자에게 표시해줄 input_correct리스트를 작성해준다.
다음으로 input()을 이용해서 사용자에게 알파벳을 입력받는다. 이때 조건을 생각해보자.
1. 입력한 문자의 길이는 반드시 1이어야한다.
2. 숫자, 한글, 특수문자가 아니라 오직 알파벳만 입력 받아야한다.
3. 입력한 문자가 소문자라면 대문자로 변환한다.
4. 입력한 문자가 이미 입력된 단어라면 다시 입력을 받는다.
5. 입력한 문자가 correct 안에 있는 단어라면 input_correct에 해당 단어를 표시해주고 아니라면 기회를 1개 차감한다.
while True:
enter = input('A-Z 중 하나를 입력해주세요\n')
if len(enter) == 1:
print('한글자에용')
else:
print("문자를 하나만 입력해야 합니다. 다시 시도하세요.")
반복문을 이용해서 순서대로 조건들을 작성한다. 가장 먼저 1번 조건에 따라서 입력한 문자가 1글자가 아니라면 다시 입력받도록 한다.
while True:
enter = input('A-Z 중 하나를 입력해주세요.\n')
if len(enter) == 1:
if ('a' <= enter <= 'z') or ('A' <= enter <= 'Z'):
print('영어에용')
else:
print('A-Z 중 하나를 입력해야합니다. 다시시도하세요.')
else:
print("문자를 하나만 입력해야 합니다. 다시 시도하세요.")
위의 조건문에서 입력한 단어인 enter의 길이가 1일때 새로운 조건문을 통해서 enter가 알파벳의 범위 안에 포함되는지 여부를 확인한다. enter가 영어라면 다음 조건으로 넘어가고 아니라면 다시시도하라는 메시지를 출력한다.
while True:
enter = input('A-Z 중 하나를 입력해주세요.\n')
if len(enter) == 1:
if ('a' <= enter <= 'z') or ('A' <= enter <= 'Z'):
if enter.islower():
enter = enter.upper()
else:
print('A-Z 중 하나를 입력해야합니다. 다시시도하세요.')
else:
print("문자를 하나만 입력해야 합니다. 다시 시도하세요.")
이번조건은 비교적 간단하다. enter가 소문자일 경우 대문자로 변환해준 후에 다음 조건으로 넘어가면 된다.
이제 사용자가 입력한 문자 enter에는 A-Z사이의 문자 하나가 저장되었다. 이번에는 입력한 문자가 기입력되었는지 확인하는 과정만 거치면 올바른 문자가 enter에 입력되게 된다.
inputed_enter = ['K']
while True:
enter = input('A-Z 중 하나를 입력해주세요.\n')
if len(enter) == 1:
if ('a' <= enter <= 'z') or ('A' <= enter <= 'Z'):
if enter.islower():
enter = enter.upper()
if enter not in inputed_enter:
inputed_enter.append(enter)
break
else:
print('이미 입력된 문자입니다. 다시 시도하세요.')
else:
print('A-Z 중 하나를 입력해야합니다. 다시 시도하세요.')
else:
print("문자를 하나만 입력해야 합니다. 다시 시도하세요.")
기입력 단어를 저장할 inputed_enter 리스트를 생성한 후 확인을 위해서 무작위 대문자를 입력했다. 이미 입력된 문자라면 다시 입력을 받고 아니라면 inputed_enter에 새롭게 저장을 하고 반복문을 종료하게 된다.
마지막으로 5번 조건대로 해당 문자가 correct 에 있는지 없는지 확인 한 후, 있을 경우 input_correc에 표시를 해주면 된다.
처음에는 위에 작성한 조건문의 안에 해당 조건을 추가로 작성을 해서 반복문을 하나로 만드려고 했는데 작성을 하다보니 해당 부분을 분리해서 만드는 것이 더 코드를 이해하기 쉬울 것 같다는 생각이 들었다. enter가 correct안에 있는지 확인하는 과정이 생각보다 기 때문에 1. 입력한 문자가 올바른지 확인하는 과정 2. 올바른 문자를 받아서 조건에 맞는지 확인하는 과정으로 나누는 것이 더 직관적일 것이다.
if enter in correct:
print('있어용')
else:
chance -= 1
print('정답에 포함된 알파벳이 아닙니다. 기회가 1 차감됩니다.')
새로운 조건문을 하나 작성했다. enter가 correct안에 없을 경우 chance를 1 차감하고 있을 경우에는 추가적으로 조건을 작성할 예정이다.
if enter in correct:
location = [i for i, x in enumerate(correct) if x == enter]
print(location)
else:
chance -= 1
print('정답에 포함된 알파벳이 아닙니다. 기회가 1 차감됩니다.')
반복문을 통해서 correct에서 enter와 일치하는 값의 모든 인덱스값을 location이라는 새로운 리스트에 저장하도록 했다. 이제 해당 리스트의 값과 일치하는 위치에 있는 inputed_enter의 자리에 enter를 입력해주면 된다.
if enter in correct:
location = [i for i, x in enumerate(correct) if x == enter]
for l in location:
input_correct[l] = enter
else:
chance -= 1
print('정답에 포함된 알파벳이 아닙니다. 기회가 1 차감됩니다.')
print(input_correct)
이제 모든 조건이 충족되었다. 이제 작성한 반복문과 조건문을 모두 새로운 반복문에 넣어서 작성한 구문이 계속 반복되도록 한다.
while True:
print(f'현재 남은 기회 : {chance}')
while True:
enter = input('A-Z 중 하나를 입력해주세요.\n')
if len(enter) == 1:
if ('a' <= enter <= 'z') or ('A' <= enter <= 'Z'):
if enter.islower():
enter = enter.upper()
if enter not in inputed_enter:
inputed_enter.append(enter)
break
else:
print('이미 입력된 문자입니다. 다시 시도하세요.\n')
else:
print('A-Z 중 하나를 입력해야합니다. 다시 시도하세요.\n')
else:
print("문자를 하나만 입력해야 합니다. 다시 시도하세요.\n")
if enter in correct:
location = [i for i, x in enumerate(correct) if x == enter]
for l in location:
input_correct[l] = enter
else:
chance -= 1
print('정답에 포함된 알파벳이 아닙니다. 기회가 1 차감됩니다.\n')
print(input_correct)
마지막으로 반복문의 종료조건만 설정하면 된다. 정답을 맞췄거나 기회를 모두 소진하면 return를 통해서 함수의 시행을 종료하도록 하자.
if chance == 0:
return print(f'실패! 정답은 {''.join(correct)}였습니다.')
if input_correct == correct:
return print(f'정답입니다! {''.join(correct)}')
import random
index = []
def Hangman(index):
correct = list(random.choice(index).upper())
input_correct = list('-'*len(correct))
inputed_enter = []
chance = 9
while True:
print(f'현재 남은 기회 : {chance}')
while True:
enter = input('A-Z 중 하나를 입력해주세요.\n')
if len(enter) == 1:
if ('a' <= enter <= 'z') or ('A' <= enter <= 'Z'):
if enter.islower():
enter = enter.upper()
if enter not in inputed_enter:
inputed_enter.append(enter)
break
else:
print('이미 입력된 문자입니다. 다시 시도하세요.\n')
else:
print('A-Z 중 하나를 입력해야합니다. 다시 시도하세요.\n')
else:
print("문자를 하나만 입력해야 합니다. 다시 시도하세요.\n")
if enter in correct:
location = [i for i, x in enumerate(correct) if x == enter]
for l in location:
input_correct[l] = enter
else:
chance -= 1
print('정답에 포함된 알파벳이 아닙니다. 기회가 1 차감됩니다.\n')
print(input_correct)
if chance == 0:
return print(f'실패! 정답은 {''.join(correct)}였습니다.')
if input_correct == correct:
return print(f'정답입니다! {''.join(correct)}')
Hangman(index)
import random
index = []
Correct = random.choice(index)
Correct = Correct.upper()
Correct_list = list(Correct)
Chance = 9
print(f'현재 남은 기회 : {Chance}\n')
L = len(Correct)
Entered = []
n = 0
Enter = list('_'*L)
END = ''.join(Enter)
positions = []
print('_'*L)
while (END != Correct) and (Chance > 0):
while True:
Answer = input('A - Z중 하나를 입력해주세요.\n')
if len(Answer) == 1:
Answer = Answer.upper()
break
else:
print("문자를 하나만 입력해야 합니다. 다시 시도하세요.")
while True:
if Answer.isalpha():
break
else:
Answer = input('올바른 글자가 아닙니다. A - Z중 하나를 다시 입력해주세요.\n')
Answer = Answer.upper()
while True:
if Answer in Entered:
Answer = input('이미 입력한 단어입니다. A - Z중 하나를 다시 입력해주세요.\n')
Answer = Answer.upper()
else:
Entered.append(Answer)
break
if Answer in Correct_list:
positions = [index for index, value in enumerate(Correct_list) if value == Answer]
for n in positions:
Enter[n] = Answer
END = ''.join(Enter)
print(f'{END}\n'
f'현재 남은 기회 : {Chance}\n')
else:
print(f'{END}\n'
f'정답에 포함된 알파벳이 아닙니다. 기회가 1차감 됩니다.'
f'현재 남은 기회 : {Chance}\n')
Chance -= 1
if Chance == 0:
print(f'실패! 정답은 {Correct}였습니다.')
else:
print('정답입니다!')
https://youtharchive.tistory.com/11
단어맞추기 게임
이번 캠프에서 맞은 세번째 과제, 임의의 영어단어를 사용자가 추측해서 일정 횟수안에 맞추는 게임이다. 가장 먼저할 것은 당연히 랜덤한 단어를 생성하는 것인데 정말 무작위로 단어를 생성
youtharchive.tistory.com
지난번에 작성했던 코드는 위와 같았다.
지난번 코드를 다시 보면서 느낀건데 내가 작성했지만 이해하기가 좀 힘들었다. 변수 명을 규칙성없이 지은 것이 원인이라고 생각한다. 그 외에도 지난번에는 조건을 전부 파악하기 힘들어서 조건문을 각각 분절했는데 이번에는 최대한 합칠 수 있는 부분은 합쳐서 작성해보았다.
저번에는 거의 3-4시간 가까이 작업을 해서 겨우 완성을 했던것같은데 이번에는 작성하는데 한시간정도밖에 걸리지 않았다. 내가 의식하지 못하고 있었지만 그래도 조금씩 실력이 늘고 있는 것이 느껴졌다.
'내일배움캠프' 카테고리의 다른 글
웹개발 종합 - 자바스크립트 (0) | 2024.06.21 |
---|---|
아티클스터디 - 웹 개발을 위해 Python을 배우는 것의 장점은? (1) | 2024.06.20 |
Lv2. 스파르타 자판기 - 복습 (0) | 2024.06.18 |
Lv1. 랜덤 닉네임 생성기 - 복습 (0) | 2024.06.17 |
AI 개발자 JD 분석 (0) | 2024.06.13 |