업다운 게임
import random
def up_down_game():
# 가장 빨리 맞춘 횟수, 즉 최고기록을 출력하기 위해 min_cnt 변수 할당
min_cnt = float('inf')
while True:
random_num = random.randint(1, 100)
cnt = 0
while True:
# 숫자가 아닌 문자가 잘못 들어갈 경우 에러가 남, 따로 예외처리
try:
user_num = int(input("숫자를 입력하세요 : "))
# 범위 밖의 숫자를 입력하거나 문자가 섞인 경우 경고문 출력
if user_num < 1 or user_num > 100:
print("1부터 100 사이의 수를 입력하세요.")
continue
cnt += 1
if user_num < random_num:
print("업")
elif user_num > random_num:
print("다운")
else:
print(f"맞았습니다.\n시도한 횟수 :", cnt)
# 현재 cnt와 비교해서 최고기록을 업데이트
if cnt < min_cnt:
min_cnt = cnt
break
except ValueError:
print("유효한 숫자를 입력해주세요")
# y이면 retry 탈출 후 다시 게임 반복문 시작, n이면 return을 통한 함수 종료, 그외 경고문 출력
while True:
retry = input("다시 하시겠습니까? (y/n): ")
if retry == 'y':
print("이전 게임 플레이어 최고 시도 횟수 :", min_cnt)
break
elif retry == 'n':
print("게임을 종료합니다.")
return
else:
print("y 또는 n을 입력해주세요.")
up_down_game()
최종 완성 코드.
재시도 구간인 retry 부분에서 시간이 조금 걸렸음.
무한반복을 하나 더 걸고 y인 경우 break, n인 경우 return으로 함수 종료, 그 외 입력에는 경고문을 출력하도록 함.
발생한 문제 1
테스트 도중 숫자 대신 '5r' 이런식으로 잘못 눌러 문자가 들어가게 될 경우 Error가 발생하여 코드가 중지됨. 잘못 입력하는 경우 예외처리가 필요할 것이라고 판단함.
while True:
# 숫자가 아닌 문자가 잘못 들어갈 경우 에러가 남, 따로 예외처리
try:
user_num = int(input("숫자를 입력하세요 : "))
# 범위 밖의 숫자를 입력하거나 문자가 섞인 경우 경고문 출력
if user_num < 1 or user_num > 100:
print("1부터 100 사이의 수를 입력하세요.")
continue
cnt += 1
if user_num < random_num:
print("업")
elif user_num > random_num:
print("다운")
else:
print(f"맞았습니다.\n시도한 횟수 :", cnt)
# 현재 cnt와 비교해서 최고기록을 업데이트
if cnt < min_cnt:
min_cnt = cnt
break
except ValueError:
print("유효한 숫자를 입력해주세요")
이렇게 try & except 를 사용하여 에러가 날 경우를 따로 예외처리하여 해결함.
발생한 문제 2
처음에는 최고 시도 횟수를 max_cnt로 착각했음. 하지만 맥락상 "가장 적은 시도를 한 최고기록" 을 출력하는 것이라고 다시 이해하여 min_cnt로 변경. 하지만 max로 할 때와는 구조가 달라 당황했다.
min_cnt = float('inf')
이런식으로 초기값을 정할 때 무한으로 초기화를 해주면 max의 경우와 동일하게 진행할 수 있다.
가위바위보 게임
import random
def rsp_game():
rsp = ["가위", "바위", "보"]
wins = 0
losses = 0
ties = 0
while True:
#user_rsp를 결정
user_rsp = input("가위, 바위, 보 중 하나를 선택하세요 : ")
while user_rsp not in rsp:
print("유효한 입력이 아닙니다")
user_rsp = input("가위, 바위, 보 중 하나를 선택하세요 : ")
#computer_rsp를 결정
computer_rsp = random.choice(rsp)
#사용자와 컴퓨터 각각 뭐냈는지 출력
print(f"사용자 : {user_rsp}, 컴퓨터 : {computer_rsp}")
#승패 결정(승,패,무 각각 횟수 할당)
if user_rsp == computer_rsp:
print("비겼습니다!")
ties += 1
elif ((user_rsp == "가위" and computer_rsp == "보") or
(user_rsp == "바위" and computer_rsp == "가위") or
(user_rsp == "보" and computer_rsp == "바위")):
print("사용자 승리!")
wins += 1
else:
print("컴퓨터 승리!")
losses += 1
#재시작 여부 질문(y,n 이외의 문자를 입력하는 경우까지 대비)
while True:
retry = input("다시 하시겠습니까? (y/n): ")
if retry.lower() == "y":
break
elif retry.lower() == "n":
print("게임을 종료합니다")
print(f"승 : {wins}, 패 : {losses}, 무승부 : {ties}")
return
else:
print("y 또는 n을 입력해주세요")
rsp_game()
완성된 코드.
rsp라는 리스트에 '가위', '바위', '보'를 할당하고 그 안에 없는 요소를 입력할 경우 경고문 출력 및 재입력을 받을 수 있도록 반복문을 하나 더 만들었다.
재시도 retry 역시 업다운과 동일하게 반복문을 하나 더 만들어 진행. 다만 대소문자 구별을 없애기 위해 .lower()을 추가하였음.
문제가 발생하지는 않았지만 조건문을 더 짧게 쓸 수 있을 것 같은데 방법을 모르겠다. 그리고 변수 이름 잘 못만드는듯. 더 이해하기 쉽게 만들자.
오늘의 회고
대체적으로 잘 집중했다. 파이썬 심화까지 모두 수강하고 과제 마무리 완료.
내일의 목표는 적은 시간 잘 활용해서 git 복습
'매일 TIL' 카테고리의 다른 글
[내일배움캠프 12일차] SQLite, SQLAlchemy (0) | 2024.07.05 |
---|---|
[내일배움캠프 11일차] member_class (0) | 2024.07.04 |
[내일배움캠프 8일차] python 심화 (0) | 2024.07.01 |
[내일배움캠프 5일차] Python 기초 문법 (0) | 2024.06.28 |
[내일배움캠프 4일차] Python 가상 환경 생성, 스크래핑(크롤링), Flask (0) | 2024.06.27 |