python 기초 #5

이용·2021년 7월 14일
0

python

목록 보기
5/5

28. 프로젝트: 로또 시뮬레이션

Rules

로또는 주 1회씩 열립니다. 하지만 한 사람이 한 회차에 여러 번 참여할 수도 있습니다.

번호는 1부터 45까지 있는데요. 주최측에서는 매주 6개의 '일반 당첨 번호'와 1개의 '보너스 번호'를 뽑습니다. 그리고 참가자는 1번 참여할 때마다 서로 다른 번호 6개를 선택합니다.

당첨 액수는 아래 규칙에 따라 결정됩니다.

  1. 내가 뽑은 번호 6개와 일반 당첨 번호 6개 모두 일치 (10억 원)
  2. 내가 뽑은 번호 5개와 일반 당첨 번호 5개 일치, 그리고 내 번호 1개와 보너스 번호 일치 (5천만 원)
  3. 내가 뽑은 번호 5개와 일반 당첨 번호 5개 일치 (100만 원)
  4. 내가 뽑은 번호 4개와 일반 당첨 번호 4개 일치 (5만 원)
  5. 내가 뽑은 번호 3개와 일반 당첨 번호 3개 일치 (5천 원)

필요 함수

  1. generate_numbers: 파라미터로 정수 n을 받습니다. 무작위로 1과 45 사이의 서로 다른 번호 n개를 뽑고, 그 번호들이 담긴 리스트를 리턴합니다.
    참가자의 번호를 뽑는 데에도 쓰이고, 보너스를 포함한 당첨 번호 7개를 뽑는 데에도 쓰입니다.
# generate_numbers

from random import randint

def generate_numbers(n):
    numbers = []

    while len(numbers) < n:
        num = randint(1, 45)
        if num not in numbers:
            numbers.append(num)

    return numbers

# 예시 결과 출력
print(generate_numbers(6))
  1. draw_winning_numbers: 일반 당첨 번호 6개와 보너스 번호 1개가 포함된 리스트를 리턴합니다. 일반 당첨 번호 6개는 정렬되어 있어야 하고, 보너스 번호는 마지막에 추가하면 됩니다.
def draw_winning_numbers():
    winning_numbers = generate_numbers(7)
    return sorted(winning_numbers[:6]) + winning_numbers[6:]
  1. count_matching_numbers: 파라미터로 리스트 list_1과 리스트 list_2를 받고, 두 리스트 사이에 겹치는 번호 개수를 리턴합니다.
def count_matching_numbers(numbers, winning_numbers):
    count = 0

    for num in numbers:		#list_1의 각 원소를 본다.
        if num in winning_numbers: 	#해당 원소가 list_2에 있는지 확인한다.
            count += 1

    return count
  1. check: 참가자의 당첨 금액을 리턴합니다.
def check(numbers, winning_numbers):
    count = count_matching_numbers(numbers, winning_numbers[:6])
    bonus_count = count_matching_numbers(numbers, winning_numbers[6:])

    if count == 6:
        return 1000000000
    elif count == 5 and bonus_count == 1:
        return 50000000
    elif count == 5:
        return 1000000
    elif count == 4:
        return 50000
    elif count == 3:
        return 5000
    else:
        return 0

29. 프로젝트: 숫자 야구 게임

Rules

  • 컴퓨터는 0과 9 사이의 서로 다른 숫자 3개를 무작위로 뽑습니다. 예를 들어서 컴퓨터가 523을 뽑을 수도 있고 674를 뽑을 수도 있는 거죠.
  • 사용자는 컴퓨터가 뽑은 숫자의 값과 위치를 맞추어야 합니다.
  • 컴퓨터는 사용자가 입력한 숫자 3개에 대해서, 아래의 규칙대로 스트라이크(S)와 볼(B)의 개수를 알려줍니다.
    1. 숫자의 값과 위치가 모두 일치하면 S입니다.
    2. 숫자의 값은 일치하지만 위치가 틀렸으면 B입니다.
    3. 예를 들어 컴퓨터가 123을 뽑았다고 가정합시다. 사용자가 135를 입력하면, 1S(1의 값과 위치가 일치) 1B(3의 값만 일치)입니다.
  • 기회는 무제한입니다. 하지만 몇 번의 시도 끝에 맞췄는지 기록됩니다.
  • 3S(숫자 3개의 값과 위치를 모두 맞춘 경우)가 나오면 게임이 끝납니다.

진행 방식

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

def generate_numbers():
    numbers = []

    while len(numbers) < 3:
        new_number = randint(0, 9)
        if new_number not in numbers:
            numbers.append(new_number)

    return numbers

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

        if num < 0 or num > 9:
            print("0에서 9까지의 수를 입력해 주세요!")
        elif num in new_guess:
            print("중복되는 숫자입니다. 다시 입력하세요.")
        else:
            new_guess.append(num)

    return new_guess

def get_score(guess, answer_list):
    strike_count = 0
    ball_count = 0

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

    return strike_count, ball_count

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

while True:
    user_guess = take_guess()
    s, b = get_score(user_guess, ANSWER)

    print("{}S {}B\n".format(s, b))
    tries += 1

    if s == 3:
        break

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

0개의 댓글