본문 바로가기

매일 TIL

[내일배움캠프 9일차] Updown 게임, 가위바위보 게임

업다운 게임

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 복습