I learned

내일배움캠프 AI - TIL 08

이모냥냥 2022. 9. 7. 19:40
반응형
❤️‍🔥TIL : Today I Learned❤️‍🔥
그날그날 내가 공부한 것을 정리하는 것

 

 

 

내일배움캠프 AI트랙 8Day

 

 

오늘 배운 내용.

이창호 튜터님 - python 문법 3일차

[과제] 숫자야구 게임 만들어보기

  • 프로그램이 시작되면 숫자야구 게임을 몇 자리 숫자로 할 건지 입력 받아 주세요
    • 3을 입력할 경우 해당 숫자야구 게임은 3자릿수로 진행, 최대 10자리
  • 첫 번째 입력을 받은 자릿수 만큼 후 파이썬으로 중복 없는 랜덤한 수를 생성해 주세요
  • 사용자가 숫자를 입력 했을 때 숫자야구 게임의 규칙에 맞게 ball / out count를 출력해 주세요
  • 사용자가 정답을 맞춘 경우 아래 항목들을 출력해 주세요
    • 사용자가 정답을 맞추기까지 입력 한 횟수
    • 사용자가 게임을 시작해서 정답을 맞추기까지 소요된 시간
    • 정답을 맞춘 시점의 날짜/시간
  • 게임을 진행하던 도중, “exit”을 입력할 경우 프로그램을 종료해 주세요

[과제 과정..]

숫자야구게임... 처음들어봐서 게임의 룰을 이해하는데 시간이 걸렸다. 간단하게 짰으면 더 빨리 과제를 끝낼 수 있었겠지만 에러로 강제 종료되는 예외를 처리하기 위해서 고민했더니 약간 오래 걸린 것 같다!

 

숫자 야구게임을 시작하기 전에 게임셋팅을 위해 몇자리 숫자로 게임을 할 것인지에  입력값을 하나 받아줘야한다.

하지만 숫자로만 입력하기 위해서 int(input()) 을 해줬더니 입력받은 값이 숫자로 저장이 잘되지만 숫자 외의 문자를 입력하면 바로 에러가 발생하면서 강제종료된다.

numLen = int(input("숫자 야구 게임을 몇자리 숫자로 할 것인지 입력해주세요."))

 

입력값을 예외 없이 처리할려면 입력값에 대해 처리할 유형이 몇가지 있을지 생각을 해봐야할것 같다.

  1. 입력값 "exit"인경우
    → 프로그램 종료
  2. 입력값 숫자가 아닌 경우 
    → "숫자만 입력해주세요."msg 출력 후 재입력
  3. 입력값 최대 10자리 수가 아닌경우
    → 숫자의 자리값이 0이나 음수일 수는 없으니 MIN=1 지정.
    → 최대 10자리 수를 넘어갈수 없으니 MAX = 10으로 지정
    → "{MIN}이상 {MAX}이하의 숫자만 입력해주세요."msg 출력 후 재입력
  4. 입력값이 정상인 경우
MIN = 1 # numLen 최소값
MAX = 10 # numLen 최대값

numLen = input("숫자 야구 게임을 몇자리 숫자로 할 것인지 입력해주세요.")
if numLen == "exit":
    print("종료합니다.")
elif not (numLen).isdigit():
    print("숫자만 입력해주세요.")
elif (int(numLen) > MAX) | (int(numLen) < MIN):
    print(f"{MIN}이상 {MAX}이하의 숫자만 입력해주세요.")
else:
    numLen = int(numLen)

 

입력값이 정상적으로 입력될 때까지 재입력을 받기 위해서 while문으로 무한루프를 걸어주었다. 무한루프를 조심해서 써야하는 것은 알고 있지만.. 이렇때 어떻게 해결하면 좋을지 생각이 안떠올라서 입력값 판멸하는 부분은 죄다 무한루프로 처리한것 같다.

>> 물론 나중에서야.... 아래 최종 코드를 보면 게임 재시작여부를 걸고 체크를 하기는 했다....  

while (1):
    numLen = input("\n숫자 야구 게임을 몇자리 숫자로 할 것인지 입력해주세요.")
    if numLen == "exit":
        print("종료합니다.")
        play_on = "n"
        break
    elif not (numLen).isdigit():
        print("숫자만 입력해주세요.")
    elif (int(numLen) > MAX) | (int(numLen) < MIN):
        print(f"{MIN}이상 {MAX}이하의 숫자만 입력해주세요.")
    else:
        numLen = int(numLen)
        play(numLen)
        break;

 

[과제결과]

> main.py

from func import play

MIN = 1  # numLen 최소값
MAX = 10  # numLen 최대값


def main():
    play_on = "y"
    # 0. 게임설정 : 숫자야구게임에 필요한 자리수 받아오기
    #       -> 입력값이 "exit"이면 종료
    #       -> 문자이면 재입력
    #       -> numLen는 MIN(1)이상 MAX(10)이하 여야한다.
    while (play_on == "y"):
        numLen = input("\n숫자 야구 게임을 몇자리 숫자로 할 것인지 입력해주세요.")
        if numLen == "exit":
            print("종료합니다.")
            play_on = "n"
            break
        elif not (numLen).isdigit():
            print("숫자만 입력해주세요.")
        elif (int(numLen) > MAX) | (int(numLen) < MIN):
            print(f"{MIN}이상 {MAX}이하의 숫자만 입력해주세요.")
        else:
       	    numLen = int(numLen)
            play(numLen)
            play_on = input("\n계속 게임을 하려면 y를 눌러주세요.")


main()

 

> func.py

import random
import time
from datetime import timedelta


def play(numLen):
    print("\n\n ------------------------- Game Start -------------------------")
    
    # # 1. 랜덤 숫자 설정하기
    num = set_num(numLen)

    # # 2. 게임시작하기
    count = 0
    results = []
    start = time.time()

    while (1):
        # # 2-1. 답 올바르게 입력받기
        ans = input("정답은! ")
        if ans == "exit":
            print("종료합니다.")
            break
        elif not (ans).isdigit():
            print("숫자만 입력해주세요.")
            continue
        elif (len(ans) != numLen):
            print(f"{numLen}자리 숫자만 입력해주세요.")
            continue
        else:
            ans = list(map(int, ans))

        # # 2-2. 정답 확인 후 접수판에 기록하기
        score = check_score(ans, num, numLen)
        results.append(score)
        print(score)

        # # 2-4. 정답인지 체크하고 정답이면 종료하기
        if score['strike'] == numLen:
            print("정답!\n\n")
            end = time.time()
            break

    # # 3. 게임 기록 및 점수판 확인하기
    print(f'-------------------------- Game Score --------------------------')
    print(f'정답 {num} 까지 시도 횟수 {len(results)} 걸린 시간 {timedelta(seconds=end-start)}')
    for i, score in enumerate(results):
        print(f'{i}번째 점수 : {score}')


def set_num(numLen):
    num = []
    while (len(num) < numLen):
        rand = random.randrange(0, 10)
        if rand not in num:  # 새로운 수가 중복이 아니면,
            num.append(rand)  # 리스트에 추가
    return num


def check_score(ans, num, numLen):
    score = {
        "ans": ans,
        "strike": 0,
        "ball": 0,
        "out": 0,
    }
    for i in range(numLen):
        if ans[i] == num[i]:
            score["strike"] += 1
        elif ans[i] in num:
            score["ball"] += 1
        else:
            score["out"] += 1

    return score

>> 결과 화면 <<

반응형