프로젝트 실습(2)

윤태영·2023년 12월 5일
0
post-thumbnail

이미지 출처: https://wikidocs.net/192339

저번 시간에 만들었던 Hangman 소스코드에다가 저장장치에 있는 소리를 재생할 수 있는 기능을 넣어 보고, 저번 시간에 정답단어인 butterfly를 fix 해서 문제를 변경할 경우 계속 수정하는 불편함이 있습니다. 외부 파일에서 문제를 불러서 배운 오픈할 수를 이용하고, 힌트까지 추가해서 최종 프로그램을 테스트해 보겠습니다.

Hangman 미니 게임 제작(2)

  • Winsound 설명
  • 무작위 단어 선택 추가
  • 단어 힌트 추가
  • 사운드 추가하기
  • 최종 프로그램 테스트
  • 공부하면 좋은 파트 추천

저번에 말씀드린 resource라는 폴더에 word_list.csv 파일을 만들었습니다.
문제 정답과 힌트입니다.
문제가 만약 나온다면 힌트는 과일이 되고 5글자이다, 정답은 grape가 되겠죠?
힌트로 자동차가 나오고 5글자로 구성된 단어이다. 이런 식으로도 가능합니다.
아래 문제들이 랜덤으로 나오게 만들어보겠습니다.

Name,Hint
strawberry,fruit
grape,fruit
melon,fruit
orange,fruit
wagon,type of vehicle
van,type of vehicle
sedan,type of vehicle

sound 폴더에는 두 개의 wav파일이 있습니다.
문제를 최종적으로 정답을 맞혔을 경우 딩동 소리가 나오게 되고
열 번의 기회를 다 쓰고 게임 풀이에 실패 했을 때 경고음 소리가 나오게 만들겁니다.

good.wav
bad.wav

저번시간에 만든 코드에 word_list.csv와 사운드를 재생하는 부분만 추가하면 됩니다.

먼저 word_list.csv를 문제로 가져오는 코딩을 해보겠습니다.

# 시간에 관한 처리가 있다.
import time 
# csv 처리
import csv
# 랜덤
import random
# 사운드 처리
import winsound
# CSV 단어 리스트
words = []
with open('./resource/word_list.csv', 'r') as f:
    reader = csv.reader(f)
    # Header Skip(Name, Hint 부분은 필요없기에 skip)
    next(reader)
    for c in reader:
        words.append(c) # words에 word_list.csv있는 내용들이 리스트르 들어갑니다. words에서 하나를 랜덤으로 뽑아서 정답단어 word에 넣어주면 되겠죠?
# 리스트 섞기
random.shuffle(words)
# 랜덤으로 아무거나 하나를 뽑아온다.
q = random.choice(words)
print(q)
>>> ['melon', 'fruit']
>>> ['van', 'type of vehicle']

여기서 word를 설정하기 전에 한번 출력해 보겠습니다.
위와 같이 리스트로 출력되며 0번째 인덱스가 정답단어이고 1번째가 힌트입니다.
이제 정답단어를 설정해줍시다.

# 정답단어
# q의 0번째 인덱스 값을 가져오고 공백을 지워줍니다. 
# 실행시켜보면 문제가 랜덤으로 출제되는게 보이실겁니다.
word = q[0].strip()

이제는 csv 파일에서 힌트를 표시해 주는 걸 넣어보겠습니다.
힌트는 우리가 정답을 입력하는 부분의 위에다 코드를 작성해 주면 되겠죠.

 # 추측 단어 문자 단위 입력 - 내가 입력하는 단어를 input으로 guesses 로 받기
print()
print('Hint : {}'.format(q[1].strip()))
    guess = input('guess a charater :')

그러면 다시 코드를 실행해보겠습니다.

import time 
import csv
import random
import winsound
name = input('what is your name? : ')
print('Hi, ' + name, 'Time to play hangman game!')
print()
time.sleep(1)
print('Start Loading.....') #수가 있다.
print()
time.sleep(0.5)
words = []
# 문제 Csv 파일 로드
with open('./resource/word_list.csv', 'r') as f:
    reader = csv.reader(f)
    # Header Skip
    next(reader)
    for c in reader:
        words.append(c)
