[Python/미니프로젝트] 숫자 야구 | randint , 사용자 정의 함수

sun_U·2023년 2월 1일
0

프로젝트

목록 보기
2/2
post-thumbnail

⚾️ 숫자 야구

[코드잇] 파이썬 응용하기

[미니 프로젝트]
본 프로젝트는 모듈, 사용자 정의 함수 개념을 적용해 숫자 야구 게임을 하는 것으로 코드잇 파이썬 응용하기 과정에 나와 있다.

0. 규칙

  • 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑는다.
  • 사용자는 컴퓨터가 뽑은 숫자의 값과 위치를 맞춰야 한다.
  • 컴퓨터는 사용자가 입력한 숫자 3개에 대해서, 아래 규칙대로 스트라이크(S)와 볼(B)의 개수를 알려준다.
    • 숫자의 값과 위치가 모두 일치하면 S
    • 숫자의 값은 일치하지만 위치가 틀렸으면 B
      ex) 컴퓨터가 1, 2, 3을 뽑았고 사용자가 1, 3, 5를 입력하면, 1S(1의 값과 위치가 일치) 1B(3의 값만 일치)
  • 기회는 무제한이나 시도 횟수는 기록됨.
  • 3S(숫자 3개의 값과 위치를 모두 맞춘 경우)가 나오면 게임 종료

1. 숫자 3개 뽑기

  • generate_numbers()
  • 무작위로 0과 9 사이의 서로 다른 숫자 3개를 뽑고, 그 숫자들이 담긴 리스트를 리턴하는 함수
from random import randint


def generate_numbers():
    numbers = []
    
    while len(numbers) < 3: #리스트에 값이 3개가 들어갈 때까지 실행
        num = randint(0,9)
        if num not in numbers: #리스트에 숫자가 없는 경우에만 추가(중복 방지)
            numbers.append(num)
    
    print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
    return numbers

테스트 결과

2. 숫자 예측하기

  • take_guess()
  • 사용자로부터 숫자 세 개를 입력받아 리스트로 리턴하는 함수
  • 숫자가 범위를 벗어나거나 중복되는 경우에 다시 입력 받도록 한다.
def take_guess():
    print("숫자 3개를 하나씩 차례대로 입력하세요.")
    new_guess = []
    
    cnt = 1
    while len(new_guess) < 3:
        num = int(input(f"{cnt}번째 숫자를 입력하세요: "))
        if num < 0 or num > 9:
            print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
        elif num in new_guess:
            print("중복되는 숫자입니다. 다시 입력하세요.")
        else:
            new_guess.append(num)
            cnt += 1
    
    return new_guess

3가지 숫자를 입력받을 때 각각의 변수를 생성하면 조건문도 반복해서 써야하므로 포매팅을 이용해 조건문은 한 번만 나오도록 했다.
while문 전에 cnt를 만들어 몇 번째 숫자인지 나타내고, 입력받은 값이 new_guess 리스트에 담기면 1씩 증가하도록 했다.
+코드잇에서는 cnt 대신 포맷에 len(new_guess) + 1를 썼다.

테스트 결과

3. 점수 계산

  • get_score(guesses, solution)
  • 사용자로부터 입력받은 숫자 3개와 컴퓨터가 뽑은 숫자 3개를 비교해 스트라이크 수와 볼 수를 알려주는 함수
def get_score(guesses, solution):
    strike_count = 0
    ball_count = 0

    for i in range(len(guesses)):
        if guesses[i] == solution[i]: #같은 위치에 같은 숫자면 +1 Strike
            strike_count += 1 
        elif guesses[i] in solution: #그렇지는 않지만 사용자가 입력한 숫자가 컴퓨터가 뽑은 숫자 중에 있다면 +1 ball
            ball_count += 1

    return strike_count, ball_count

테스트 결과

4. 합치기

  • 앞서 작성한 함수를 이용해 숫자 게임을 실행해보자.
  • 3S가 나올 때까지 반복되며 시도 횟수도 알려준다.
from random import randint


def generate_numbers():
    numbers = []
    
    while len(numbers) < 3:
        num = randint(0,9)
        if num not in numbers:
            numbers.append(num)
    
    print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
    return numbers

def take_guess():
    print("숫자 3개를 하나씩 차례대로 입력하세요.")
    
    new_guess = []
    cnt = 1
    while len(new_guess) < 3:
        num = int(input(f"{cnt}번째 숫자를 입력하세요: "))
        if num < 0 or num > 9:
            print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
        elif num in new_guess:
            print("중복되는 숫자입니다. 다시 입력하세요.")
        else:
            new_guess.append(num)
            cnt += 1
    
    return new_guess

def get_score(guesses, solution):
    strike_count = 0
    ball_count = 0

    for i in range(len(guesses)):
        if guesses[i] == solution[i]:
            strike_count += 1 
        elif guesses[i] in solution:
            ball_count += 1

    return strike_count, ball_count

# 여기서부터 게임 시작!
ANSWER = generate_numbers()
tries = 0

while True:
    guesses = take_guess()
    s, b = get_score(guesses, ANSWER)
    
    print(f"{s}S {b}B\n")
    tries += 1
    
    if s == 3:
        break
    

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

시도 횟수는 tries 변수에 담아 한 번 숫자 3개를 입력받을 때마다 1씩 증가 시킨다.
그리고 get_score() 함수로 사용자가 입력한 숫자와 컴퓨터 숫자 3개를 비교해 스트라이크와 볼 갯수를 알려준다.
스트라이크가 3이 되었을 때는 while문을 끝내고 시도 횟수를 알려준다.

숫자 야구 실행

오 두 번 만에 맞았다👀
첫 번째 시도에서 [3, 5, 6]을 입력했을 때 1S, 1B이었다.
3은 맞고 6은 위치가 다르다고 생각해 6을 두 번째 숫자로 입력하고 마지막은 그냥 생각나는 숫자로 7을 입력했는데 맞았다...!


후기
파이썬에 대한 기본 개념만 있으면 누구나 간단하게 만들 수 있다. 별거 아니지만 이론이나 강의를 따라서 코딩하는 것보다는 조금이라도 머리를 쓰는 게 훨씬 도움이 되는 것 같다. 숫자 야구는 지난번 로또 시뮬레이션과는 다르게 파이썬 콘솔창으로 실행이 돼서 쉽게 확인할 수 있지만 이것도 html, css, JS를 통해 좀 더 시각적인 재미도 있으면 좋을 것 같다.

profile
Data Engineer AI/ Metaverse :)

0개의 댓글