파이썬 Up & Down Game (풀이)

장현웅·2023년 8월 24일
0

Up & Down Game


내용:

  1. 플레이어와 컴퓨터가 참여하는 업다운 게임을 만드세요.
  2. 프로그램은 다음과 같은 기능을 포함해야 합니다.
    • 컴퓨터는 1부터 100 사이의 랜덤한 숫자를 생성합니다.
    • 플레이어는 숫자를 입력하고, 입력한 숫자와 컴퓨터의 숫자를 비교하여 "업" 또는 "다운" 힌트를 제공합니다.
    • 플레이어가 컴퓨터의 숫자를 정확히 맞히면 시도한 횟수를 알려줍니다.
    • 플레이어가 숫자를 맞힐 때까지 위 과정을 반복합니다.

추가 도전 과제:

  1. 플레이어가 입력한 숫자가 범위를 벗어날 경우, 적절한 안내 메시지를 출력하여 유효한 범위 내의 숫자를 입력하도록 유도하세요.
  2. 플레이어가 게임을 반복하고 싶을 경우, 게임 재시작 여부를 묻고 그에 따라 게임을 초기화하거나 종료하는 기능을 추가하세요.
  3. 게임이 종료될 때 플레이어의 최고 시도 횟수를 기록하고, 다음 게임에서 이를 표시하는 기능을 구현하세요.

참고 자료:

  • 랜덤 숫자 생성을 위한 random 모듈 사용법
import random

random_number = random.randint(1, 100)

평가

  • input을 이용해서 사용자의 입력을 받을 수 있는가?
  • input으로 받은 값을 string에서 int로 바꿀 수 있는가?
  • while문을 사용하고 특정조건에서 break를 걸어서 멈출 수 있는가?
  • if문을 이용해서 조건에 따른 코드 실행을 바꿀 수 있는가?

1) 컴퓨터는 1부터 100 사이의 랜덤한 숫자를 생성합니다.

# 랜덤 번호 (= 정답인 번호) 생성

import random

answer_number = random.randint(1, 100)
print(answer_number)

# pip install로 설치 안해도 된다.
# 파이썬이 자체적으로 가지고 있는 모듈
# 별도 고유의 기능이 있는 모듈들은 쓰고 싶을 때마다 impot해서 쓰면 된다.

# 51
# 17
....


2) 플레이어는 숫자를 입력하고, 입력한 숫자와 컴퓨터의 숫자를 비교하여 "업" 또는 "다운" 힌트를 제공합니다.

# 플레이어가 숫자를 입력할 input 박스 넣기

import random

answer_number = random.randint(1, 100)
print(answer_number)

################################################
my_guess = input('1~100 사이의 숫자를 입력하세요. ')
print(my_guess)

# 
84
빈칸 커서 : 입력값이 필요한 inputbox - 입력값을 넣어줘야 넘어간다

//////////////////////////////////////////////////////////////////////////

# 입력한 숫자와 컴퓨터의 숫자(=정답인 숫자)를 비교

import random

answer_number = random.randint(1, 100)
print(answer_number)

my_guess = input('1~100 사이의 숫자를 입력하세요. ')
print(my_guess)

################################################
if answer_number == my_guess:
	print("정답입니다.")
else:
	print("오답입니다.")

#
43
빈칸 커서 : 플레이어가 추측하는 번호 입력

#
43 (랜덤 번호 = 정답 번호)
43 (43을 입력)
(Enter)

#
43
오답입니다.

# '오답입니다'가 나오는 이유
input은 입력값을 string(문자열)로 돌려주기 때문이다. 
input을 int()로 감싸줘서 입력값을 int(integer 정수)로 돌려주도록 하자.


//////////////////////////////////////////////////////////////////////////

# input 박스 int()로 감싸기

import random

answer_number = random.randint(1, 100)
print(answer_number)

my_guess = int(input('1~100 사이의 숫자를 입력하세요. '))
print(my_guess)

