데이터 분석가

파이썬(Python) 프로젝트(행맨 게임) 본문

파이썬(python) 프로젝트 모음

파이썬(Python) 프로젝트(행맨 게임)

PlintAn 2023. 3. 6. 18:25

행맨 게임

 

안녕하세요 ~

 

제가 그린 그림을 보셨나요 ?? 

 

 

보기만 해도 손발이 바들바들 떨리게 만들지 않나요 ㅋㅋ

 

이번 시간에는 그동안 프로젝트를 하면서 배운 for문을 이용해서 Hang-man 게임을 만들어보겠습니다.

 

이번 게임의 포인트는 단어맞추기 게임인데,

 

단어가 맞을 경우 해당하는 자리만 공개하는 반복문입니다.

 

 

stages = ['''
  +---+
  |   |
  O   |
 /|\  |
 / \  |
      |
=========
''', '''
  +---+
  |   |
  O   |
 /|\  |
 /    |
      |
=========
''', '''
  +---+
  |   |
  O   |
 /|\  |
      |
      |
=========
''', '''
  +---+
  |   |
  O   |
 /|   |
      |
      |
=========''', '''
  +---+
  |   |
  O   |
  |   |
      |
      |
=========
''', '''
  +---+
  |   |
  O   |
      |
      |
      |
=========
''', '''
  +---+
  |   |
      |
      |
      |
      |
=========
''']

logo = ''' 
 _                                             
| |                                            
| |__   __ _ _ __   __ _ _ __ ___   __ _ _ __  
| '_ \ / _` | '_ \ / _` | '_ ` _ \ / _` | '_ \ 
| | | | (_| | | | | (_| | | | | | | (_| | | | |
|_| |_|\__,_|_| |_|\__, |_| |_| |_|\__,_|_| |_|
                    __/ |                      
                   |___/    '''

end_of_game = False

먼저 위와 같은 그림 6개를 가진 stages 리스트를 만듭니다. 여기서 그림이 6개인 이유는 

행맨 게임 특성상 한정된 기회 내에 모든 단어를 예측해야 이기는 게임이기 때문입니다.

 

lives = 6

그 다음 lives = 6 을 설정합니다.  즉 기회는 6번 주어집니다.

 

import random #랜덤 함수
from hangman_art import logo


from hangman_words import word_list #행맨 단어 모듈을 불러옵니다

chosen_word = random.choice(word_list) #hangman_words 중 choice 함수로 선택된 단어

print(f"test version, the solution is {chosen_word}.") #테스트 버전 출력

display= [] #선택된 단어가 맞으면 이 곳에 넣을 겁니다

word_length = len(chosen_word) #선택된 word_list의 글자 길이(len함수) 
for _ in range(len(chosen_word)): #_를 글자수만큼 반복
    display += "_" #선택된 단어 길이만큼 "_"을 출력
    
guess = input("Guess a letter: ").lower() #우리가 처음 입력할 글자를 소문자로 변환

for position in range(word_length): #만약 입력한 글자가 맞을경우 position 공개글자수만금 for 반복문
    letter = chosen_word[position] #선택된 단어가 각 포지션마다 letter로 저장
    
    if letter == guess: #입력한 단어가 letter와 같다면
        display[position] = letter #display 리스트에 추가된 문자를 공개

print(display) #display 출력

일단, 위 코드는 아직 완성되지 않은 중간 단계의 코드입니다.

 

설명을 조금 하자면 random 함수를 이용해 단어 리스트 중 한개를 가져와 

 

예를들어, 선택된 단어가 apple이라면 

 

for position range(chosen_word):

 

해당 코드에서 range(chosen_word)는 range(0,5)와 같은 의미를 같게 됩니다.(apple은 스펠링이 5개이니까)

이 말은 postion(0,1,2,3,4) 가 차례대로 들어가게 되고 총 5번 반복하게 됩니다.

 

5번의 차례동안 입력된 스펠링이 하나라도 같게 된다면 display[position] 인덱싱으로 해당 위치가

 

display = []에 들어가게 되고

 

마지막 print 함수로 출력하게 됩니다.

 

선택된 랜덤 단어가 apple이고 문자를 'a'를 입력했다면 한 자리 스펠링을 맞추었으니 출력값은

 

['a', '_' , '_', '_', '_' ]가 되겠네요

 

하지만 입력값과 출력값은 초기화되고 있으므로 while not문(식이 False일 때 무한반복)을 

 

이용하여 모든 스펠링을 예측할 때까지 끝나지 않도록 하고 

 

만약 while문(식이 True 값을 가질 때 중단)이 'TRUE' 값일 때 'You won' 과 같은 메시지를 출력하며

 

게임을 끝내도록 설정해 보겠습니다.

 

먼저,

 

end_of_game = False #while not 값을 이용하기 위해 False로 반복 유도

while not end_of_game: #end_of_game이 true 값이 될 때까지 반복하기 위해 이중 반복문 사용
  guess = input("Guess a letter: ").lower()  #end_of_game이 True 값이 될 때까지 스펠링 입력

  for position in range(word_length):
      letter = chosen_word[position]
      print(f"Current position: {position}\n Current letter: {letter}\n Guessed letter: {guess}")
      if letter == guess:
          display[position] = letter
          
  if guess not in chosen_word: #예측이 틀리다면
      lives -= 1  #맨 앞에 있는 lives = 6 에서 하나씩 -1합니다
      if lives == 0: #6번의 기회로 단어 예측이 실패했을 경우
          end_of_game = True #while not은 end_of_game이 true일 경우 중단됩니다.
          print("You lose.") #당신은 졌습니다.
  print(display)
  
  if "_" not in display: #for문을 이용해 예측 성공한 letter을 display에 반복해서 넣었으므로 "_"이 줄어들게 됩니다
    end_of_game = True #위 display에서 "_"이 없다면 모든 스펠링이 채워진 것이기 때문에 true 값 반환
    print("you won") #end_of_game = True일 때, while not 문은 종료하면서 출력합니다 'You won'

while not 문으로 not_of_game이 False일 때 무한반복, True 값일 때 종료. 이중 반복문을 넣습니다.

 

때문에 모든 스펠링을 예측하면 display 리스트에 채워지게 되고 반대로 "_"이 사라집니다.

 

"_"이 사라졌을 때 end_of_game = True 값을 반환하면서 while not문은 종료됩니다.

 

반대로 lives = 6 에서 예측이 틀릴 경우 -1씩 줄어들어 0이 되면 똑같이 

 

end_of_game = True를 반환하면서 while not 문이 중단되면서 "You lose"를 출력합니다.

 

사실 while not 문 보다는 while 문과 강제로 식을 중단하는 break을 많이 쓰기도 하는데 while not 문을

 

알고 있으면 알고리즘에 대한 이해가 조금 더 쉬워질 거 같습니다.

 

다 같이 한번 이해하고 입력해보도록 합시다 !

 

 

 

Comments