창작물

행맨 게임 (Hangman Game) 코드 창작

ilsancityboy 2023. 7. 7. 20:35

오늘은 Do it! 파이썬 코드 책을 읽다가 행맨 게임을 만드는 페이지를 정독했다.

생각보다 단순한 코드들로만 이루어져있었지만 아직 초보인 나로써는 매우어려웠다.

덕분에 하루종일 코드를 붙잡고 씨름을 한 결과, 책에 의존하는건 자존심이 상하니 

나만의 방식대로 행맨 게임코드를 작성했다.

먼저 필기노트에 머리를 쥐어짜 내가 할수있는 선에서 짜본 비트결과이다. 실행이 되고 안되고는 

중요하지 않았고 "어떻게 만들어야 행맨게임을 구현할 수 있을까?" 가 주된 목적이었다.

책에 나와있는 것 처럼 실제 코더들은 코드를 작성해 프로그램을 만들기 전에 구성 틀을 생각해 놓는다고 써있었다.

나도 따라서 행맨 게임을 만들기 전에 어떤 기능들을 필요로 할까? 생각해낸게 다음과 같은 결과로 나왔다.

 

코드 작성 전 생각해둔 것들.

● 랜덤으로 리스트안에 데이터들중 하나를 행맨게임 정답 단어로 설정해야 한다. (매번 게임을 킬때마다 다른 정답이 나와야만 지루하지 않기 때문이다.)

● 입력 받은 값을 1글자로 제한한다. (행맨게임은 알파벳 1개씩 맞춰나가는 것인데 입력할때 2글자 이상 입력하는 것을 방지해야하기 때문이다.)

● 입력 받은 값이 전에 입력했었던 데이터와 동일하지 않은게 맞는지 확인.

● 입력 받은 값이 정답 단어에 포함되어있는 값인지 확인. 포함되어있으면 해당 값들만 오픈, 해당 값이 단어에 없으면

목숨 -1 

● 목숨을 6개로 설정.

 

-먼저 내가 필기노트에 코드를 어떤식으로 생각하며 행맨게임을 써 내려갔는지 보자.

import random

#정답 리스트 변수 (새 게임마다 이중 하나를 랜덤으로 뽑아 정답 단어로 설정했다.)
word_list = ["apple" , "banana" , "pineapple" , "grape" , "strawberry" , "orange" , "cherry" , "watermelon"]
word = random.choice(word_list)

#플레이어가 입력했던 값들을 저장할 변수를 만들어뒀다.
guess_list = []

#목숨 
life = 6


#사용자가 맞춰서 저장한 알파벳들을 최종적으로 저장하는 변수
answer = ""

#정답을 가려서 보여줌으로써 자릿수 힌트를 주기위함.
hidden_word = len(word) * "■"
print("정답의 자릿수 : ",hidden_word)

#life가 0이 될때까지 반복
while life != 0:
    guess = input("값을 입력하시오: ")
    
    #플레이어가 입력한 값의 길이가 1이면 코드실행. 아니면 "규칙위반" 출력
    if len(guess) == 1:
    	#플레이어가 입력한 값이 전에 입력했던 값들과 동일하면 실행.
        if guess in guess_list:
            print("이미 시도한 알파벳입니다. ")
            continue
            
        #전에 입력했던 값이 아니라면 [전에 값을 입력했던 것들을 저장하는 변수]에 저장하고 실행.
        else:
            guess_list += guess
            answer += guest_list

			#최종답이 정답과 맞으면 실행
            if answer == word:
                print("정답! 답은", answer , "였습니다.")
                break
            
            #아직 답을 다 못맞췄다면 실행
            else:
                if guess in word:
                    upgrade_hidden(word,guess,hidden_word)
                    print("정답 ! 나머지도 맞춰보세요", hidden_word)
                else:
                    life = life - 1
                    print("오답. 라이프 - 1..")
	                    print("오답. 라이프 - 1..")
    else:
        print("규칙위반")
print("게임오버..")
exit()



