2024.12.04 과제 1, 2 코드 수정 찐최종(?)

SMALL

[ TIL ]

 

이전에 최종이라고 만들었던 아래 코드가 어떤 상황에서 고장이 나는 것을 알게 되었다.

 

import random
def start_game():

    while True:  
        chosen_number = random.randint(1, 10)
        print("=== 숫자 맞추기 게임 ===")
        print(f"1과 10 사이의 숫자를 하나 정했습니다.\n이 숫자는 무엇일까요?")

        while True:  
            try:
                user_number = int(input("예상 숫자 : "))
                if 1 <= user_number <= 10:  
                    break  
                else:
                    print("입력값이 1과 10 사이가 아닙니다. 다시 입력하세요.")
            except ValueError:
                print("유효하지 않은 숫자입니다. 숫자를 입력해주세요.")
        
        while user_number != chosen_number:
            if user_number < chosen_number:
                print("너무 작습니다. 다시 입력하세요.")
            elif user_number > chosen_number:
                print("너무 큽니다. 다시 입력하세요.")
            user_number = int(input("예상 숫자 : "))
        
        print("정답입니다!")
        
        while True:
            user_input = input("계속 하시겠습니까? (Y/N): ").upper()
            if user_input == 'Y':
                break  
            elif user_input == 'N':
                print("게임을 종료합니다.")
                return  # N이면 게임 종료 exit() 사용가능
            else:
                print("잘못된 입력입니다. Y 또는 N을 입력하세요.")

start_game()

 

 

고장난 상황

 

고장 사유 :

 첫번째 검증 루프를 통과하는 오답을 입력한 뒤, 첫번째 검증 루프에서 걸러졌어야할 오답을 재입력하면 그대로 제출이 되거나 게임이 종료되는 모습을 볼 수 있다. ㅠㅠ

 

구역별로 검증 루프를 나눠 놨는데... 어제 밤에 용용드래곤과 욜히졸히가 해당 부분에 대한 의문을 제기해서 확인해보니까 그랬다...

이미 제출도 했고 사실 숙제 검사 해주시는 선생님이 알아봐주길? 바라는 맘으로 고치지 말까 고민하다가 너무 게으름뱅이의 핑계같아서 수정하게 되었다.

 

 

수정된 코드

import random     #랜덤 모듈 불러오기 
def start_game(): #게임 시작 함수   

    while True:                                 #게임을 그만둘 때까지 무한 반복 시작
        chosen_number = random.randint(1, 10)   #1과 10 사이의 랜덤한 숫자 선택   
        print("=== 숫자 맞추기 게임 ===")           #게임 시작 문구 출력
        print(f"1과 10 사이의 숫자를 하나 정했습니다.\n이 숫자는 무엇일까요?") #게임 설명 출력

        while True:                                         #정답이 나올 때까지 무한 반복 시작
            try:                                            #예외 처리 시작
                user_number = int(input("예상 숫자 : "))      #사용자 입력 숫자로 받기
                if not (1 <= user_number <= 10):            #사용자 입력 숫자가 1과 10 사이가 아니면
                    print("입력값이 1과 10 사이가 아닙니다. 다시 입력하세요.") #해당 메세지 출력   
                    continue                                 #1과 10 사이가 아니면 다시 입력하기
                if user_number < chosen_number:              #사용자 입력 숫자가 정답보다 작으면   
                    print("너무 작습니다. 다시 입력하세요.")        #해당 메세지 출력
                elif user_number > chosen_number:            #사용자 입력 숫자가 정답보다 크면
                    print("너무 큽니다. 다시 입력하세요.")          #해당 메세지 출력
                elif user_number == chosen_number:           #사용자 입력 숫자가 정답과 같으면
                    print("정답입니다!")                        #해당 메세지 출력
                    break                                    #정답이 나오면 반복문 종료
            except ValueError:                               #밸류에러일 때
                print("유효하지 않은 숫자입니다. 숫자를 입력해주세요.") #해당 메세지 출력   
        
        while True:                                            #게임을 계속 할지 말지 묻는 반복문 시작
            user_input = input("계속 하시겠습니까? (Y/N): ").strip().upper() #사용자에게 받은 입력을 공백 제거 후 대문자로 변환
            if user_input == 'Y':                              #사용자 입력이 Y이면
                break                                          #반복문 종료
            elif user_input == 'N':                            #사용자 입력이 N이면
                print("게임을 종료합니다.")                        #해당 메세지 출력 후
                return                                         #게임 종료
            else:                                              #사용자 입력이 Y와 N이 아니면
                print("잘못된 입력입니다. Y 또는 N을 입력하세요.")      #해당 메세지 출력

