문제 요구사항
1. 유저에게 바로 뭐 마실지 물어보기(에스프레소, 라떼, 프라프치노)
2. report를 입력하면 자판기에 얼마나 재료가 있는지 알려주기
- off를 누르면 바로 종료
3. 유저가 선택한 음료와 자판기에 있는 재료와 비교해서 충분한지 체크하기
- 부족하면 부족한 재료 알려주기
- 충분하면 그대로 진행
4. 동전 넣기(쿼터, 다임, 니켈, 페니 미국 동전 사용)
5. 돈이 충분한지 비교하기
- 돈이 부족하면 충분한 돈이 아니라고 설명 및 자판기 종료
- 돈이 충분하면 그대로 진행
6. 음료 주기 및 잔금 출력
코드
커피 메뉴판 (coffe_menu.py)
MENU = {
"espresso": {
"ingredients": {
"water": 50,
"coffee": 18,
},
"cost": 1.5,
},
"latte": {
"ingredients": {
"water": 200,
"milk": 150,
"coffee": 24,
},
"cost": 2.5,
},
"cappuccino": {
"ingredients": {
"water": 250,
"milk": 100,
"coffee": 24,
},
"cost": 3.0,
}
}
resources = {
"water": 300,
"milk": 200,
"coffee": 100,
}
# resources['water'] -= 100
# print(resources)
main.py
from coffe_menu import resources, MENU
# TODO 사용자에게 뭘 마실지 질문하기
# 사용자 선택: 에스프레소, 라떼, 카푸치노, off, report
# def machine_report():
# """기계의 상태를 알려주는 함수"""
# print(f"water: {resources['water']}")
# print(f"resources: {resources['milk']}")
# print(f"coffe: {resources['coffee']}")
def check_enough_resources(choice):
"""커피머신에서 쟤료가 충분한지 확인하는 함수"""
if resources['water'] >= MENU[choice]['ingredients']['water']:
resources['water'] -= MENU[choice]['ingredients']['water']
else:
print("there is no water")
return False
if resources['coffee'] >= MENU[choice]['ingredients']['coffee']:
resources['coffee'] -= MENU[choice]['ingredients']['coffee']
else:
print("there is no ingredients")
return False
if resources['milk'] >= MENU[choice]['ingredients']['milk']:
resources['milk'] -= MENU[choice]['ingredients']['milk']
else:
print("there is no water")
return False
def insert_coin():
"""사용자가 자판기에 동전 넣는 함수"""
print("please put in coins")
quarters_coin = float(input("quarters: "))
dimes_coin = float(input("dimes: "))
nickles_coin = float(input("nickles: "))
pennies_coin = float(input("pennies: "))
sum_coin = quarters_coin * 0.25 + dimes_coin * 0.10 + nickles_coin * 0.05 + pennies_coin * 0.01
return sum_coin
def user_change(user_sum_coin, user_choice_coffee):
"""돈이 충분한지 확인하는 함수"""
if user_sum_coin == MENU[user_choice_coffee]['cost']:
print(f"Here is your {user_choice_coffee}☕. Enjoy!")
elif user_sum_coin >= MENU[user_choice_coffee]['cost']:
change = user_sum_coin - MENU[user_choice_coffee]['cost']
print(f"Here is your {user_choice_coffee}☕. Enjoy!")
print(f"Here is ${change} dollars in change")
else:
print("not enough money!")
while True:
user_choice = input("What would you like? (espresso/latte/cappuccino): ")
# TODO 사용자의 선택에 따라 보여주기
# 사용자 선택이 report라면 현재 커피머신 상태 보여주기
if user_choice == 'report':
print(f"water: {resources['water']}")
print(f"resources: {resources['milk']}")
print(f"coffe: {resources['coffee']}")
continue
if user_choice == 'off':
break
# TODO 사용자 선택이 음료라면, 자판기는 충분한 재료가 있는지 확인해야 함
check_enough_resources(user_choice)
# TODO 동전 넣기
# quarters = $0.25, dimes = $0.10, nickles = $0.05, pennies = $0.01
# TODO 사용자가 충분한 돈 넣었는지 확인하기
# 아니라면 “Sorry that's not enough money. Money refunded.” 출력하고 돈 반환해줌
# 만약 충분한 돈 넣었으면 커피머신 돈 추가됨
# 만약 돈을 초과하면 잔돈 반환해 줌 “Here is $2.45 dollars in change.”
# TODO 커피 만들기 & 리포트 보여주기
# 그리고 커피 만들어주기 “Here is your latte. Enjoy!”
user_change(insert_coin(), user_choice)
코드 실행사진
어떤 음료를 마실지 질문
report 입력시 자판기 상태 알려줌
그리고 다시 질문
재료가 충분하면 코인을 넣으라고 함
그리고 돈을 차례로 넣으면 계산한 뒤 음료를 마시라고 준다.
그리고 잔돈도 계산해 준다.
다시 report를 입력하면 재료가 줄어듬을 확인할 수 있다.
off를 누르고 종료하기
개발일지
함수를 많이 쓰려고 노력했는데 기계 상태를 알려주는 걸 함수로 만들었더니(report누르면 나오는 정보)
정보가 업데이트되지 않았다.. 이걸 어떻게 해결하는 방법이 있을까?
그리고 파이참을 사용하니까 스펠링 틀린 부분이 잘 나와서 좋다. 변수명 설정할때 좀 더 명시적으로 바꾸는 연습을 해야겠다.
또한 의사코드를 자세하게 쓰니까 코드를 짤 때 순서대로 술술 풀린다. 이번 코드는 딱히 순서도를 짜진 않았으나 여기서 더 추가하고 싶은 기능(예를 들어 얼마라고 알려준다던가, 쟤료를 추가하는 부분을 넣던가..)를 넣는다면 순서도를 그려서 해결해야겠다.
오늘 만난 오류
TypeError: 'str' object is not callable
이 오류는 문자열에 대해서 함수 호출을 시도했을 때 발생하는 오류이다. 문자열은 함수가 아니기 때문에 호출될 수 없다. 다음과 같은 상황에서 발생할 가능성이 높다.
- 함수나 변수 이름을 잘못 입력한 경우
- 함수나 변수 이름이 이미 사용되었는데 다른 형식(문자열 등)으로 재할당한 경우
나는 변수명을 두 번써서 나타난 오류였다. 바로 해결할 수 있는 문제여서 다행~
'개발공부 > Python' 카테고리의 다른 글
[파이썬] 가위바위보 게임 만들기(for, while, if, random활용) (0) | 2023.04.21 |
---|---|
[파이썬] while문으로 구구단 찍기, 별찍기 (0) | 2023.04.21 |
파이썬으로 숫자 맞추기 게임 만들기 (1) | 2023.04.15 |
[파이썬] 집합(=세트, Sets)_ 기능, 메서드 (1) | 2023.04.13 |
[파이썬] 튜플(Tuple) (0) | 2023.04.13 |