TIL | 파이썬 시뮬레이션#2

vel.Ash·2022년 4월 3일
0
post-thumbnail

숫자 야구 프로젝트

컴퓨터 0-9사이 3개 숫자 뽑기

사용자는 숫자의 값과 위치를 맞춰야함

입력한 숫자 3개 스트라이크와 볼 개수 알려줌

-숫자와 위치 모두 일치하면 S, 숫자만 맞으면 B

-기회는 무제한 , 3S가 나오면 숫자 끝납니다.

진행 방식

  1. "0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다."가 출력됩니다.
  2. "숫자 3개를 하나씩 차례대로 입력하세요."가 출력됩니다.
  3. "1번째 숫자를 입력하세요: "가 출력되고, 사용자로부터 입력을 받습니다. 마찬가지로 "2번째 숫자를 입력하세요: "와 "3번째 숫자를 입력하세요: "가 출력되고, 사용자로부터 각각 입력을 받습니다. 만약 사용자가 중복되는 숫자를 입력하거나 범위에서 벗어나는 숫자를 입력하면, 사용자로부터 입력을 다시 받습니다.
  4. 사용자가 올바르게 숫자 3개를 입력하면, 규칙에 따라 "*S *B"가 출력됩니다.
  5. 3S가 아닌 경우, 2번부터 다시 진행합니다.
  6. 사용자가 3S를 달성하면, "축하합니다. *번 만에 숫자 3개의 값과 위치를 모두 맞추셨습니다."가 출력됩니다. 그리고 게임은 종료됩니다.

1. 0과 9사이에 서로다른 숫자 3개를 뽑기

(리스트로 생성, random,randint사용, while문, if 사용)+ "0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.” 출력

import random

# 숫자야구 정답 추출 함수
def generate_numbers():
    numbers = []

    while len(numbers) <= 2:
        number = random.randint(0, 9)
        if number not in numbers:
            numbers.append(number)

    print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
    return numbers

2.숫자 3개를 차례대로 입력

(input) 단, 0-9사이의 정수만 입력하도록!
→ 사용자의 입력 숫자 리스트에 저장(append) → S B 출력되도록
-3개의 input 조건식 xx 반복 넘 많음 → while 반복문으로 사용해서 쓰기

def take_guess():
    user_numbers = []
    print("숫자 3개를 하나씩 차례대로 입력하세요.\n")

    while len(user_numbers) <=2:
        answer = int(input("{}번째 숫자를 입력하세요: ".format(len(user_numbers) + 1)))
        if 0 <= answer <= 9 and answer not in user_numbers:
            user_numbers.append(answer)
        elif 0 <= answer <= 9 and answer in user_numbers:
            print("중복되는 숫자입니다. 다시 입력하세요.\n")
        else:
            print("범위를 벗어나는 숫자입니다. 다시 입력하세요.\n")

    return user_numbers

<모범답안>

def take_guess():
    print("숫자 3개를 하나씩 차례대로 입력하세요.")

    new_guess = []
    while len(new_guess) < 3:
        new_num = int(input("{}번째 숫자를 입력하세요: ".format(len(new_guess) + 1)))

        if new_num < 0 or new_num > 9:
            print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
        elif new_num in new_guess:
            print("중복되는 숫자입니다. 다시 입력하세요.")
        else:
            new_guess.append(new_num)

    return new_guess

3.점수계산

스트레이크식 → 인덱스이용 1,2,3, 비교해서 S점수 내기, 볼점수 내기 for문 → in 이용(for문 )

def get_score(guesses, solution):
    strike_count = 0
    ball_count = 0
    for i in range(3):
        if guesses[i] == solution[i]:
            strike_count += 1
    for n in guesses:
        if n in solution:
            ball_count += 1

    return strike_count, ball_count

# 테스트
s_1, b_1 = get_score([2, 7, 4], [2, 4, 7])
print(s_1, b_1)

s_2, b_2 = get_score([7, 2, 4], [2, 4, 7])
print(s_2, b_2)

<모범답안> 반복문 한번만 돌면 좋으니까~~

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

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

    return strike_count, ball_count
s_count, b_count = get_score(user_answer, ANSWER)
print("{}B {}S".format(s_count, b_count))

4.합치고 응용

일단 답안 리스트, 입력리스트, 함수사용 확인 → while문 사용해서 계속 사용자가 다 맞을 때까지 반복할 수 있도록 ...완성!

import random

# 숫자야구 정답 추출 함수
def generate_numbers():
    numbers = []

    while len(numbers) <= 2:
        number = random.randint(0, 9)
        if number not in numbers:
            numbers.append(number)

    print("0과 9 사이의 서로 다른 숫자 3개를 랜덤한 순서로 뽑았습니다.\n")
    return numbers

# 사용자 정답 입력 함수
def take_guess():
    user_answer = []
    print("숫자 3개를 하나씩 차례대로 입력하세요.\n")

    while len(user_answer) <=2:
        answer = int(input("{}번째 숫자를 입력하세요: ".format(len(user_answer) + 1)))
        if 0 <= answer <= 9 and answer not in user_answer:
            user_answer.append(answer)
        elif 0 <= answer <= 9 and answer in user_answer:
            print("중복되는 숫자입니다. 다시 입력하세요.\n")
        else:
            print("범위를 벗어나는 숫자입니다. 다시 입력하세요.\n")

    return user_answer

# 점수 계산 함수
def get_score(guesses, solution):
    strike_count = 0
    ball_count = 0
    for i in range(3):
        if guesses[i] == solution[i]:
            strike_count += 1
    for n in guesses:
        if n in solution:
            ball_count += 1
    ball_count -= strike_count

    return strike_count, ball_count

# 여기서부터 게임 시작!
ANSWER = generate_numbers()
tries = 0
while True:
    user_answer = take_guess()
    s_count, b_count = get_score(user_answer, ANSWER)
    print("{}S {}B".format(s_count, b_count))
    tries += 1

    if s_count == 3:
        break

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

0개의 댓글