IT’s Portfolio

[Python] 코딩도장 - 주사위 도박 본문

Development Study/Python

[Python] 코딩도장 - 주사위 도박

f1r3_r41n 2021. 1. 4. 19:55
728x90
반응형

문제의 내용 조금 바꿔봤음

1. 딜러 한명 유저 3명 한 번에 게임 진행

2. 유저들의 초기 자본 5만원 고정

 

import random

# 주사위 두 개
dice1 = random.Random()
dice2 = random.Random()

def bat_money() -> list:
    while 1:
        # user_bat = []
        print("\n==================")
        msg = input("유저 세 명의 배팅 금액을 띄어쓰기로 구분해 입력해주세요.\n(1 ~ 10,000)>>> ")

        if len(msg.split(" ")) == 3:
            '''
            for i in msg.split(" "):
                if 1 <= int(i) <= 10000:
                    user_bat.append(int(i))
                    
            복잡한 for~if문 세 줄을 한 줄로 줄임
            '''
            user_bat = [int(i) for i in msg.split(" ") if 1 <= int(i) <= 10000]

            # 리스트의 길이가 3이 되면 while 문에서 빠져나오기
            if len(user_bat) == 3:
                break
            else:
                print("배팅 금액의 범위는 1 ~ 10,000 입니다.")
        else:
            print("세 명의 배팅 금액을 입력해주세요.")

    return user_bat

def game(user_num, user_money, user_bat_money) -> list:
    print(f"Dealer VS User{user_num}\nUser{user_num} 잔고: {user_money:,}원\nUser{user_num}이 배팅한 금액: {user_bat_money:,}원")

    # 딜러의 주사위 결과
    dealer_dices = dice_rule("Dealer", dice1.randint(1, 6), dice2.randint(1, 6))

    # 유저의 주사위 결과
    user_dices = dice_rule(f"User{user_num}", dice1.randint(1, 6), dice2.randint(1, 6))

    # 주사위 숫자에 따른 결과 계산
    result = match(dealer_dices, user_dices)

    # 반환받은 result 값에 대한 출력문
    if result == "Draw":
        print("Draw\n")
    elif "D" in result:
        print("Dealer Win\n")
    elif "U" in result:
        print(f"User{user_num} Win\n")

    return [result, user_num, user_bat_money]

def match(d, u) -> str:
    # 인자로 받은 딜러와 유저의 주사위 결과 타입으로 반환 메시지 결정
    if type(d) == int and type(u) == int:
        msg = "D 1" if d > u else "U 1"
    elif type(d) == list:
        if type(u) == list:
            msg = "D 2" if d[0] > u[0] else "Draw" if d[0] == u[0] else "U 2"
        else:
            msg = "D 2"
    else:
        msg = "U 2"

    return msg

def dice_rule(name, num1, num2):
    print(f"{name}'s Result: {num1} / {num2}")

    # 만약 두 개의 주사위 눈금이 같지 않으면 그냥 합해서 반환시켜줌
    if not num1 == num2:
        return num1 + num2
    # 같으면 리스트 형식으로 반환시켜줌
    else:
        return [num1, num2]

def print_rank(user):
    user_rank = {}

    for i in range(len(user)):
        # 인자로 받은 리스트에 0보다 작은 값이 있으면 0으로 초기화시킴
        if user[i] < 0:
            user[i] = 0
        print(f"User{i+1} 잔고: {user[i]:,}원")
        # 순위 알고리즘 (잔고가 0이면 순위가 아닌 파산으로 나타남)
        r = 1
        for j in range(len(user)):
            if user[i] == 0:
                r = "파산"
            elif user[i] < user[j]:
                r = r+1

        user_rank[f"User{i+1}"] = r

    # 출력
    for i in user_rank:
        if type(user_rank[i]) == str:
            print(f"{i}: {user_rank[i]}")
        else:
            print(f"{i}: {user_rank[i]}위")

if __name__ == "__main__":
    print(f"유저 세 명의 초기 자본금은 50,000원 입니다.")
    user = [50000, 50000, 50000]

    # 게임 횟수 10번
    cnt = 0
    while cnt < 10:
        user_bat = bat_money()

        print(f"==================\nGame{cnt+1}!\n==================")

        for i in range(len(user)):
            if user[i] <= 0:
                user[i] = 0
                print(f"* User{i+1}은 자본금을 모두 잃었기에 배팅 금액 {user_bat[i]:,}원은 0원으로 조정됩니다 *\n")
                continue
            else:
                result = game(i+1, user[i], user_bat[i])
                
                # 반환받은 문자열의 규칙을 사용하여 배팅금 정산
                if "D" in result[0]:
                    user[result[1] - 1] = user[result[1] - 1] - result[2] * int(result[0].split(" ")[1])
                elif "U" in result[0]:
                    user[result[1] - 1] = user[result[1] - 1] + result[2] * int(result[0].split(" ")[1])
        '''
        bankruptcy = []
        
        for i in range(len(user)):
            if user[i] <= 0:
                bankruptcy.append(i)
        
        복잡한 for~if문 네 줄을 한 줄로 줄임
        '''
        # 잔고가 0 이하면 해당 유저 번호 리스트에 추가
        bankruptcy = [i for i in range(len(user)) if user[i] <= 0]
        
        # 만약 리스트의 길이가 있다면 파산 여부 출력
        if bankruptcy:
            for i in bankruptcy:
                print(f"User{i+1} ", end="파산 ")
        
        # 만약 리스트 길이가 2가 되면 바로 게임 종료
        if len(bankruptcy) == 2:
            break

        cnt = cnt + 1

    print("\n==================\nGame Result!\n==================")
    print_rank(user)
728x90
반응형
Comments