업다운 게임 만들기

1. 개요

오늘부터 매일 개인프로젝트를 과제를 준다고 한다. 오늘은 파이썬으로 업다운 게임 만들기 이다.
컴퓨터가 1~100 범위에서 랜덤으로 정한 수를 맞추면 된다. 기회는 총 5번이 있고, 만약 컴퓨터가 정한 수 보다 낮게 추측할 경우 , 그 반대의 경우 다운 이라고 힌트를 출력 해줘야 한다.

2. 로직

1️⃣ random.randrange 함수를 사용하여 1~100 사이 랜덤 수를 생성
2️⃣ input()으로 사용자 추측 숫자를 입력 받는다.
3️⃣ 5번 안에 랜덤으로 생성 된 수와 사용자가 추측한 숫자가 맞다면 “성공”을 출력한다. 그렇지 못할 경우 “실패”를 출력한다.
4️⃣ 예외처리) 정수외 입력 값(소수, 문자열 등)을 받을 경우 다시 입력 값을 받게 한다.

3. 코드

import random

# 정답 값 생성(컴퓨터)
answer_num = random.randrange(1, 101)
try_round = 1

# 정답 추측(유저)
while try_round < 6: # 추측 시도 라운드가 6 미만이면
    round_msg = ("마지막" if try_round == 5 else str(try_round)) + " 라운드" # 현재 라운드 추측
    print(round_msg)

    try:
        guess_num = int(input())
        if type(guess_num) == type(1):  # 추측 값이 정수인가?
            if guess_num < 1 or guess_num > 100: # 추측 값이 1~100 사이인가?
                raise ValueError
            if guess_num == answer_num: # 추측값과 정답값이 같다
                print("성공")
                break
            elif try_round == 5: # 추측 실패 후 현재 5라운드 인가?
                print("실패")
            else: # 추측 실패 후 업,다운을 말해주라
                print("업" if guess_num < answer_num else "다운")
                print("\n")

        try_round += 1

    except ValueError:
        print("1~100 사이 수를 입력해주세요")

업다운 인공지능 만들기

1. 개요

이번에는 컴퓨터가 사용자가 입력한 값을 맞출 차례이다. 몇 개의 차이점을 빼고는 모든 것은 위에 프로그램과 동일하다. 그 차이점이란 컴퓨터는 random 함수를 이용하여 답을 추측할 수 없다(컴퓨터의 머리를 코드 해줘야 한다). 그리고 컴퓨터는 제한 없이 값을 추측할 수 있다. 사용자는 컴퓨터의 추측 값을 보고 알맞게 , 다운을 입력하여야 한다.

2. 로직

1️⃣ input()으로 1~100 사이 정답 값을 사용자로부터 입력 받는다.
2️⃣ 예외처리) 정수외 입력 값(소수, 문자열 등)을 받을 경우 다시 입력 값을 받게 한다.
3️⃣ 컴퓨터는 추측 가능 범위를 계속 반씩 좁혀가며 답을 맞춘다.(이진탐색)
4️⃣ 컴퓨터의 추측값을 보고 사용자가 , 다운 을 잘 입력하도록 한다.

3. 코드

# 정답 값 생성(사용자)
while True:
    try:
        target_num = int(input())
        if type(target_num) == type(1): # 정수형 타입만 입력 받는다
            if 1 <= target_num <= 100: # 1~100 사이만 입력 받는다
                break
            else:
                raise ValueError
    except ValueError:
        print("1~100 사이 수를 입력해주세요")

try_round = 1
guess_num = -1
max_num = 100
min_num = 1

# 정답 추측(컴퓨터)
while guess_num is not target_num:  # 추측값과 정답값이 같지 않으면
    print(f"\n{try_round} 라운드") # 현재 라운드 출력

    guess_num = (max_num + min_num) // 2    # 추측 가능한 범위에서 중간 값를 말한다(이진탐색)
    print(guess_num)

    if guess_num == target_num: # 추측값과 정답값이 같다
        print("성공")
    else: # 추측값과 정답값이 다르다
        is_up = target_num > guess_num  # 추측값이 "업"인가?

        while True:
            user_answer = input()
            real_answer = "업" if is_up else "다운"
            if user_answer == real_answer: # 유저 답이 정확한가 검증
                break
            print("거짓말 하면 안돼요!")

        if is_up:   # 추측한 값에 따라 추측 가능 범위를 줄인다
            min_num = guess_num + 1
        else:
            max_num = guess_num - 1

    try_round += 1

총평

제한시간(오후 4시까지) 안에 요구사항에 맞는 프로그램을 만들어야 하는 개인 프로젝트는 배움에 조금 더 긴장감과 도전을 준다. 또 튜터님과 다른이들은 어떻게 문제를 풀어나가고 코드 짜는 지 보는 것도 재미가 있다. 위에 2번째 문제에서 1~100까지 수를 리스트에 담아 매 라운드마다 그 리스트의 크기를 반씩 줄이면서(list slice) 풀어나가는 것도 흥미로운 코드였다. 앞으로도 문제를 풀면서 그리고 다른 분들의 풀이를 보면서 많이 배웠으면 좋겠다.