Language&Framework/Python

Python | 숫자 야구 게임 만들기 HW

JUNG씨 2022. 9. 11. 21:06


📍GUIDE📍

1. 사용자의 입력을 받아 n개의 중복되지 않는 랜덤한 숫자를 생성한다.
2. 프로그램이 시작 된 시간을 기록한다.
3. 사용자의 입력을 받고, 입력을 받을 때마다 try count를 1씩 더해준다.
4. 사용자 입력 x와 랜덤하게 생성 된 y 두 숫자를 비교한다.
 4-a. x의 첫 번째 숫자가 y에 포함되어 있는지 확인한다.
  * 포함되어 있지 않다면 out count + 1
 4-b. x의 첫 번째 숫자가 y에 포함되어 있다면 x의 첫 번째 숫자와 y의 첫 번쨰 숫자가 일치하는지 확인한다.
  * 일치하는 경우 strike count + 1
  * 일치하지 않는 경우 ball count + 1
 4-c. 4-a ~ 4-b를 x의 모든 자릿수를 돌 때까지 반복한다.
5. 사용자가 exit을 입력하거나 정답을 맞출 때까지 3~4의 동작을 무한하게 반복한다.
6. 사용자의 입력이 1번에서 생성한 숫자와 일치 할 경우 필요한 정보를 출력하고 프로그램을 종료한다.
 6-a. try count를 출력한다.
 6-b. 프로그램이 종료 된 시간과 프로그램이 시작 된 시간의 차를 계산해 프로그램의 실행 시간을 출력한다.
 6-c. 게임이 종료 된 시점의 날짜와 시각을 출력한다.

1. 프로그램이 랜덤으로 숫자 n개(정답인 숫자 n개)를 뽑는 함수 : make_number()

import random
import time
from datetime import datetime



#랜덤으로 생성된 숫자들을 numbers에 배열 형태로 입력해준다. 이건 컴퓨터가 랜덤으로 정하는 숫자들
def make_number():
    com_rand = list(random.sample(range(10), n))
    print(f"0과 9 사이의 서로 다른 숫자 {n}개를 랜덤하게 뽑았습니다.")
    return com_rand

🌀random.sample(sequence, a) => 리스트, 집합, range() 등 random의 범위가 될 sequence 입력 / 반환되는 리스트의 크기 a

=> random.sample() 함수를 통해 컴퓨터는 사용자가 입력한 숫자 n의 갯수만큼 랜덤으로 숫자를 뽑는다. 이 랜덤한 n개의 숫자들이 사용자가 맞춰야 하는 숫자들이다.

 

 

 

2. 사용자에게 랜덤으로 숫자를 입력받는 함수 : user_rand()

def user_rand():   #사용자가 랜덤으로 숫자를 입력하는 함수
    print(f"숫자 {n}개를 하나씩 입력하세요!")

    guess_list = []
    while len(guess_list) < n:
        guess = int(input(f"{len(guess_list)+1}번째 숫자를 입력하세요: "))

        #예외 조건 설정 if & elif/ else는 옳은 조건
        if guess < 0 or guess > 9:
            print("범위를 벗어나는 숫자입니다. 다시 입력해주세요 :)")
        elif guess in guess_list:
            print("중복된 숫자를 입력하셨습니다. 다시 입력해주세요 :)")
        else:
            guess_list.append(guess)

    return guess_list

=> guess_list에는 n개만큼의 리스트가 들어와야 하므로 len(guess_list) 가 n보다 작을때는 계속 반복문을 돌려줘야 한다. 

guess_list 배열 안에 들어가는 사용자가 입력하는 숫자를 guess라고 정의한다. 

f"{len(guess_list)+1}번째 숫자 : 숫자를 입력받기 전의 guess_list에는 아무것도 없었기 때문에 1을 더해줘야 n번째 숫자를 입력하세요 라고 화면에 출력된다.

입력받는 숫자 guess가 0~9 사이의 숫자가 아니거나 이미 guess_list에 있는 중복된 수인 경우에 다시 입력받기 위한 조건을 설정해주면 된다. 

 

3. 정답과 사용자가 입력한 숫자를 비교해서 점수를 계산하는 함수 : get_score()

def get_score(guess, answer, out):
    strike_count = 0
    ball_count = 0
    out_count = 0

    for i in range(n):
        if guess[i] == answer[i]:
            strike_count += 1   #뽑은 숫자와 일치하는 경우
        elif guess[i] in answer and guess[i] != answer[i]:
            ball_count += 1     #일치하지 않는 경우
        elif guess[i] not in answer and guess[i] != answer[i]:
            out_count += 1
    
    return f"{strike_count} STRIKE", f"{ball_count} BALL", f"{out_count} OUT"

