프로젝트 실습(1)

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

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

지금까지 배운것들을 활용해서 간단한 프로젝트를 해보겠습니다.

Hangman 미니 게임 제작(1)

  • 행맨(Hangman)게임 설명
  • 소스 코드 작성
  • 프로그램 중간 테스트
  • 보완 파트 설명

출처 : https://ko.wikipedia.org/wiki/%ED%96%89%EB%A7%A8_(%EA%B2%8C%EC%9E%84)

한 번쯤은 들어본 게임이라고 생각되는데요. 저희는 그래픽은 제공되지 않고, 커맨드 라인 환경에서 개발하겠습니다. 행맨 게임은 위에처럼 여러 글자의 단어를 글자 수만 알려주고 단어를 알아맞히는 게임입니다. 간단하죠 ㅎㅎ😎

예를 들어 6글자로 시작하고 b로 시작하는 과일은??
banana입니다.

단어의 개수를 받고, 맞출 수 없다면 힌트를 눌러서 a~z까지 계속 입력해 보다가 우연히 매치되는 게 있다면 나머지 단어를 유추할 수 있습니다.

저희는 이 게임을 만드는 것도 중요하지만 지금까지 저희가 배운 내용을 정확하게 알고 있는지가 더 중요핟고 생각합니다.

기본 프로그램 제작 및 테스트

먼저 프로그램을 제작하고 행맨게임에 대해서 프로세스를 테스트해 볼 수 있는 것까지 작성을 해보겠습니다.

# 시간에 관한 처리가 있다.
import time 
# 처음 인사
# 게임을 하는 사람의 이름을 입력받기
name = input('what is your name? : ')
print('Hi, ' + name, 'Time to play hangman game!')
# 센스 있게 보이기 위해 1초를 쉰다음 스타트 로딩을 해줍시다!!
# 시간을 준다음에 출력을하면 스무스하게 다음 라인을 표시할 수가 있다.
time.sleep(1)
print('Start Loading.....')
time.sleep(0.5)
# 일단 테스트이기에 정답단어를 넣겠습니다.
# 정답 단어
# 플레이어가 맞출 단어를 만듭니다.
word = 'butterfly'
# 추측 단어
guesses = ''
# 좀더 재미있게 하기위해 단어를 맞출때 기회를 만들겠습니다.
# 기회
turns = 10

핵심 while Loop

# 찬스 카운트가 남아 있을 경우
# 처음 못맞추는 경우 10->9
while turns > 0:
    # 실패 횟수(단어 매치 수)
    failed = 0 # 만약 b를 입력하면 1이 되겠죠!
    # 정답 단어 반복 (핵심)
    for char in word:
        # 정답 단어 내에 추측 문자가 포함되어 있는 경우
        if char in guesses:
            # 추측 단어 출력
            print(char, end='')
        else:
            print('_', end=' ') # 틀린경우 _로 출력해준다.
            failed+=1
      # 단어 추측이 성공한 경우  - 모두 다 돌았는데 failed가 0인경우 9개의 단어를 모두 맞춘거기에 그때는 프로그램을 종료시켜주면 됩니다.
    if failed == 0:
       print()
       print()
       print('Congratulations! The guesses is correct.')
    # while 구문 중단
       break
    print()

추측 단어 문자 단위 입력 - 내가 입력하는 단어를 input으로 guesses 로 받기

    print()
    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.....
_ _ _ _ _ _ _ _ _  # 9글자 단어를 추측해보자, 나중에는 힌트로 만들어봅시다.
guess a charater :b
b_ _ _ _ _ _ _ _ 
guess a charater : korea
OOps! Wrong
You hane 9 more guesses! # 기회가 9번 남았습니다.
b_ _ _ er_ _ _   # 6개의 글자만 남았습니다.
guess a charater :t # 정답단어인 butterfly에서 t가 2개 있기에 모두 입력됩니다.
b_ tter_ _ _  # 이제 어느저도 유추가 되겠죠 ㅎㅎ
guess a charater :u
butter_ _ _ 
guess a charater :f 
butterf_ _ 
guess a charater :ly
butterfly
Congratulations! The guesses is correct. # 정답을 맞추면서 프로그램이 문구와 종료됩니다.

만약 10번의 기회안에 정답을 맞추지 못하면 어떻게 될까요?
아무거나 입력해보겠습니다.

