Programmer's Diary/Python

[Python] 2022-02-07 개인 Project _ 로또 시뮬레이션 게임

powerstone 2022. 2. 12. 15:31
728x90
# 1. 모드 선택 (1.자동, 2.반자동, 3.수동)
# 2. 모드 별 번호 뽑기
#   2-1. 자동 모드 - 번호 6개 랜덤 추출
#   2-2. 반자동 모드 - 1~5개 번호 입력 받고 나머지 번호 5~1개 랜덤 추출
#   2-3. 수동 모드 - 6개 번호 입력 받기
# 3. 로또 번호 추첨
# 4. 당첨 결과 판정
# 5. 등수에 따른 당첨금 출력
import random

# 0. 입력 받는 경우 q를 누르면 프로그램을 종료
def quit(inputStr):
    if inputStr == 'q':
        exit("프로그램을 종료합니다.")

# 1. 모드 선택 (1.자동, 2.반자동, 3.수동)
def modeSelect():
    while True:
        print("*" * 50)
        print("모드를 선택해 주세요.")
        modeNumber = input("1.자동, 2.반자동, 3. 수동 => ")
        quit(modeNumber)
        # 입력된 값이 숫자가 아니면 모드 다시 입력 받기
        if not modeNumber.isdigit():
            print("1, 2, 3 중에 선택해 주세요.")
            continue
        modeNumber = int(modeNumber)
        # 입력된 값이 숫자이지만 1, 2, 3 외의 값이 입력되면 다시 입력 받기
        if modeNumber < 1 or modeNumber > 3 :
            print("1, 2, 3 중에 선택해 주세요.")
            continue
        break
    return modeNumber
# 2. 모드 별 번호 뽑기
def myNumber(modeNumber):
    myNumberList = list()
    # 2-1. 자동 모드 - 번호 6개 랜덤 추출
    if modeNumber == 1:
        myNumberList = random.sample(range(1, 46), 6)
    # 2-2. 반자동 모드 - 1~5개 번호 입력 받고 나머지 번호 5~1개 랜덤 추출
    elif modeNumber == 2:
        # 번호 몇 개를 수동으로 입력할지 저장
        while True:
            print("반자동 모드입니다.")
            inCount = input("번호 몇 개를 입력하시겠습니까? ")
            quit(inCount)
            # 입력된 값이 숫자가 아니면 모드 다시 입력 받기
            if not inCount.isdigit():
                print("1 ~ 5 중에 선택해 주세요.")
                continue
            inCount = int(inCount)
            # 입력된 값이 숫자이지만 1 ~ 5 외의 값이 입력되면 다시 입력 받기
            if inCount < 1 or inCount > 5:
                print("1 ~ 5 중에 선택해 주세요.")
                continue
            break
        # 수동으로 입력할 갯수만큼 번호 입력 받기
        count = 1   # 입력받은 번호 갯수
        while True:
            number = input("{}개 숫자 중 {}번째 숫자 : ".format(inCount, count))
            quit(number)
            # 숫자가 입력되었는지 확인
            if not number.isdigit():
                print("1 ~ 45 사이 숫자를 입력하세요.")
                continue
            number = int(number)
            # 숫자가 입력되었으면, 1 ~ 45 사이 숫자가 맞는지 확인
            if number < 1 or number > 45:
                print("1 ~ 45 사이 숫자를 입력하세요.")
                continue
            # 1~45 사이 숫자이지만 이전에 받은 번호와 중복되진 않는지 확인
            if number in myNumberList:
                print("번호가 중복되었습니다. 다시 입력해 주세요.")
                continue
            myNumberList.append(number)
            if count == inCount:    # 입력하려던 번호 갯수를 채우면 입력 종료
                break
            else:
                count = count + 1
        # 나머지 번호는 자동으로 추출
        count = 1
        while True:
            number = random.randint(1, 45)
            if number in myNumberList:
                continue
            else:
                myNumberList.append(number)
            if count == 6 - inCount:
                break
            else:
                count = count + 1
    # 2-3. 수동 모드 - 6개 번호 입력 받기
    elif modeNumber == 3:
        count = 1  # 입력받은 번호 갯수
        while True:
            number = input("6개 숫자 중 {}번째 숫자 : ".format(count))
            quit(number)
            # 숫자가 입력 되었는지 확인
            if not number.isdigit():
                print("1 ~ 45 사이 숫자를 입력하세요.")
                continue
            number = int(number)
            # 숫자가 입력 되었으면, 1 ~ 45 사이 숫자가 맞는지 확인
            if number < 1 or number > 45:
                print("1 ~ 45 사이 숫자를 입력하세요.")
                continue
            # 1~45 사이 숫자이지만 이전에 받은 번호와 중복되진 않는지 확인
            if number in myNumberList:
                print("번호가 중복되었습니다. 다시 입력해 주세요.")
                continue
            myNumberList.append(number)
            if count == 6:  # 입력하려던 번호 갯수를 채우면 입력 종료
                break
            else:
                count = count + 1
    else:
        print("모드 선택이 잘못되었습니다.")
    # 번호 6개 모두 제대로 다 저장되었으면 오름차순 정렬
    myNumberList.sort()
    # print(myNumberList)
    return myNumberList

