반응형
❤️🔥TIL : Today I Learned❤️🔥
그날그날 내가 공부한 것을 정리하는 것
내일배움캠프 AI트랙 8Day
오늘 배운 내용.
이창호 튜터님 - python 문법 3일차
[과제] 숫자야구 게임 만들어보기
- 프로그램이 시작되면 숫자야구 게임을 몇 자리 숫자로 할 건지 입력 받아 주세요
- 3을 입력할 경우 해당 숫자야구 게임은 3자릿수로 진행, 최대 10자리
- 첫 번째 입력을 받은 자릿수 만큼 후 파이썬으로 중복 없는 랜덤한 수를 생성해 주세요
- 사용자가 숫자를 입력 했을 때 숫자야구 게임의 규칙에 맞게 ball / out count를 출력해 주세요
- 사용자가 정답을 맞춘 경우 아래 항목들을 출력해 주세요
- 사용자가 정답을 맞추기까지 입력 한 횟수
- 사용자가 게임을 시작해서 정답을 맞추기까지 소요된 시간
- 정답을 맞춘 시점의 날짜/시간
- 게임을 진행하던 도중, “exit”을 입력할 경우 프로그램을 종료해 주세요
[과제 과정..]
숫자야구게임... 처음들어봐서 게임의 룰을 이해하는데 시간이 걸렸다. 간단하게 짰으면 더 빨리 과제를 끝낼 수 있었겠지만 에러로 강제 종료되는 예외를 처리하기 위해서 고민했더니 약간 오래 걸린 것 같다!
숫자 야구게임을 시작하기 전에 게임셋팅을 위해 몇자리 숫자로 게임을 할 것인지에 입력값을 하나 받아줘야한다.
하지만 숫자로만 입력하기 위해서 int(input()) 을 해줬더니 입력받은 값이 숫자로 저장이 잘되지만 숫자 외의 문자를 입력하면 바로 에러가 발생하면서 강제종료된다.
numLen = int(input("숫자 야구 게임을 몇자리 숫자로 할 것인지 입력해주세요."))
입력값을 예외 없이 처리할려면 입력값에 대해 처리할 유형이 몇가지 있을지 생각을 해봐야할것 같다.
- 입력값 "exit"인경우
→ 프로그램 종료 - 입력값 숫자가 아닌 경우
→ "숫자만 입력해주세요."msg 출력 후 재입력 - 입력값 최대 10자리 수가 아닌경우
→ 숫자의 자리값이 0이나 음수일 수는 없으니 MIN=1 지정.
→ 최대 10자리 수를 넘어갈수 없으니 MAX = 10으로 지정
→ "{MIN}이상 {MAX}이하의 숫자만 입력해주세요."msg 출력 후 재입력 - 입력값이 정상인 경우
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
>> 결과 화면 <<
반응형
'I learned' 카테고리의 다른 글
내일배움캠프 AI - WIL 2주차 (0) | 2022.09.12 |
---|---|
내일배움캠프 AI - TIL 09 (0) | 2022.09.08 |
내일배움캠프 AI - TIL 07 (0) | 2022.09.06 |
내일배움캠프 AI - TIL 06 (0) | 2022.09.05 |
내일배움캠프 AI - WIL 1주차 (1) | 2022.09.02 |