what is your name? : youn
Hi, youn Time to play hangman game!
Start Loading.....
_ _ _ _ _ _ _ _ _ 
guess a charater :ad
OOps! Wrong
You hane 9 more guesses!
_ _ _ _ _ _ _ _ _
guess a charater :ad
OOps! Wrong
You hane 8 more guesses!
_ _ _ _ _ _ _ _ _
guess a charater :ad
OOps! Wrong
You hane 7 more guesses!
_ _ _ _ _ _ _ _ _
guess a charater :ad
OOps! Wrong
You hane 6 more guesses!
_ _ _ _ _ _ _ _ _
guess a charater :ad
OOps! Wrong
You hane 5 more guesses!
_ _ _ _ _ _ _ _ _
guess a charater :a
OOps! Wrong
You hane 4 more guesses!
_ _ _ _ _ _ _ _ _
guess a charater :d
OOps! Wrong
You hane 3 more guesses!
_ _ _ _ _ _ _ _ _
guess a charater :a
OOps! Wrong
You hane 2 more guesses!
_ _ _ _ _ _ _ _ _
guess a charater :ef
OOps! Wrong
You hane 1 more guesses!
_ _ _ _ e_ f_ _
guess a charater :eg
OOps! Wrong
You hane 0 more guesses!
You hangman game failed bye

잘 실행되는 걸 봐서 저희 한 코딩이 문제가 없어 보입니다.
코드 리뷰를 다시 해보겠습니다.

이름을 입력하고 추측 단어와 기회를 설정하는 부분은 쉬우니까 while 문부터 살펴보겠습니다.

# turns가 10이기에 아래로 내려갑니다.
# word(butterfly)가 9글자이기에 9번 반복됩니다.
# if char in guesses은 게임 시작할때는 공백이기에 실행 x
# else로 가서 글자수만큼 _ 입력
# for 문이 9번 실행되니까 failed는 9가 되있을겁니다. 하나도 맞추지 못한 것입니다. 단어 수가 9개인 범위내에서 failed가 9라는 거는 한 글자도 못 맞혔기 때문에 모두 밑줄인 상태
# 우리가 글자수만큼 다 맞춰가 failed가 1이 증가되지 않고 0그대로 모두 맞췄기 때문에 이때는 축하의 문구와 프로그램을 끝냅니다.
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()
# 한글자 입력도 가능하고 여러개 입력도 가능합니다. 입력된 것을 guesses에 누적시켜줍니다.
# 만약 a를 입력했는데 butterfly단어에는 포함되어있지 않습니다. 그런경우 turns-=1 한번 빼줍니다.
# 계속 실행되서 turns가 0이 되는 경우 문구와 함께 행맨 게임을 종료시킵니다.
# 아래 코드가 모두 끝나면 다시 while 구문으로 올라갑니다. 
# a를 입력하면 turn = 9가 되고 다시 for문이 9번반복됩니다.
# 만약 우리가 추측한 단어가 char에 있따면 그때는 맞는 단어를 출력해주고 아닌경우는 _로 출력해줍니다.
    print()
    guess = input('guess a charater :')
        # 단어 더하기
    guesses += guess 
    # 정답 단어에 추측한 문자가 포함되어 있지 않으면
    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')

print 문으로 guesses를 출력해 보면서 어떻게 표시되는지 확인해 보시면 이해가 더 쉬울 수 있습니다.

while turns > 0:
    # 실패 횟수(단어 매치 수)
    failed = 0
	print(guesses)
    # 정답 단어 반복 (핵심)
    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()
>>> 
### guesses가 계속 누적되는게 보입니다.!
what is your name? : youn 
Hi, youn Time to play hangman game!
Start Loading.....
_ _ _ _ _ _ _ _ _ 
guess a charater :a
OOps! Wrong
You hane 9 more guesses!
a
_ _ _ _ _ _ _ _ _
guess a charater :abc
OOps! Wrong
You hane 8 more guesses!
aabc
b_ _ _ _ _ _ _ _
guess a charater :bda
OOps! Wrong
You hane 7 more guesses!
aabcbda
b_ _ _ _ _ _ _ _
guess a charater :rbe
OOps! Wrong
You hane 6 more guesses!
aabcbdarbe
b_ _ _ er_ _ _
guess a charater :dsb
OOps! Wrong
You hane 5 more guesses!
aabcbdarbedsb
b_ _ _ er_ _ _

지금 내용을 이해 못 해도 괜찮습니다. 문법적 위주로 어떻게 작동되고 실행되는지가 더 중요하다고 생각합니다.

흐름을 제어하는 if문과 while문이 중요한 역할을 하고 있습니다.
프로그래밍에서 반복문과 조건문은 필수적으로 들어갑니다.

다음 시간에는 게임이 실행될 때마다 문제를 무작위로 낼 수 있는 부분을 추가하고 정답을 맞히고, 실패했을 경우의 효과음을 넣어보겠습니다. 프로그래밍에는 정답이 없습니다. 본인이 생각했을 때 좀 더 가독성 있는 코드로 만들 수 있다면 그게 맞습니다.
행맨 게임은 소스코드를 찾아보면 정말 방대한 코드로 구성된 것들도 많습니다.
🤠

출처 : 인프런

profile
ice blue

0개의 댓글