이미지 출처: https://wikidocs.net/192339
지금까지 배운것들을 활용해서 간단한 프로젝트를 해보겠습니다.
Hangman 미니 게임 제작(1)
출처 : 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문이 중요한 역할을 하고 있습니다.
프로그래밍에서 반복문과 조건문은 필수적으로 들어갑니다.
다음 시간에는 게임이 실행될 때마다 문제를 무작위로 낼 수 있는 부분을 추가하고 정답을 맞히고, 실패했을 경우의 효과음을 넣어보겠습니다. 프로그래밍에는 정답이 없습니다. 본인이 생각했을 때 좀 더 가독성 있는 코드로 만들 수 있다면 그게 맞습니다.
행맨 게임은 소스코드를 찾아보면 정말 방대한 코드로 구성된 것들도 많습니다.
🤠