################################################
if answer_number == my_guess:
	print("정답입니다.")
else:
	print("오답입니다.")

//////////////////////////////////////////////////////////////////////////

# 입력한 숫자와 컴퓨터의 숫자(=정답인 숫자)를 비교해서 '업', '다운' 힌트 주기

import random

answer_number = random.randint(1, 100)
print(answer_number)

my_guess = int(input('1~100 사이의 숫자를 입력하세요. '))
print(my_guess)

################################################
if answer_number == my_guess:
	print("정답입니다.")
elif answer_number < my_guess:
	print("UP")
else:
	print("DOWN")

3) 플레이어가 숫자를 맞힐 때까지 위 과정을 반복합니다.

# 플레이어가 숫자를 맞출 때까지 반복할 수 있게 while문에 반복하고 싶은 부분들을 다 넣어준다.
# while True : 조건이 False거나 break를 하면 반복문에서 나올 수 있다.
# for 반복문 : iterable(반복 가능한)한 정수 원소를 가진 range 객체를 넣어주고 반복할 수 있다.

import random

answer_number = random.randint(1, 100)
print(answer_number)

my_guess = int(input('1~100 사이의 숫자를 입력하세요. '))
print(my_guess)

while True:
	if answer_number == my_guess:
		print("정답입니다.")
################################################
		break # 정답일 때 while 반복문이 끝나게 된다.
################################################
	elif answer_number > my_guess:
		print("UP")
	else:
		print("DOWN")

# 
31
1~100 사이의 숫자를 입력하세요. (커서) 

#
31
1~100 사이의 숫자를 입력하세요. 20 (20 입력)

#
UP
UP
UP
UP
UP
...

# 31을 입력해서 정답을 맞추면 반복문이 '정답입니다.'를 출력해주면서 반복문이 끝난다.
# 하지만 만약 answer_number보다 작은 숫자를 입력하면 "UP"이 출력되고 반복문이 다시 시작되면서 같은 조건에서 다시 "UP"이 출력되는 것이 무한 반복된다.
# while문은 break을 만나거나 조건이 False일 떄까지 계속 반복하면서 조건식의 출력값을 출력한다.
# 무한 출력을 빠져나올 떄는 CTRL+C

//////////////////////////////////////////////////////////////////////////

# 위 문제를 해결하기 위해서는 반복문이 다시 반복될 때 새로운 숫자를 입력해서 다시 조건문을 돌 수 있도록 input 박스를 while문 안에 넣어줘야한다.

import random

answer_number = random.randint(1, 100)
print(answer_number)

while True:
	my_guess = int(input('1~100 사이의 숫자를 입력하세요. '))
	if answer_number == my_guess:
		print("정답입니다.")
		break
	elif answer_number > my_guess:
		print("UP")
	else:
		print("DOWN")

#
91
1~100 사이의 숫자를 입력하세요. 90
UP

1~100 사이의 숫자를 입력하세요. 92
DOWN

1~100 사이의 숫자를 입력하세요. 91
정답입니다.

4) 플레이어가 컴퓨터의 숫자를 정확히 맞히면 시도한 횟수를 알려줍니다.

# 숫자를 입력할 때마다 입력 횟수를 저장해서 정답을 맞췄을 경우 플레이어에게 도전 횟수를 알려준다.
# (while문 밖) count = 0 (도전하기 전) count라는 변수에 0을 넣어준다.
# (while문 안) 도전할 때마다 count에 1을 더해주고 맞췄을 때 count에 저장되어 있는 값을 출력해준다.

import random

answer_number = random.randint(1, 100)
print(answer_number)

count = 0

while True:
################################################
	count = count + 1
	print(f"{count}번째 시도입니다!")
################################################
	my_guess = int(input('1~100 사이의 숫자를 입력하세요. '))
	if answer_number == my_guess:
		print("정답입니다.")
################################################
		print(f"{count}번 만에 맞췄습니다!")
