숫자 세 자리를 사용한 야구 게임을 만드는 과제이다. 알 수 없는 에러 처리에 꽤나 시간을 썼던 문제였던 것 같다.
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")
'Boostcamp AI Tech' 카테고리의 다른 글
[Boostcamp Day-5] Python - Data Handling (0) | 2021.08.06 |
---|---|
[Boostcamp 과제 - 5] morsecode (0) | 2021.08.06 |
[Boostcamp Day-4] Python - file_exception_handling_logging (0) | 2021.08.05 |
[Boostcamp Day-4] Python - Module and Project (0) | 2021.08.05 |
[Boostcamp Day-4] Python - Object Oriented Programming (0) | 2021.08.05 |