=> get_score() 함수는 guess, answer을 인자로 받는다. guess 는 사용자가 입력한 숫자 리스트이고, answer은 정답이 담긴 리스트이다. 변수 strike_count는 정답과 사용자가 입력한 숫자가 일치하는 경우에 카운트하는 변수이고, ball_count는 숫자의 값은 일치하지만(guess[i] in answer) 위치가 일치하지 않는 경우(guess[i] != answer[i])에 카운트하는 변수이다. 

 

4. 게임 실행 부분

#게임 실행
start_time = time.time()      #프로그램이 시작된 현재 시간 저장
n = int(input())              #게임을 몇자리 숫자로 할 것인지 입력 0~9
ANSWER = make_number()        #컴퓨터가 만든 정답 랜덤 숫자들
OUT = 0                       #숫자가 일치하지 않을 때 카운트 되는 변수
try_count = 0                 #입력을 받을 때마다 1씩 증가

strike = 0 
ball = 0
out = 0

while True:
    GUESS = user_rand()
    
    strike, ball, out = get_score(GUESS, ANSWER, OUT)
    print(strike, ball, out)
    try_count += 1

    if strike == f"{n} STRIKE":   #all STRIKE 인 경우 게임종료 & break
        break


print(f"축하합니다!! {try_count}번 만에 숫자 {n}개의 값과 위치를 모두 맞추셨습니다.")

#프로그램 실행시간, 종료시각 출력
end_time = time.time()  #프로그램이 종료된 현재 시간 저장
print(f"게임 실행 시간 : {end_time - start_time:.3f}초")
print(datetime.now())

=> ANSWER 은 make_number() 함수에서 받아온 정답이고, 변수 OUT은 입력한 숫자가 일치하지 않을 경우 카운트하는 변수이다. try_count는 사용자가 정답을 맞출 때까지 반복한 횟수를 카운트해준다. 

변수 strike, ball, out은 get_score()함수를 통해 받아오는 변수들이다. 

strike가 n과 같아지면 while반복문을 중지한다! while 반복문을 한번씩 돌릴 때마다 try_count가 1씩 증가한다.

 

 

 

 

 

👩🏻‍💻p.s. : 일단 숫자야구게임의 규칙을 이해하는데도 좀 오래걸렸고, 그걸 코드로 표현하는것도 조금 힘들었다. 그동안 배웠던 파이썬 개념들과 구글링을 총동원해서 겨우 완성했다 ㅠㅡㅠ 

 

전체코드 

import random
import time
from datetime import datetime



#랜덤으로 생성된 숫자들을 com_rand에 배열 형태로 입력해준다. 이건 컴퓨터가 랜덤으로 정하는 숫자들
def make_number():
    com_rand = list(random.sample(range(n), n))
    print(f"0과 9 사이의 서로 다른 숫자 {n}개를 랜덤하게 뽑았습니다.")
    return com_rand


def user_rand():   #사용자가 랜덤으로 숫자를 입력하는 함수
    print(f"숫자 {n}개를 하나씩 입력하세요!")

    guess_list = []
    while len(guess_list) < n:
        guess = int(input(f"{len(guess_list)+1}번째 숫자를 입력하세요: "))

        #예외 조건 설정 if & elif/ else는 옳은 조건
        if guess < 0 or guess > 9:
            print("범위를 벗어나는 숫자입니다. 다시 입력해주세요 :)")
        elif guess in guess_list:
            print("중복된 숫자를 입력하셨습니다. 다시 입력해주세요 :)")
        else:
            guess_list.append(guess)

    return guess_list


def get_score(guess, answer, out):
    strike_count = 0
    ball_count = 0
    out_count = 0

    for i in range(n):
        if guess[i] == answer[i]:
            strike_count += 1   #뽑은 숫자와 일치하는 경우
        elif guess[i] in answer and guess[i] != answer[i]:
            ball_count += 1     #일치하지 않는 경우
        elif guess[i] not in answer and guess[i] != answer[i]:
            out_count += 1
    
    return f"{strike_count} STRIKE", f"{ball_count} BALL", f"{out_count} OUT"





#게임 실행
start_time = time.time() # 프로그램이 시작된 현재 시간 저장
n = int(input()) #게임을 몇자리 숫자로 할 것인지 입력 0~9
ANSWER = make_number()   #컴퓨터가 만든 정답 랜덤 숫자들
OUT = 0      #숫자가 일치하지 않을 때 카운트 되는 변수
try_count = 0 #입력을 받을 때마다 1씩 증가

strike = 0 
ball = 0
out = 0

while True:
    GUESS = user_rand()
    strike, ball, out = get_score(GUESS, ANSWER, OUT)

    print(strike, ball, out)
    try_count += 1

    if strike == f"{n} STRIKE":   #all STRIKE 인 경우 게임종료 & break
        break


print(f"축하합니다!! {try_count}번 만에 숫자 {n}개의 값과 위치를 모두 맞추셨습니다.")

#프로그램 실행시간, 종료시각 출력
end_time = time.time()  #프로그램이 종료된 현재 시간 저장
print(f"게임 실행 시간 : {end_time - start_time:.3f}초")
print(datetime.now())