lution88

[#파이썬] 프로젝트_1_UP-DOWN 게임 만들기 본문

개발일지

[#파이썬] 프로젝트_1_UP-DOWN 게임 만들기

lution88 2021. 12. 21. 22:02

[#파이썬] 프로젝트_1_UP-DOWN 게임 만들기

 

내일배움캠프 2주차 첫 프로젝트는 파이썬으로 UP-DOWN 게임 만들어 보기

1) 컴퓨터가 임의의 숫자를 정하고 내가 맞춘다. (random 패키지에 있는 randrange 함수를 사용할 것)

2) 내가 임의의 숫자를 정하고 컴퓨터가 맞춘다.

 

1. 업다운 이지버전 !!

 

컴퓨터가 1~100 중 임의의 수를 정하면, 내가 숫자를 맞추는 게임이다.

  • 컴퓨터가 정한 숫자 = C_NUM
  • 내가 정한 숫자 = P_NUM

 

컴퓨터는 C_NUM 과 P_NUM 을 비교하여 "업/다운" 중 하나를 출력한다.

그걸 보고 5회 안에 정답을 맞추면 성공, 맞추지 못하면 실패이다.

 

먼저 컴퓨터가 숫자를 임의로 정하기 위해 랜덤함수를 사용한다.

import random		# 랜덤 함수 불러오기

c_num = random.randrange(1, 100)	# 1-100까지의 숫자 중 임의로 하나를 정한다.

 

다음, 내가 저 숫자를 맞추기 위해서 input() 을 불러와야 하는데,

정답 횟수 5번으로 제한하기 위해 for 반복문으로 range(5) 을 주고 코드를 작성한다.

 

game = 0					# game 값을 0 으로 주고 게임을 시작한다. 성공하면 1로 바꿔줌.

for chance in range(5):				  # 5번의 반복
	p_num = int(input(" 숫자를 입력하세요 "))  #  p_num 으로 int(input())를 통해 내 숫자를 받는다.
    
    if p_num < c_num:				  # 내 숫자가 컴퓨터 숫자보다 작다면
    	print("UP UP uP")			  # UP UP uP 출력
    
    elif p_num > c_num:				  # 내 숫자가 컴퓨터 숫자보다 크다면
    	print("DOWN DOWN DOWN")		  	  # DOWN DOWN DOWN
    
    else:					  # 그 외 c_num 과 p_num 이 서로 크지도 작지도 않다면 (같다면)
    	game = 1			     	   #  즉, 성공이면 game 값을 1로 바꿔서 
        break					# break 반복문을 끝내라.

if game == 1:
	print("성공했습니다! 축하합니다.")
else:
	print("실패했습니다! 다음기회에...")

 

반복문으로 돌리면서 조건만 잘 집어넣어 놓는다면 생각보다 어렵지 않았던 게임 만들기이다.

생각보다 짧은 시간안에 만들 수 있었다.

 

그럼 다음은 좀 더 심화된 게임을 만들어 보자!!


2. 업다운 하드 버전

 

  • 내가 1~100중 임의의 숫자를 정하면, 컴퓨터가 숫자를 맞추는 게임이다.
  • 컴퓨터는 내가 정한 수를 가장 빨리 맞힐 수 있도록 한다. (randrange는 사용하지 말 것)
  • 내가 정한 수가 컴퓨터가 말한 수보다 작으면 "업", 크면 "다운"이라고 말해준다.
  • 컴퓨터는 힌트를 토대로, 수를 맞힐때까지 계속 시도한다. 
  • 못 맞히면 "업/다운" 힌트를 계속 날려준다.

 

  • 내가 정한 숫자 = P_NUM
  • 컴퓨터가 정한 숫자 = C_NUM

!Point! 컴퓨터가 가장 빨리 맞출 수 있는 방법을 생각해 보자 : [ 이진탐색 알고리즘 ]

 

from math import floor		# floor() 버림 : 무조건 버려서 정수부분만 남긴다.

# 1-100 까지의 수를 리스트로 만든다.
num_list = range(1, 100 + 1)

# p_num 으로 내 숫자를 받는다.
p_num = int(input("1~100 사이에 숫자를 정하세요."))

while p_num not in num_list:		
## p_num가 num_list에 없을 경우 반복적으로 아래 코드를 계속 돌린다.
	print("숫자를 다시 뽑으세요")	
    p_num = int(input("1~100 사이에 숫자를 정하세요."))

# 정답을 맞힐때까지 반복문을 돌린다
while True:
	c_num = num_list[floor(len(num_list)/2)]	# 먼저 컴퓨터의 숫자를 본다. 
    print("컴퓨터의 수는 : ", c_num)			# len(100)/2 = 50, 즉 num_list[50]
    
# 만약 c_num 과 p_num 이 같다면 "성공" 을 출력하고 반복문 종료!
    if c_num == p_num:	
    print("성공입니다!")
    break
    
# 정답이 아닐 경우 업? 다운? 을 말해준다.
    up_down = input("업? 다운?")
    
# 업? 다운? 으로 컴퓨터가 판단하게 하기.
# c_num 이 p_num 보다 크고 up_down 이 "다운" 일때
# num_list 에 num_list[:num_list.index(c_num) + 1] 을 넣어준다.
# c_num 이 p_num 보다 작고 up_down 이 "업" 일때
# num_list 에 num_list[num_list.index(c_num):] 을 넣어주고,
      
    if c_num > p_num and up_down == "다운":
    	num_list = num_list[:num_list.index(c_num) + 1]		# 1
	elif c_num < p_num and up_down == "업":
    	num_list = num_list[num_list.index(c_num):]
    else: 		
    	print("거짓말")		# up_down에서 "다운" 혹은 "업"을 틀리게 말할 경우.

"이진탐색 알고리즘"을 사용해서 반으로 쪼개고 쪼개서 결국은 정답을 찾아내는 프로그램이었다.

반씩 쪼개기 때문에 원하는 값을 찾기위해 하나하나 들여다 보지 않아도 되어서 시간을 줄일수 있다는 장점이 있다.

 

처음 hard 버전 문제를 풀 때 "이진탐색 알고리즘"을 몰라서 랜덤함수를 통해 컴퓨터가 나에게 보여준 값을

내가 판단해서 1-100 범위를 점차 줄여나가면서 숫자를 찾게 만드는게 내 컨셉이였는데

코드를 작성하다보니 범위를 줄여나가는게 생각보다 쉽지 않았다.

그래서 결국 제 시간안에 코드작성 하는데 실패하고 말았다.

 

알고리즘의 중요성을 다시 한번 느끼게 되었다랄까..

 

암튼 다시한번 알고리즘공부의 중요성을 느끼게 된 프로젝트 였고,  앞으로 이런 프로젝트들로 인해 

내 공부들을 다시 되돌아 보는 시간들을 가지게 될 것 같다. 

Comments