start_game()                                                   #Y를 선택하면 루프 탈출 후 시작함수 호출

 

같은 오답을 입력해본 모습

 

에효효 드디어 완성한 진짜진짜 최종코드다.

 

 


 

 

 

그리고 과제 2번 코드도 그런 사람은 없겠지만 마이너스 나이를 입력하는 경우에 대한 대비가 없어서 최종 수정을 하게 되었다.

def good_gender():  #메서드     
    while True:     #무한루프    
        gender = input("성별을 입력하세요 (m/f): ").lower()  #사용자 입력값을 소문자로 변환
        if gender in ["m", "f"]:                         #사용자 입력값이 m,f면
            return "male" if gender == "m" else "female" #m은 male, f는 female로 변환 출력  
        print("잘못된 성별입니다. 'm' 또는 'f'만 입력하세요.")    #사용자 입력값이 m,f가 아니면 프린트


def good_age():  #메서드
    while True:  #무한루프
        try:     #예외처리
            age = int(input("나이를 입력하세요: "))        #사용자 입력값을 정수로 변환
            if age > 0:                                #나이가 양수면
                return age                             #나이 출력
            else:                                      #나이가 양수가 아니면
                print("나이는 양수여야 합니다.")             #해당 메세지 프린트
        except ValueError:                             #밸류에러가 나면
            print("잘못된 입력입니다. 숫자로 나이를 입력하세요.") #해당 메세지 프린트


class Person:  #클래스
    def __init__(self, name, gender, age):    #클래스 객체가 생성될 때 자동으로 실행
        self.name = name                      #셀프네임값에 사용자 입력값 넣기
        self.gender = gender                  #셀프젠더값에 사용자 입력값 넣기
        self.age = age                        #셀프나이값에 사용자 입력값 넣기

    def display(self):  #메서드
        gender_kor = "남성" if self.gender == "male" else "여성" #셀프젠더값으로 male은 남성, female은 여성으로 변환 출력   
        print(f"이름: {self.name}, 성별: {gender_kor}")          #에푸스트링을 통해 변수값 문자열 안에 넣고 출력 
        print(f"나이: {self.age}")                              #에푸스트링을 통해 변수값 문자열 안에 넣고 출력

    def greet(self):  #메서드, 각 조건에 맞는 메세지 출력
        if self.age < 10:
            message = "어린이 여러분! 반가워요!"
        elif self.age < 20:
            message = "청소년 여러분! 반가워요!"
        elif self.age < 40:
            message = "청춘 여러분! 반가워요!"
        elif self.age < 60:
            message = "안녕하세요😘 반갑습니다!"
        else:
            message = "늘 건강하시길🥰 반갑습니다!"
        print(message) 


# 사용자 입력
name = input("이름을 입력하세요: ")
gender = good_gender()  # 성별 검증
age = good_age()        # 나이 검증

# Person 객체 생성 및 출력
person = Person(name, gender, age)
person.display()
person.greet()

 

 

혹시라도 이 글을 보고 다른 오류나 고장을 발견한 사람은 알려주면 감삼다🫠

 

 

LIST