################################################
		break
	elif answer_number > my_guess:
		print("UP")
	else:
		print("DOWN")

#
90
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 50
UP

2번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 99
DOWN

3번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 90
정답입니다.
3번 만에 맞췄습니다!

5) 플레이어가 입력한 숫자가 범위를 벗어날 경우, 적절한 안내 메시지를 출력하여 유효한 범위 내의 숫자를 입력하도록 유도하세요.

# 플레이어가 입력한 숫자가 정수일 경우 : 1~100 사이가 아닌 경우의 조건을 걸어서 메시지를 출력해준다.
# while 반복문 초반에 조건문을 걸어주고 만약 이 조건에 부합할 경우 반복문이 끝나지 않고 다시 처음으로 돌아가기 위해 continue를 해준다.
# 플레이어가 입력한 숫자가 정수가 아닌 경우(소수점, 문자열 등) : try except문으로 에러처리를 한다.

import random

answer_number = random.randint(1, 100)
print(answer_number)

count = 0

while True:
    count = count + 1
    print(f"{count}번째 시도입니다!")
    try:
        my_guess = int(input('1~100 사이의 숫자를 입력하세요. '))
        if my_guess > 100 or my_guess < 1:
            print('입력 범위가 아닙니다. ')
            continue
        if answer_number == my_guess:
            print("정답입니다.")
            print(f"{count}번 만에 맞췄습니다!")
            break
        elif answer_number > my_guess:
            print("UP")
        else:
            print("DOWN")
    except ValueError:
        print('정수로 입력해주세요.')

# 
58
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요. -100
입력 범위가 아닙니다. 
2번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 안녕
정수로 입력해주세요.
1~100 사이의 숫자를 입력하세요. 58
정답입니다.
3번 만에 맞췄습니다!

6) 플레이어가 게임을 반복하고 싶을 경우, 게임 재시작 여부를 묻고 그에 따라 게임을 초기화하거나 종료하는 기능을 추가하세요.

# 게임을 재시작 할 때마다 랜덤 숫자와 카운트도 리셋 되어야 하기 때문에 전체를 while 반복문 안으로 넣어준다.

import random

while True:

    answer_number = random.randint(1, 100)
    print(answer_number)

    count = 0

    while True:
        count = count + 1
        print(f"{count}번째 시도입니다!")
        try:
            my_guess = int(input('1~100 사이의 숫자를 입력하세요. '))
            if my_guess > 100 or my_guess < 1:
                print('입력 범위가 아닙니다. ')
                continue
            if answer_number == my_guess:
                print("정답입니다.")
                print(f"{count}번 만에 맞췄습니다!")
                break
            elif answer_number > my_guess:
                print("UP")
            else:
                print("DOWN")
        except ValueError:
            print('정수로 입력해주세요.')

#
57
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 57
정답입니다.
1번 만에 맞췄습니다!
92
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요.

# 정답을 맞추면, 작은 while 반복문이 break되고 자동으로 큰 while 반복문이 반복된다.
# 자동 게임 재시작 : 무한 게임

//////////////////////////////////////////////////////////////////////////

# 게임 재시작을 플레이어의 선택에 맡기기 위해 input()를 하나 넣어주자.

will_continue = input('한 판 더? (Y/N) ')

if will_continue == 'Y':
    continue
else:
    break

# 
4
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 4
정답입니다.
1번 만에 맞췄습니다!
한 판 더? (Y/N) y   
(게임 끝남)

//////////////////////////////////////////////////////////////////////////

# 만약 input의 입력값이 대문자 Y가 아니면 반복문이 break된다.
# .upper()나 .lower()로 input의 입력값을 대문자나 소문자로 통일해주자.

will_continue = input('한 판 더? (Y/N) ')

if will_continue.upper() == 'Y':
    continue
else:
    break

#
35
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 35
정답입니다.
1번 만에 맞췄습니다!
한 판 더? (Y/N) y
65
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요.

