인프런 커뮤니티 질문&답변

김한울님의 프로필 이미지
김한울

작성한 질문수

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

행맨 게임에서 중복 값 처리

해결된 질문

작성

·

582

1

안녕하세요!

섹션 4까지 수강해보고 자신감이 생겨, 참고 자료를 찾아보지 않고 스스로 행맨 게임을 만들어봤는데요,

예를 들어 "apple"이 정답이고 "p"를 입력받았을 때, 2번째 글자는 인식하는데 3번째 글자는 인식하지 않네요.

구조를 크게 뜯어고치지 않고 해결할 수 있는 방법은 없을까요?

print("The whole answer always use the lower cases.")
print()

answer = "aple" # "apple"로 설정했을 때 오류가 나는 부분.
chance = 1
chanceLimit = 10 # 기회는 10번까지.
answerHint = [] # 힌트를 표시하기 위해 리스트를 생성한다.

for var in range(0, len(answer)): # 정답 길이만큼 밑줄 생성.
    answerHint.append("_")

while chance <= chanceLimit:
    print("Hint: ", end="") # 힌트 표시.
    for var in range(0, len(answerHint)):
        print(answerHint[var], end=" ")

    print()
    print()

    userInput = input("{:02d}/{} try: ".format(chance, chanceLimit))
    print()

    if len(userInput) != 1 or userInput.isalpha() == False: # 반드시 알파벳 한 글자만 입력받도록 하자.
        print("Please type the single alphabet!")
        print()
    elif userInput in list(answer) and "".join(answerHint) != answer: # 알파벳을 하나 찾은 경우. 중복된 글자를 처리할 수 없다.
        answerHint[answer.index(userInput)] = userInput # "".join(answerHint) 대신 str(answerHint)로는 형 변환이 이루어지지 않았다.
        print("You got one!")
        print()
        chance += 1
    elif userInput not in list(answer): # 틀렸을 경우.
        print("Not in the answer!")
        print()
        chance += 1
    else:
        print("Error occured.")
        print()
        exitBlocker = input("Press enter to exit.")

    if "".join(answerHint) == answer: # 모든 정답을 찾은 경우 반복문 해제!
        break

if "".join(answerHint) == answer: # 정답!
    print("You won! The answer is {}.".format(answer))
    print()
    exitBlocker = input("Press enter to exit.")
else: # 게임 오버!
    print("You lost. GAME OVER!")
    print()
    exitBlocker = input("Press enter to exit.")

답변 7

3

index 함수는 일치하는 것 중 가장 앞에 있는 index를 반환합니다. 그래서 "p"를 입력했을 때 "apple"에서 "_ p _ _ _" 가 됩니다.

구조를 크게 뜯어고치지 않는걸 원하셨으니, 최선의 방법인지는 잘 모르겠으나 간단하게 answer를 순회하며 사용자가 입력한 글자와 일치하는 부분을 모두 변경하는 방법을 생각했습니다.

answerHint[answer.index(userInput)] = userInput

이 부분을

for idx, val in enumerate(answer):
    if val == userInput:
        answerHint[idx] = userInput

이렇게 수정하시면 됩니다.

간략하게 코드 설명을 드리자면, answer을 enumeration 하면서 userInput과 일치하는 부분의 index(idx)를 이용해 answerHint의 값을 변경해줍니다.

1

김한울님의 프로필 이미지
김한울
질문자

많이 배웠습니다. 답변 주셔서 감사합니다!

1

오 이런방법이 있군요!

1

answerHint[answer.index(userInput)] = userInput

이 부분때문에 중복입력이 안됩니다.

이 부분을 해결하시면 중복 입력이 가능합니다.

answerHint.insert(answer.index(userInput), userInput)
answerHint.append(userInput)

구조를 크게 뜯지 않으려고 제가 위 코드처럼 여러가지 해봤지만, 언더바(_)이 부분때문에 안 끝나네요.

김한울님 블로그에 올린 댓글을 보았습니다.

여러가지 단어 목록 무작위 출제 이 기능을 사용하시려면 코드 수정이 좀 있어야 합니다.

answer부분을 현재 String형으로 되어있지만, 여러 단어 무작위를 하려고하면 list형으로 변경해야합니다.

그렇게 되면 if문 작성한 조건 부분도 변경되겠죠?

.

코드를 계속 보고있지만, 복잡한 부분이 있네요......

for var in range(0, len(answer)): # 정답 길이만큼 밑줄 생성.
    answerHint.append("_")

# 이것도 좋은 방법이지만, 저는 비추입니다.

언더바(_)를 표시하는건 while문 안에 if-else구문에 추가하시면 더 간단하게 됩니다.

---------------------------------------------------------------------------

도움이 되었으면 우측하단 또는 좌측하단에 하트 한번만 눌러주세요 :)

또한, 해결이 안된 경우 답글 작성 부탁드립니다!

0

김한울님의 프로필 이미지
김한울
질문자

아마 저 부분이 문제있지 싶어 표시한 건데 잘 모르겠네요.

0

김한울님의 프로필 이미지
김한울
질문자

aple를 apple로 바꿔놓고 실행해보면, p를 입력했을 때 원하는 결과가 나오지 않아요.

0

중복된 글자를 처리할 수 없다. 주석으로 작성이 되어있는데 이부분의 코드는 어디있나요?

아무리 찾아봐도 안보이네요....

김한울님의 프로필 이미지
김한울

작성한 질문수

질문하기