728x90
반응형
파이썬으로 자판기 만들기
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()
- 입력 순서
- 메뉴 선택
- 수량 입력
- 가격 확인
- 가격 지불
- 잔돈 확인
- 특징
- json 값으로 자유로이 메뉴 편집
- 클래스 사용
- 예외처리 재귀지옥
반응형
'dev > python' 카테고리의 다른 글
[python] 파이썬 디지털 숫자 그리기 (1) | 2020.12.10 |
---|---|
[python] 파이썬 구구단 (0) | 2020.12.04 |
[python] 파이썬 랜덤함수 사용하기 (randrange, choice, shuffle) (0) | 2020.12.04 |
[python] 파이썬 파일 존재여부 확인 (exists, isfile, isdir) (0) | 2020.12.01 |
[python] 파이썬 날짜/시간 형식 맞춰 출력하기 (date, time) (1) | 2020.11.30 |
댓글