일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 웹페이지
- phython
- API플랫폼
- 최저가
- 게임
- HTML
- class
- Endpoint
- 오류
- 파싱
- 상태코드
- 계산기
- 부트스트랩
- Tequila
- ndarray
- 프로그램
- Game
- 유데미
- 쉬티
- udemy
- SMTP
- HTTP
- 파이썬
- 웹크롤링
- Pygame
- 프로젝트
- Sheety
- twilio
- API
- Python
- Today
- Total
데이터 분석가
파이썬(Python) 프로젝트(행맨 게임) 본문
안녕하세요 ~
제가 그린 그림을 보셨나요 ??
보기만 해도 손발이 바들바들 떨리게 만들지 않나요 ㅋㅋ
이번 시간에는 그동안 프로젝트를 하면서 배운 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 문을
알고 있으면 알고리즘에 대한 이해가 조금 더 쉬워질 거 같습니다.
다 같이 한번 이해하고 입력해보도록 합시다 !
'파이썬(python) 프로젝트 모음' 카테고리의 다른 글
파이썬(Python) 카이사르 암호(caesar cipher) 프로젝트 (1) | 2023.03.15 |
---|---|
파이썬(Python) 소수(Prime_number) 프로젝트 (0) | 2023.03.14 |
파이썬(Python) 프로젝트 패스워드(Password)생성 프로그램 (0) | 2023.03.02 |
파이썬(Python) 프로젝트(가위바위보) (0) | 2023.03.01 |
파이썬(Python) 프로젝트(팁 계산기) (0) | 2023.02.28 |