ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬으로 업다운 게임 만들기
    Python 2024. 7. 2. 22:57

    업다운 게임 코드 짜기

     

    일단 컴퓨터가 유저가 맞출 숫자를 하나 랜덤으로 뽑아야 하니 random 모듈을 import 했다.

    게임이 시작될 때마다 1부터 100사이의 숫자 하나를 뽑는 건 계속 반복되는 일이니까 제일 먼저 함수로 만들어두고.

    import random
    
    
    def up_down_game():
        return random.randint(1, 100)

     

    attempts는 시도 횟수 때문에 만들어줬는데, 처음에는 그냥 attempts = 0 이렇게만 했다. 근데 만들고보니 총 시도 횟수를 구해야 해서 나중에 total_attempts 리스트를 추가했다.

     

    컴퓨터가 랜덤으로 숫자를 뽑는게 게임의 가장 첫번째 순서이기 때문에

    total_attempts = []
    
    print("UpDown 게임을 시작합니다.")
    
    while True:
        attempts = 0
        game_number = up_down_game()

     

    ↑ 이 while True 반복문이 가장 상위에 놓인다.  

     

     

    그 다음에 오는 반복문이 유저가 입력한 숫자 guess_number와 컴퓨터가 뽑은 game_number를 비교한다.

        while True:
            try:
                guess_number = int(input("1에서 100 사이의 숫자를 입력하세요: "))
    
                if guess_number < 1 or guess_number > 100:
                    print("숫자가 1에서 100 사이에 있지 않습니다.")
                    continue
    
                attempts += 1
    
                if guess_number < game_number:
                    print("UP")
                elif guess_number > game_number:
                    print("DOWN")
                else:
                    print(f"정답입니다! {attempts}번 만에 정답을 맞히셨습니다!")
                    total_attempts.append(attempts)
                    break
    
            except ValueError:
                print("숫자가 아닙니다.")

     

    유저가 게임 종료를 선택하기 전까지는 게임이 계속해서 무한반복 되도록 while True 반복문을 썼고,

    유저가 숫자 외의 문자를 입력하면 게임 진행이 불가능해지므로 그런 경우는 except ValueError(숫자가 아닌 값을 입력할 때 발생하는 에러)로 예외처리를 해줬다. 

     

    만약 1보다 작은 수를 입력하거나 100보다 큰 수를 입력하면 숫자가 1에서 100 사이에 있지 않습니다. 문구를 받게되고, 반복문으로 돌아가 1부터 100사이의 숫자를 다시 입력하게 했다. 

     

    유저가 숫자를 제대로 입력하면 시도 횟수가 1씩 증가하고 (attempts += 1)

    유저가 입력한 숫자 guess_number가 up_down_game() 함수의 리턴값을 받는 변수 game_number보다 작으면 UP, 크면 DOWN을 출력하도록 했다. 크지도 작지도 않을 때가 정답이므로 else 정답.

     

     

    한 라운드가 끝났으면 이제 유저에게 물어봐야한다. 게임을 더 할건지 종료할건지.

        end_question = (
            input("게임을 계속 하고 싶으면 y, 종료하고 싶으면 n 을 입력하세요: ")
            .strip()
            .lower()
        )
    
        if end_question == "n":
            break
        elif end_question != "y":
            print("잘못된 입력입니다. 게임을 종료합니다.")
            break
        if total_attempts:
            last_attempt = total_attempts[-1]
            print(f"전 라운드 시도 횟수: {last_attempt}번! 이번 라운드도 화이팅입니다!")
    
    
    if total_attempts:
        last_attempt = total_attempts[-1]
        print(f"마지막 라운드 시도 횟수: {last_attempt}번! 다음에 또 만나요!")

     

     

    처음 코드를 작성할때는 아래 조건문을 이런식으로 썼다가 코드를 간결하게 만들고 싶어서 

    end_question == 'y' or end_question == 'Y'

     

    위의 end_question을 strip으로 양쪽 공백을 제거하고 lower로 문자열을 소문자로 받도록 수정했다.

     

    n, y에 따른 조건도 처음에는 == n 일 때와 == y 일 때, 둘 다 아닐 때로 나누다가 내가 할 수 있는 선에서 최대한 간결하게 만들기 위해 노력했다. n을 입력하면 말그대로 종료하겠다는 뜻이니까 break로 반복문 밖으로 나가고 마지막 시도 횟수를 알려주며 다음에 또 만나요! 로 게임을 종료해주고.

        if end_question == "n":
            break
        elif end_question != "y":
            print("잘못된 입력입니다. 게임을 종료합니다.")
            break

     

    반대로 if end_question == n에서 유저가 n을 입력하지 않으면 if문은 거짓이 되어 아래의 elif end_question != y  로 넘어가게 된다.

     

    여기서 입력값이 y가 아니면 조건문은 참이 되어 아래 문구 잘못된 입력입니다. 게임을 종료합니다.를 출력하고 break로 게임이 종료된다. (조건문은 참이지만 게임 안에서 y, n 외의 값을 입력한 건 잘못된 입력값이이므로).

    유저가 y를 입력하면 이 조건문은 거짓이 되어 아래의 조건문으로 넘어가고 게임이 계속 진행된다.

    if total_attempts:
        last_attempt = total_attempts[-1]
        print(f"마지막 라운드 시도 횟수: {last_attempt}번! 다음에 또 만나요!")

     

    이때 유저의 마지막 라운드의 시도 횟수와 다음 라운드의 응원 메시지를 넣어줬다.


    모든 코드를 종합해보면 이렇다.

    import random
    
    
    def up_down_game():
        return random.randint(1, 100)
    
    
    total_attempts = []
    
    print("UpDown 게임을 시작합니다.")
    
    while True:
        attempts = 0
        game_number = up_down_game()
    
        while True:
            try:
                guess_number = int(input("1에서 100 사이의 숫자를 입력하세요: "))
    
                if guess_number < 1 or guess_number > 100:
                    print("숫자가 1에서 100 사이에 있지 않습니다.")
                    continue
    
                attempts += 1
    
                if guess_number < game_number:
                    print("UP")
                elif guess_number > game_number:
                    print("DOWN")
                else:
                    print(f"정답입니다! {attempts}번 만에 정답을 맞히셨습니다!")
                    total_attempts.append(attempts)
                    break
    
            except ValueError:
                print("숫자가 아닙니다.")
    
        end_question = (
            input("게임을 계속 하고 싶으면 y, 종료하고 싶으면 n 을 입력하세요: ")
            .strip()
            .lower()
        )
    
        if end_question == "n":
            break
        elif end_question != "y":
            print("잘못된 입력입니다. 게임을 종료합니다.")
            break
        if total_attempts:
            last_attempt = total_attempts[-1]
            print(f"전 라운드 시도 횟수: {last_attempt}번! 이번 라운드도 화이팅입니다!")
    
    
    if total_attempts:
        last_attempt = total_attempts[-1]
        print(f"마지막 라운드 시도 횟수: {last_attempt}번! 다음에 또 만나요!")

     

Designed by Tistory.