# 3. 로또 번호 추첨
def lottoNumber():
    lottoNumberList = random.sample(range(1, 46), 6)    # 번호 6개 추첨
    lottoNumberList.sort()
    # 보너스 번호 추첨
    while True:
        bonus = random.randint(1, 45)
        if bonus in lottoNumberList:
            continue
        else:
            lottoNumberList.append(bonus)
            break
    print("$" * 50)
    print("이번주 로또 번호는??")
    for i in lottoNumberList[:6]:
        print(i, end=" ")
    print("+", bonus)
    print("$" * 50)
    return lottoNumberList

# 4. 당첨 결과 판정하여 등수 리턴
def result(myNumberList, lottoNumberList):
    count = 0 # 맞는 번호 갯수
    print("내 로또 번호 : ", end="")
    # 맞는 번호에 동그라미(괄호) 쳐서 출력해주면서 맞는 갯수 카운트
    for i in myNumberList:
        if i in lottoNumberList[:6]:
            print("({})".format(i), end=" ")
            count = count + 1
        elif i == lottoNumberList[6]:
            print("(({}))".format(i), end=" ")
        else:
            print(i, end=" ")
    print("")
    print("$" * 50)
    # 맞는 번호 갯수에 따른 등수 판정
    rank = 0
    if count == 6:
        rank = 1
    elif count == 5:
        if lottoNumberList[6] in myNumberList:
            rank = 2
        else:
            rank = 3
    elif count == 4:
        rank = 4
    elif count == 3:
        rank = 5
    elif count <= 2 or count >= 0:
        rank = 6
    else:
        print("error 발생")
        exit()
    if rank <= 5:
        print("{}등 당첨을 축하드립니다!!!".format(rank))
    else:
        print("아쉽게도 낙첨 되셨습니다 ㅠㅠ")
    return rank

# 5. 등수에 따른 당첨금 출력
def prize(rank):
    if rank == 1:
        print("당첨금은 1,000,000,000 원 입니다.")
    elif rank == 2:
        print("당첨금은 80,000,000 원 입니다.")
    elif rank == 3:
        print("당첨금은 2,000,000 원 입니다.")
    elif rank == 4:
        print("당첨금은 50,000 원 입니다.")
    elif rank == 5:
        print("당첨금은 5,000 원 입니다.")
    elif rank == 6:
        print("다음 기회에...")
    else:
        print("rank값 error")
        exit()

while True:
    modeNumber = modeSelect()
    myNumberList = myNumber(modeNumber)
    lottoNumberList = lottoNumber()
    rank = result(myNumberList, lottoNumberList)
    prize(rank)
    quit(input("계속하려면 Enter, 종료하려면 'q'를 입력하세요 : "))
-------------------------------------------------------------------------------------------
<추가하고 싶은 것>
1. 로또를 산 랜덤 수의 사람 수 저장(4000만~5000만) => people
2. 총 판매액 = 1,000원 * people
3. 총 당첨금 = 총 판매액 * 50%
4. 랜덤 수의 사람들의 로또 당첨 판정하여 등수 별로 몇 명 당첨되었는지 저장
5. 그에 따른 등수별 당첨 금액 지정
    - 1등 : 총 당첨금 중 4,5등 총 당첨금을 제외한 75%
    - 2등 : 총 당첨금 중 4,5등 총 당첨금을 제외한 12.5%
    - 3등 : 총 당첨금 중 4,5등 총 당첨금을 제외한 12.5%
    - 4등 : 50,000원
    - 5등 : 5,000원
6. 내 로또 번호는 몇 등에 얼마 받을지 출력
728x90