# 리스트 섞기
random.shuffle(words)
q = random.choice(words)
# 정답 단어
word = q[0].strip() # 양쪽 공백제거# 추측 단어
guesses = ''
# 기회
turns = 10
# 핵심 while Loop
# 찬스 카운트가 남아 있을 경우
while turns > 0:
    # 실패 횟수(단어 매치 수)
    failed = 0
	# 정답 단어 반복 (핵심)
    for char in word:
        # 정답 단어 내에 추측 문자가 포함되어 있는 경우
        if char in guesses:
            # 추측 단어 출력
            print(char, end='')
        else:
            print('_', end=' ')
            failed+=1
        # 단어 추측이 성공한 경우  - 모두 다 돌았는데 failed가 0인경우
    if failed == 0:
        print()
        print()
        print('Congratulations! The guesses is correct.')
    # while 구문 중단
        break
    print()
	# 추측 단어 문자 단위 입력 - 내가 입력하는 단어를 input으로 guesses 로 받기
    print()
    print('Hint : {}'.format(q[1].strip()))
	guess = input('guess a charater :')
	# 단어 더하기
    guesses += guess # 만약에 위 guess에서 a를 입력하면 guesses는 기억하고 있어야하기에, 입력하는 것을 누적
	# 정답 단어에 추측한 문자가 포함되어 있지 않으면
    if guess not in word:
        # 기회 횟수 감소
        turns -=1
        # 오류 메시지
        print('OOps! Wrong')
        # 남은 기회 출력
        print('You hane', turns, 'more guesses!')
        # 열번의 기회가 끝나고 실패했을때의 문자 메시지
        if turns == 0:
            # 실패 메시지
            print('You hangman game failed bye')
>>>>
what is your name? : youn
Hi, youn Time to play hangman game!
start Loading.....
_ _ _ _ _ _ _ _ _ _ 
Hint : fruit        
guess a charater :banannaa
OOps! Wrong
You hane 9 more guesses!
_ _ _ a_ b_ _ _ _
Hint : fruit
guess a charater :efwafew
OOps! Wrong
You hane 8 more guesses!
_ _ _ awbe_ _ _
Hint : fruit
guess a charater :str
strawberr_ 
Hint : fruit
guess a charater :strawberry
strawberry
Congratulations! The guesses is correct.

힌트가 나오면서 풀이가 되는 걸 보실 수 있습니다.
실행할 때마다 문제와 힌트가 무작위로 나옵니다.
이제는 소리를 넣어보겠습니다.
먼저 단어 추측이 성공 한 경우에 소리를 넣어봅시다.

	if failed == 0:
        print()
        print()
        # 성공 사운드(두번째 인자로는 사운드 파일의 형식을 지정할 수 있다.)
        winsound.PlaySound('./sound/good.wav', winsound.SND_FILENAME)    
        print('Congratulations! The guesses is correct.')
    # while 구문 중단
        break
    print()

실패한 경우도 넣어봅시다.

      # 열번의 기회가 끝나고 실패했을때의 문자 메시지
      if turns == 0:
          # 실패 사운드, 두번째 인자로는 사운드 파일의 형식을 지정할 수 있다.
         winsound.PlaySound('./sound/bad.wav',winsound.SND_FILENAME)
          # 실패 메시지
         print('You hangman game failed bye')

다시 한번 코드를 실행해 보시면 분명히 정답을 맞혔을 때랑 기회를 모두 날렸을 경우 소리가 재생되는 것을 확인하실 수 있습니다.

최종적으로 완성된 코드에서 여러분이 다시 한번 코드를 바꿀 수 있습니다
예를 들어 🤔
한 문제가 아니라 두 문제를 맞혀야 성공이고, 두 문제 중의 하나라도 못 맞히면 실패라든지 코딩해서 문제를 새롭게 바꿀 수 있겠죠 ㅎㅎ

공부하면 좋은 파트 추천

  • 파이썬 고급과정, 어떤 성능을 이끌어내기 위해서 멀티 프로그래밍, 분산처리, 쓰레드 (이런 것들을 부분적으로 구글검색이나 기회가 된다면 인프런강의 준비해주신다.)
  • 빅데이터 분야, 머신러닝분야 케라스(Keras), 사이킷런(scikit-learn) 은 대단한 프레임 워크

전 세계적으로 파이썬이 많이 쓰이고 있고, 세계적으로 트랜드를 이끌어가는 프로그래밍 언어 중 하나입니다. 내가 원하는 분야를 살펴보고 필요하면 심화 과정을 공부하는 것도 좋을듯좋을 듯합니다. 😃😊

많은 분들이 말씀하시는 것 중 하나는 코드를 갖다 쓰고 만들어진 것들을 Copy & Paste만 사용하면 실력이 늘지 않는다고 하십니다. 힘들더라도 한 줄 한 줄 코드를 리뷰하고 개선하는 것도 중요하다고 생각합니다. 이 글이 파이썬 기초를 공부하시는 분들께 도움이 되었으면 좋겠습니다.

출처 : 인프런

profile
ice blue

0개의 댓글