본문 바로가기
dev/python

[python] 파이썬 자판기 (Vending Machine)

by 최연탄 2020. 12. 4.
728x90
반응형

C언어 자판기 v1.3

파이썬으로 자판기 만들기

import time
import json
from typing import Dict


config_item_list = [
    { 'id': 1, 'name': '참깨라면', 'price': 1000 },
    { 'id': 2, 'name': '햄버거', 'price': 1500 },
    { 'id': 3, 'name': '콜라', 'price': 800 },
    { 'id': 4, 'name': '핫바', 'price': 1200 },
    { 'id': 5, 'name': '초코우유', 'price': 1500 },
    { 'id': 0, 'name': '종료' }
]


class VendingMachine:
    def __init__(self):
        self.items = json.loads(json.dumps(config_item_list))
        self.selected_item = None
        self.item_amount = 1

    def power_on(self) -> None:
        while True:
            if not self.do_order():
                break

            total_price = self.do_calculation(self.selected_item, self.item_amount)
            self.do_pay(total_price)

        self.power_off()

    def power_off(self) -> None:
        self.print_stdout('잘가~')

    def do_order(self) -> bool:
        self.print_menu()
        self.selected_item = self.get_item_with_id(self.select_item())

        if self.selected_item is None:
            self.print_stdout('메뉴에 없는 항목입니다')
            time.sleep(1)
            return self.do_order()

        if self.selected_item.get('id') is 0:
            return False
        else:
            self.item_amount = self.select_amount()
            return True

    def do_calculation(self, item: Dict, amount: int) -> int:
        total_price = self.calculate_total_price(item, amount)
        self.print_stdout(f'{total_price}원 입니다')

        return total_price

    def do_pay(self, price: int, is_first_time: bool = True) -> None:
        inserted_money = self.insert_money(is_first_time)
        change = self.calculate_change(price, inserted_money)

        self.print_stdout(f'{-change}원이 부족합니다' if change < 0 else f'잔돈은 {change}원 입니다')
        time.sleep(1)

        if change < 0:
            self.do_pay(price, False)

    def calculate_total_price(self, item: Dict, amount: int) -> int:
        return item.get('price') * amount

    def calculate_change(self, price: int, money: int) -> int:
        return money - price

    def select_item(self) -> int:
        return self.get_int_from_stdin('메뉴 번호를 입력해 주세요')

    def select_amount(self) -> int:
        return self.get_int_from_stdin('수량을 입력해 주세요')

    def insert_money(self, is_first_time: bool) -> int:
        prompt = '' if is_first_time else '다시 '
        prompt += '돈을 넣어 주세요'
        return self.get_int_from_stdin(prompt)

    def get_item_with_id(self, id_value: int) -> Dict:
        for item in self.items:
            if item.get('id') is id_value:
                return item

        return None

    def get_int_from_stdin(self, prompt: str) -> int:
        try:
            return int(input(f'\n<<< {prompt}: '))
        except:
            print('\nXXXXX 숫자만 입력해 주세요 XXXXX\n')
            return self.get_int_from_stdin(prompt)

    def print_menu(self) -> None:
        print('\n----- 메뉴 -----')

        for item in self.items:
            description = f'({item.get("id")}) {item.get("name")}'
            description += f' - {item.get("price")}원' if 'price' in item else ''
            print(description)

    def print_stdout(self, prompt: str) -> None:
        print('\n>>>', prompt)


vending_machine = VendingMachine()
vending_machine.power_on()

 

  • 입력 순서
    1. 메뉴 선택
    2. 수량 입력
    3. 가격 확인
    4. 가격 지불
    5. 잔돈 확인
  • 특징
    • json 값으로 자유로이 메뉴 편집
    • 클래스 사용
    • 예외처리 재귀지옥
반응형

댓글