본문 바로가기

PYTHON

[TIL] 20240222 8일차

다음주 목(2024-02-29) 까지 진행할 개인 과제가 나와서

1번 문항을 풀이한 코드를 리뷰하고자 한다.

업-다운 게임 구현이다.

 

 

if __name__ == "__main__":
    max_try = 0
    set_game()

 

초기에 파이썬 파일을 실행하면 set_game() 함수를 호출한다.

 

 

def set_game():
    while True:
        global max_try
        prev_try = play_game()
        max_try = prev_try if prev_try > max_try else max_try
        
        command = input("게임을 다시 하시겠습니까? (종료: 'n', 데이터 초기화 후 재시작 'r'): ")
        if command == 'n':
            print("게임을 종료합니다.")
            break
        elif command == 'r':
            print("이전 게임 플레이어의 기록을 초기화 합니다...")
            max_try = 0
        print(f"이전 게임 플레이어의 최고 시도 횟수: {max_try}")

 

게임은 초기에 while문을 실행하면서 첫 판을 진행하고

이후 이어서 게임을 이어나갈지 아닐지를 유저 input에 의해 결정한다.

 

max_try를 global을 통해 전역변수화 한다.

play_game() 함수가 게임을 진행하면서 숫자를 맞추는 데 시도한 횟수를 int 값으로 return 한다.

이 리턴 값을 prev_try 변수에 저장한다.

그러고나서 전역변수 max_try의 값을 갱신한다. max_try는 '이전 게임 플레이어의 최고 시도 횟수'를 저장하는 변수이며 ①현재 게임을 진행하는 데에 시도한 횟수가 max_try보다 더 클 경우 max_try를 ①로 갱신한다. 아닐 경우 유지한다.

 

if 문에서 종료 커맨드 'n'과

이전 유저 데이터(이전 게임 플레이어의 최고 시도 횟수)를 초기화하고 게임을 이어나가는 커맨드 'r'을 판별하고

이외의 입력은 게임을 이어나가는 식이다.

 

종료 커맨드가 들어오면 while 문을 빠져나오고 프로그램이 종료된다.

초기화 후 재시작 커맨드가 들어오면 전역 변수 max_try를 0으로 초기화(initialize)한다.

if문 이후로 이전 게임 플레이어의 최고 시도 횟수(max_try)를 출력하고 while 문 안의 코드를 반복한다.

 

 

def play_game():
    answer  = random.randint(1, 100)
    try_num = 1
    
    while (try_num <= MAX_AVAILABLE_TRY):
        input_value = input("숫자를 입력하십시오. (1~100 사이 자연수): ")
        if is_valid(input_value) is True:
            input_num = int(input_value)
            if answer == input_num:
                print(f"정답입니다. 시도한 횟수: {try_num}")
                break
            else:
                print(f"{'업' if answer > input_num else '다운'}")
        try_num += 1
    
    if try_num > MAX_AVAILABLE_TRY:
        print(f"숫자를 맞추지 못하셨습니다. 제한 횟수({MAX_AVAILABLE_TRY})에 도달하여 게임을 종료합니다.")
        try_num = 0
    
    return(try_num)

 

play_game() 함수이다.

매 판마다 정해지는 1~100 사이의 숫자(answer)와 시도 횟수(try_num)를 각 변수에 저장한다.

 

while 문은 한 판당 최대로 시도할 수 있는 횟수(MAX_AVAILABLE_TRY) 만큼만 반복한다.

유저로부터 문자를 입력받은 후 is_valid(input_value) 함수를 통해 유효한 입력값인지 아닌지 판별한다.

유효한 입력값이면 입력값을 정수로 변환하여 input_num 변수에 저장하고

answer와 비교하여 정답인지 업인지 다운인지 알려준다.

정답일 경우 while 문을 빠져나온다.

 

정답을 맞춰서 while 문을 빠져나온 경우인지

한 판당 최대로 시도할 수 있는 횟수만큼 도전해서 while 문이 종료됐는지를

while 문 밑의 if 문에서 판별한다. 후자인 경우 try_num을 0으로 저장한다.

0으로 저장해야 set_game() 함수에서 전역변수 max_try의 값을 갱신할 때 올바른 갱신을 할 수 있다.

 

이후 각 상황에 맞는 try_num을 리턴한다.

 

 

def is_minus(input_value):
    if input_value[0] == '-':
        return input_value[1:].isdigit()
    else:
        return False


def is_valid(input_value):
    if input_value.isdigit() or is_minus(input_value):
        input_num = int(input_value)
        if (input_num >= 1 and input_num <= 100):
            return True
        else:
            print("유효한 범위 내의 숫자를 입력하십시오. (1~100 사이 자연수)")
            return False
    else:
        print("유효하지 않은 입력입니다. 다시 시도해주십시오.")
        return False

 

유효한 입력값인지 아닌지를 판별하는 is_valid(input_value) 함수이다.

if input_value.isdigit() or is_minus(input_value) 조건문을 통해 정수임을 확인하면

추가적으로 숫자가 1~100 사이 범위에 있는지를 확인한다.

 

두 조건을 모두 만족한다면 True를, 아니면 각 상황에 맞게 에러 메시지를 print 하고 False를 return 한다.

 

 

더보기

 

import random


MAX_AVAILABLE_TRY = 100


def is_minus(input_value):
    if input_value[0] == '-':
        return input_value[1:].isdigit()
    else:
        return False


def is_valid(input_value):
    if input_value.isdigit() or is_minus(input_value):
        input_num = int(input_value)
        if (input_num >= 1 and input_num <= 100):
            return True
        else:
            print("유효한 범위 내의 숫자를 입력하십시오. (1~100 사이 자연수)")
            return False
    else:
        print("유효하지 않은 입력입니다. 다시 시도해주십시오.")
        return False


def play_game():
    answer  = random.randint(1, 100)
    try_num = 1
    
    while (try_num <= MAX_AVAILABLE_TRY):
        input_value = input("숫자를 입력하십시오. (1~100 사이 자연수): ")
        if is_valid(input_value) is True:
            input_num = int(input_value)
            if answer == input_num:
                print(f"정답입니다. 시도한 횟수: {try_num}")
                break
            else:
                print(f"{'업' if answer > input_num else '다운'}")
        try_num += 1
    
    if try_num > MAX_AVAILABLE_TRY:
        print(f"숫자를 맞추지 못하셨습니다. 제한 횟수({MAX_AVAILABLE_TRY})에 도달하여 게임을 종료합니다.")
        try_num = 0
    
    return(try_num)


def set_game():
    while True:
        global max_try
        prev_try = play_game()
        max_try = prev_try if prev_try > max_try else max_try
        
        command = input("게임을 다시 하시겠습니까? (종료: 'n', 데이터 초기화 후 재시작 'r'): ")
        if command == 'n':
            print("게임을 종료합니다.")
            break
        elif command == 'r':
            print("이전 게임 플레이어의 기록을 초기화 합니다...")
            max_try = 0
        print(f"이전 게임 플레이어의 최고 시도 횟수: {max_try}")


if __name__ == "__main__":
    max_try = 0
    set_game()

 

'PYTHON' 카테고리의 다른 글

[TIL] 20240227 11일차  (1) 2024.02.27
[TIL] 20240226 10일차  (1) 2024.02.26
[TIL] 20240223 9일차  (0) 2024.02.23
[TIL] 20240221 7일차  (0) 2024.02.21
[TIL] 20240219 5일차  (0) 2024.02.19