# .upper() / .lower()에서 '()' 빼먹지 않기

7) 게임이 종료될 때 플레이어의 최저 시도 횟수를 기록하고, 다음 게임에서 이를 표시하는 기능을 구현하세요.

# 최저기록은 게임이 반복할 때마다 리셋되지 않아야 하기 때문에 모든 while문 밖에 min_try라는 변수에 0을 넣어준다. (min_try = 0) 
# (작은 while문 안) 정답을 맞추면 min_count와 그 해당 게임의 count 값을 비교해서 작은 값을 min_count에 재할당하고 메시지를 출력한다.
# 첫 판의 min_count 값은 0이기 때문에 조건식을 잘 짜보자.

import random

min_try = 0

while True:

    answer_number = random.randint(1, 100)
    print(answer_number)

    count = 0

    while True:
        count = count + 1
        print(f"{count}번째 시도입니다!")
        try:
            my_guess = int(input('1~100 사이의 숫자를 입력하세요. '))
            if my_guess > 100 or my_guess < 1:
                print('입력 범위가 아닙니다. ')
                continue
            if answer_number == my_guess:
                print("정답입니다.")
                print(f"{count}번 만에 맞췄습니다!")
                if count <= min_try:
                    min_try = count
                    print(f"최저 시도 횟수 : {min_try}번")
                else:
                    print(f"최저 시도 횟수 : {count}번")
                break
            elif answer_number > my_guess:
                print("UP")
            else:
                print("DOWN")
        except ValueError:
            print('정수로 입력해주세요.')
    
    will_continue = input('한 판 더? (Y/N) ')

    if will_continue.upper() == 'Y':
        continue
    else:
    	print('---------------------------------------')
    	print(f"최저 시도 횟수 : {count}번")
        print('---------------------------------------')
        break

#
38
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 35
UP

2번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 40
DOWN

3번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 38
정답입니다.
3번 만에 맞췄습니다!
최저 시도 횟수 : 3번
한 판 더? (Y/N) Y

20
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 50
DOWN
2번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 20
정답입니다.

2번 만에 맞췄습니다!
최저 시도 횟수 : 2번
한 판 더? (Y/N) Y

46
1번째 시도입니다!
1~100 사이의 숫자를 입력하세요. 46
정답입니다.
1번 만에 맞췄습니다!
최저 시도 횟수 : 1번
한 판 더? (Y/N) N
---------------------------------------
최저 시도 기록 : 1번
---------------------------------------

랜덤숫자 출력 코드를 빼면 Up & Down Game 완성!

import random

min_try = 0

while True:

    answer_number = random.randint(1, 100)
    # print(answer_number)
    count = 0

    print('------------------------------------------------------------')
    print('Up & Down 게임을 시작합니다. 1~100 사이의 숫자를 맞춰주세요!')
    
    while True:
        count = count + 1
        print('------------------------------------------------------------')
        print(f"# {count}번째 시도")

        try:
            my_guess = int(input('숫자 입력 : '))
            if my_guess > 100 or my_guess < 1:
                print('입력 범위가 아닙니다. ')
                continue
            if answer_number == my_guess:
                print('---------------------------------------')
                print("정답입니다.")
                print(f"{count}번 만에 맞췄습니다!")
                if count <= min_try:
                    min_try = count
                    print('---------------------------------------')
                    print(f"최저 시도 기록 : {min_try}번")
                else:
                    print('---------------------------------------')
                    print(f"최저 시도 기록 : {count}번")
                break
            elif answer_number > my_guess:
                print("UP! UP! UP!")
            else:
                print("DOWN! DOWN! DOWN!")
        except ValueError:
            print('정수로 입력해주세요.')
    
    will_continue = input('한 판 더? (Y/N) ')

    if will_continue.upper() == 'Y':
        continue
    else:
        print('---------------------------------------')
        print(f"최저 시도 기록 : {count}번")
        break

                    

0개의 댓글