Boostcamp AI Tech

[Boostcamp 과제 - 4] Baseball

ju_young 2021. 8. 6. 00:14
728x90

숫자 세 자리를 사용한 야구 게임을 만드는 과제이다. 알 수 없는 에러 처리에 꽤나 시간을 썼던 문제였던 것 같다.

Basic

기본적으로 다음과 같이 난수를 생성하는 함수가 들어가 있다.

import random

def get_random_number()->int:
    return random.randrange(100, 1000)

is_digit

입력받은 문자가 숫자인지 아닌지 판단하는 함수이다. 간단히 isdigit() 함수를 사용하여 해결하였다.

def is_digit(user_input_number:str)->bool:
    return str(user_input_number).isdigit()

is_between_100_and_999

입력받은 숫자 문자가 100이상 1000미만인지 아닌지 판단하는 함수로 비교연산자를 사용하여 간단히 해결하였다.

def is_between_100_and_999(user_input_number:str)->bool:
    return 100 <= int(user_input_number) < 1000

is_duplicated_number

입력받은 숫자 문자에 중복되는 숫자가 있는지 확인하는 함수이다. set()함수를 사용하면 중복되는 숫자가 없어져 길이가 달라지므로 길이가 다르면 중복 숫자가 있는 것으로 판단했다.

def is_duplicated_number(three_digit:str)->bool:
    return len(three_digit) != len(set(three_digit)) # 중복되는 수가 있으면 True

is_validated_number

입력받은 숫자 문자가 이전에 만든 3가지의 조건이 모두 만족하는지 판단하는 함수이다. is_duplicated_number일 경우 중복되는 숫자가 있으면 True를 반환하는데 지금은 중복되는 숫자가 없어야하므로 앞에 not을 작성해주었다.

def is_validated_number(user_input_number:str)->bool:
    return is_digit(user_input_number) and is_between_100_and_999(user_input_number) and not is_duplicated_number(user_input_number)

get_not_duplicated_three_digit_number

is_validated_number만족하는 세자리 난수를 생성하는 함수이다. while True를 사용하여 만족하는 숫자가 나올때까지 반복하여 값을 반환했다.

while True:
    result = str(get_random_number())
    if is_validated_number(result):
        return result

get_strikes_or_ball

입력한 숫자와 난수의 strike, ball을 판단하는 함수로 zip()을 사용해 pair로 받은 다음 서로 같으면 같은 자리에 있으니 strike, 만약 그렇지않고 그냥 난수 안 어딘가에 존재한다면 ball로 판단하였다.

def get_strikes_or_ball(user_input_number, random_number):

    result = [0, 0] #strike, ball
    for x, y in zip(str(user_input_number), str(random_number)):
        if x == y:
            result[0] += 1
        elif x in random_number:
            result[1] += 1
    return result

is_yes

받은 문자를 소문자로 변환 후 y 또는 yes를 입력받으면 True를 반환한다.

def is_yes(one_more_input):
    return one_more_input.lower() in ['y', 'yes']

is_no

받은 문자를 소문자로 변환 후 n 또는 no를 입력받으면 True를 반환한다.

def is_no(one_more_input):
    return one_more_input.lower() in ['n', 'no']

main

메인 함수는 다음과 같은 순서로 코드를 작성하였다.

  • get_random_number라는 난수를 받는 함수를 만들어주었다.
  • 만들어준 get_random_number라는 함수를 실행하여 첫 난수를 받아준다.
  • tmp라는 리스트 [0, 0]을 생성하여 strike와 ball을 기록할 수 있도록 만들어주었다.
  • 우선 strike 3를 만족하기 위해 반복 입력받도록 while True를 사용한다.
  • 가장 먼저 입력 숫자를 input으로 받는다
  • input 값을 0으로 받으면 종료가 되게 break를 지정해준다.
  • 만약 입력받은 숫자가 is_validated_number 함수를 만족하지 않으면 "WRONG INPUT"를 print해주고 다시 input값을 받도록 continue를 지정해준다.
  • 입력받은 숫자와 난수의 strike, ball을 get_strikes_or_ball 함수를 사용해 tmp 변수에 저장하도록 하였다.
  • 3 strike로 정답이 나왔을 때 계속 게임을 할건지 묻는 문자와 함께 yes 또는 no를 input으로 받는다
  • yes 값을 받으면 get_random_number()를 실행해 새로운 난수를 받고 다시 숫자를 입력하는 곳으로 돌아간다.
  • no 값이나 0값을 받으면 is_end라는 flag를 True로 바꿔주고 break로 빠져나가게 만든 후 다시 바깥에서 is_end가 True일 때 break로 종료되게하였다.
  • 잘못된 값을 받았다면 "WRONG INPUT"를 print해주고 다시 입력받을 수 있도록 while을 또 한번 사용하였다.
def main():
    print("Play Baseball")
    
    def get_random_number()->str:
        random_number = get_not_duplicated_three_digit_number()
        print("Random Number is : ", random_number)
        return random_number
    
    random_number = get_random_number()
    tmp = [0, 0]
    while True:
        user_input = input('Input guess number : ')
        #종료
        if user_input == '0':
            break
        
        #실수 or 문자포함 or 중복문자(예외처리)
        if not is_validated_number(user_input):
            print("WRONG INPUT")
            continue
                
        tmp = get_strikes_or_ball(user_input, random_number) #[strike, ball]
        print('{0} {1} {2} STRIKES, {3} BALLS'.format(user_input, random_number, tmp[0], tmp[1]))
        
        #strikes = 3
        is_end = False
        if tmp[0] == 3:
            while True:
                yes_or_no = input('Re? (y/n) : ')
                if is_yes(yes_or_no): #restart
                    random_number = get_random_number()
                    break # user_input부터 다시 시작
                elif is_no(yes_or_no) or yes_or_no == '0':
                    is_end = True
                    break # 종료
                else:
                    print("WRONG INPUT")
        #종료
        if is_end:
            break

    print("Thank you for using this program")
    print("End of the Game")
728x90