당우 일기장

1.개인과제 )파이썬 업다운게임 만들기 2 (ai 버전) 본문

내일배움캠프

1.개인과제 )파이썬 업다운게임 만들기 2 (ai 버전)

당우 2021. 12. 21. 18:31

이번에는 반대로 내가 생각한 숫자를 컴퓨터가 맞추는 방식으로 만들어보았습니다.

게임 규칙은 동일하나 이번에는 컴퓨터가 맞추는 방식입니다 

 

#이번문제는 과제에 랜덤함수를 사용하지 말라는 글이 명시되어있어 제한시간내 풀이를 성공하지못하여

해설을 참조하였습니다 ㅜㅜ

 

from math import floor

num_list = range(1, 101)

#플레이어가 input 함수를 통해서 1~100 중 임의의 수(P)를 입력한다. (1~100 이외의 수를 입력할 경우, 다시 입력하도록 할 것)
p = int(input())
while p not in num_list: # p < 1 or p > 100
    print('1~100 사이의 수를 입력해주세요.')
    p = int(input())


while True:
    c = num_list[floor(len(num_list)/2)]
    print('컴퓨터 :', c)

    if c == p:
        print('성공')
        break

    p_ud = input('업? 다운? ')
    if p > c and p_ud == '업':
        num_list = num_list[num_list.index(c)+1:]
    elif p < c and p_ud == '다운':
        num_list = num_list[:num_list.index(c)]
    else:
        print('사실이아닙니다.')

 

 

 

먼저 math 함수를 사용할것이기때문에 위에 임포트를 해줍니다

 

그리고 컴퓨터가 랜덤한숫자를 출력하는것이 아닌 업 다운을 통해 최소한의 횟수를 사용해

숫자를 맞출수있게 만들게 해야하서 랜덤함수는 사용하지않았습니다.

 

먼저 내가 생각한 숫자를 입력해주어야하므로 p = int(input()) 를 사용하고

1 이상 100미만의 값만을 입력해 주어야하므로 p를  not in num_list 로 안에 넣어줍니다

 

그리고 while 문을 사용해  반복문을 만들어주고

게임에서의 컴퓨터가 최소한의 값 을 사용해 문제를 풀어야하므로

c 에서 num_list 를 반씩 나누어서 풀이를할수있게하였습니다

또한 나눌때 정수만을 출력해야하므로 floor 를 사용하였습니다

 

 

예를들어서 제가 70을 숫자를고른다면  

먼저 컴퓨터는 1~101 의 중앙 값인 51 을 출력합니다

그다음 제가 업 이라고 답을하면 

num_list.index(c)+1: 를 사용하여51을 포함한 아래의 값을 제외시켜줍니다

그다음 또 반복문을 통하여 중앙 값을 찾게되고

이번에는 다운이라했으니

:num_list.index(c) 를 사용하여 76 이상의 값은 제외시키면서

또 중앙의값을 출력하게됩니다.

 

이런식으로 반복을하며 반, 반의반, 반의반의반 씩 줄여나가면서 

결국 정답을 찾게되어 컴퓨터가 정답을 맞출수있게 하였습니다. 

 

if c == p:
    print('성공')
    break

또한 컴퓨터가 출력한 값이 제가생각한 값 과 같다면 컴퓨터는 성공을 출력하고 반복문을 종료할수있게 만들었습니다!

 

 

 

+ 알아두면 좋은 tmi

index 

index 함수는 배열에서 값의 위치를 찾아주는 함수이고  중복된 값이 있으면 가장 최소의 위치를 리턴 한다고합니다

math.floor() 

floor 함수는 실수를 입력하면내림하여 정수를 반환하는 함수라고합니다

값을 나누었을때 실수의 바닥의 수인 바로 아래 정수로 내림합니다.