#정답의 길이만큼 for문을 돌려서 정답의 각 알파벳들과 입력한값이 맞는지 확인하는 사용자 함수
def upgrade_hidden(word,guess,hidden_word):
    for i in len(word):
        if word[i] == guess:
            hidden_word[i] == guess

이렇게 썼었다.

 

그치만 당시엔 열심히 생각해내며 써갔지만

몇시간뒤에 내가 다시 봐도 아직 고쳐야 할 부분들이 여럿 보였으며 미숙한 부분들이 많았다.

따라서 여러번 재수정과 구글링을 통해 코드를 고쳐나갔다.

 

import random
word_list = ["yasuo","talon","katarina","darius","vex","teemo","tristana","atrox","set","fizz","trindamere","jarvan","irella"]
guess_list = []
answer = ""
life = 6
word = random.choice(word_list)
hidden_word = len(word) * "■"

#def upgrade_hidden(word,guess,hidden_word):
#   for i in len(word):
#       if word[i] == guess:
#           hidden_word[i] == guess

def upgrade_hidden(word, guess, hidden_word):
    updated_word = ""
    for i in range(len(word)):
        if word[i] == guess:
            updated_word += guess
        else:
            updated_word += hidden_word[i]
    return updated_word


print("정답의 자릿수 : ",hidden_word)
while life != 0:
    if hidden_word == word:
        print("정답! 답은", hidden_word , "였습니다.")
        break
    guess = input("값을 입력하시오: ")
    if len(guess) == 1:
        if guess in guess_list:
            print("이미 시도한 알파벳입니다. ")
            continue
        else:
            guess_list += guess

            #answer += guess_list
            answer += "".join(guess_list)
            #else:
            #   if guess in word:
            #       upgrade_hidden(word,guess,hidden_word)
            #       print("정답 ! 나머지도 맞춰보세요", updated_word)

            if guess in word:
                hidden_word = upgrade_hidden(word, guess, hidden_word)
                print("정답! 나머지도 맞춰보세요:", hidden_word)   
                    
                             
            else:
                life = life - 1
                print("오답. 라이프 - 1.. 남은 라이프: ",life)
    else:
        print("규칙위반")
print("게임오버..")
exit()

먼저 세세한 에러들을 제외하고 수정한 부분들을 보자.

 

 

            #answer += guess_list
            answer += "".join(guess_list)

문자열과 리스트를 더하려고 했을때 에러가 난다.

따라서 str.join() 함수를 사용해 리스트를 문자열로 바꾸어주고 더해주었다.

 

 

 

#def upgrade_hidden(word,guess,hidden_word):
#   for i in len(word):
#       if word[i] == guess:
#           hidden_word[i] == guess

def upgrade_hidden(word, guess, hidden_word):
    updated_word = ""
    for i in range(len(word)):
        if word[i] == guess:
            updated_word += guess
        else:
            updated_word += hidden_word[i]
    return updated_word

1. 사용자 함수 부분 for부분에서 range()로 범위를 설정하지 않았음.

 

2. hidden_word[i] == guess에서 == 비교 연산자를 사용했던 부분을

+= 연산자를 사용하여 updated_word에 문자를 추가하는 방식으로 수정했다.

문자열은 불변 객체이므로 개별 문자에 직접 할당할 수 없다.

 

3.hidden_word[i] 대신 updated_word[i]를 사용하여 

hidden_word의 해당 위치의 문자를 updated_word에 추가하도록 수정했다.

 

4.hidden_word[i] 자체를 updated_word에 추가하도록 수정했다.

이렇게 함으로써 hidden_word의 문자열을 그대로 유지하면서,

guess와 일치하는 위치에 있는 문자만 updated_word에 추가할 수 있게 되었다.

 

5.updated_word를 반환하여 upgrade_hidden() 함수가 업데이트된 문자열을 반환하도록 수정했다.

 

6.함수를 호출하는 코드보다 전에 사용자 함수를 정의해야만 함수를 호출할 수 있어 메인코드 위로 사용자함수를 옮겼다.