선발대

[스파르타] 파이썬 프로젝트1: 업다운 게임 본문

스파르타코딩클럽/활동 내용

[스파르타] 파이썬 프로젝트1: 업다운 게임

신선한 스타트 2021. 12. 20. 13:45

이번주 월, 화, 수요일은 개인프로젝트로 파이썬 게임을 만든다.

모범답안의 # [!] 표시는 내가 기록한 부분이다.

 

게임설명

 

(1) 업다운 게임 만들기

 컴퓨터가 1~100 중 랜덤으로 임의의 수를 정하면, 플레이어가 정답을 맞히는 게임이다. 정답보다 작으면 컴퓨터는 '업'이라고 출력하고, 크다면 '다운'이라고 출력해서 힌트를 준다. 플레이어는 힌트를 보고 5회 안에 정답을 맞혀야 한다.

 

(2) 업다운 인공지능 만들기

 이번에는 반대로 플레이어가 1~100 중 임의의 수를 정하고 컴퓨터가 정답을 맞히는 게임이다. 컴퓨터의 답이 정답보다 작으면 플레이어가 '업'을 입력하고, 크다면 '다운'을 입력하여 힌트를 준다. 컴퓨터는 횟수 제한 없이 정답을 맞힐 때까지 계속 시도한다.

 

 

내가 작성한 코드, 모범답안

 

(1) 업다운 게임 만들기

 

## 내가 작성한 코드
import random

#1. 컴퓨터가 1~100 중에서 임의의 수(C)를 랜덤으로 정한다.
C = random.randrange(1, 101)

#2. 플레이어가 input 함수를 통해서 임의의 수(P)를 입력한다.
P = int(input())

#3. 주어진 기회 횟수
N = 5

#4. 컴퓨터는 C, P를 비교하고 '업', '다운' 중 하나를 출력함. 
for i in range(0, N):
    if C > P:
        print('업')
        P = int(input())
    elif C < P:
        print('다운')
        P = int(input())
    else:
        print('성공')
        break

#5. for문만 돌아가고 답을 맞추기 못했다면 '실패' 출력
if i == N-1:
    print('실패')

 

## 모범답안

from random import randrange # [!] 이렇게 함수를 따로 가져오는구나

#1. 컴퓨터가 1~100 중에서 임의의 수(C)를 랜덤으로 정한다. (random 패키지에 있는 randrange 함수를 사용할 것)
c = randrange(1, 101)

success = 0

#4. 2\~3번을 4번 더 반복한다. (즉, 2\~3번을 for문으로 작성할 것)
for i in range(0, 5):
    #2. 플레이어가 input 함수를 통해서 임의의 수(P)를 입력한다.
    #3. 컴퓨터는 C와 P를 비교하여, 업 / 다운 중 하나를 출력한다. (비교할 때는 if문을 사용할 것, '업' 혹은 '다운'은 print 문을 통해서 출력할 것)
    p = int(input())
    if c > p:
        print('업')
    elif c < p:
        print('다운')
    else:
        success = 1 [!] 성공, 실패는 반복문 밖에서 입력할 수 있다.
        break

#5. 플레이어가 총 5회 안에 컴퓨터가 정한 수를 맞히면 '성공', 맞히지 못하면 '실패' 를 출력한다.
if success == 1:
    print('성공')
else:
    print('실패')

 

후기

 

  • 반복문 안에 성공했을 때의 조건만 입력한다. ex) success = 1
  • 모든 반복문이 다 돌아간 뒤에 success의 값만 확인하면 성공, 실패를 알 수 있다.
  • 나는 반복문 횟수를 기준으로 성공, 실패를 구분했는데, 그러면 반복문 조건 변경시 적용이 어려울 것 같다. 

 


 

(2) 업다운 인공지능 만들기

 

## 내가 작성한 코드

#1. 플레이어가 input 함수로 1~100 중 임의의 수(P)를 입력한다.
P = int(input('1 ~ 100 사이의 정수를 입력하세요: '))
UP = 100 # 상한선
DOWN = 0 # 하한선
C = int(round((UP+DOWN)/2)) # 중간값
N = 0 # 사용한 기회 횟수

#2. 1~100 이외의 수를 입력할 경우, 다시 입력한다.
while True:
    if P > 100 or P < 1:
        P = int(input('1 ~ 100 사이의 정수를 입력하세요: '))
    else:
        break

#3. 컴퓨터는 플레이어가 정한 수(P)를 가장 빨리 맞힐 수 있도록 수(C)를 말한다.
#4. 플레이어는 C, P를 비교하여 업, 다운 중 하나를 입력한다.
while P != C:
    if P > C:
        ans = input(f'({N+1}회차, C = {C}), 정답[업/다운]: ')
		
        #6. 거짓으로 입력하면 재입력하게 한다.
        while ans != '업':
            ans = input('다시 입력하세요. 정답[업/다운]: ')
		
        #5-1. '다운'은 상한선이 '다운'값이라는 뜻이니까, 다시 범위의 중간에서 C 출력한다.
        DOWN = C
        C = int(round((UP+DOWN)/2))
        N += 1


    elif P < C:
        ans = input(f'({N+1}회차, C = {C}), 정답[업/다운]: ')

        while ans != '다운':
            ans = input('다시 입력하세요. 정답[업/다운]: ')

        #5-2. '업'은 하한선이 '업'값이라는 뜻이니까, 다시 범위의 중간에서 C 출력한다.
        UP = C
        C = int(round((UP+DOWN)/2))
        N += 1

if P == C:
    print(f'{N}번만에 성공')

 

## 모범답안

from math import floor # [!] 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())

#컴퓨터는 플레이어가 정한 수(P)를 가장 빨리 맞힐 수 있도록 수(C)를 말한다. (randrange는 사용하지 말 것)
#플레이어는 C와 P를 비교하여, 업 / 다운 중 하나를 입력한다. (비교할 때는 if문을 사용할 것)
#컴퓨터는 플레이어가 말하는 업 / 다운에 따라서, 해당될 수 없는 수들을 제거해나간다.
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('거짓말하지 마세요!')

 

후기

 

  • [!] 어차피 입력은 1~100 까지의 수이므로 리스트를 만들어서 그 외는 재입력하게 한다.
  • [!] if문에 c == p 경우만 루프문을 나갈 수 있게 했다. 
  • [!] 나는 중첩된 if문을 주로 썼는데, 조건들은 따로 쓰는 게 좋을 것 같다.
Comments