SpecialistOff.NET / Вопросы / Статьи / Фрагменты кода / Резюме / Метки / Помощь / Файлы
НазадМетки: python
Here’s the simple vending machine, (code only roughly converted):
# StateMachine/vendingmachine/VendingMachine.py
# Demonstrates use of StateMachine.py
import sys
sys.path += ['../stateMachine2']
import StateMachine
class State:
def __init__(self, name): self.name = name
def __str__(self): return self.name
State.quiescent = State("Quiesecent")
State.collecting = State("Collecting")
State.selecting = State("Selecting")
State.unavailable = State("Unavailable")
State.wantMore = State("Want More?")
State.noChange = State("Use Exact Change Only")
State.makesChange = State("Machine makes change")
class HasChange:
def __init__(self, name): self.name = name
def __str__(self): return self.name
HasChange.yes = HasChange("Has change")
HasChange.no = HasChange("Cannot make change")
class ChangeAvailable(StateMachine):
def __init__(self):
StateMachine.__init__(State.makesChange, {
# Current state, input
(State.makesChange, HasChange.no) :
# test, transition, next state:
(null, null, State.noChange),
(State.noChange, HasChange.yes) :
(null, null, State.noChange)
})
class Money:
def __init__(self, name, value):
self.name = name
self.value = value
def __str__(self): return self.name
def getValue(self): return self.value
Money.quarter = Money("Quarter", 25)
Money.dollar = Money("Dollar", 100)
class Quit:
def __str__(self): return "Quit"
Quit.quit = Quit()
class Digit:
def __init__(self, name, value):
self.name = name
self.value = value
def __str__(self): return self.name
def getValue(self): return self.value
class FirstDigit(Digit): pass
FirstDigit.A = FirstDigit("A", 0)
FirstDigit.B = FirstDigit("B", 1)
FirstDigit.C = FirstDigit("C", 2)
FirstDigit.D = FirstDigit("D", 3)
class SecondDigit(Digit): pass
SecondDigit.one = SecondDigit("one", 0)
SecondDigit.two = SecondDigit("two", 1)
SecondDigit.three = SecondDigit("three", 2)
SecondDigit.four = SecondDigit("four", 3)
class ItemSlot:
id = 0
def __init__(self, price, quantity):
self.price = price
self.quantity = quantity
def __str__(self): return `ItemSlot.id`
def getPrice(self): return self.price
def getQuantity(self): return self.quantity
def decrQuantity(self): self.quantity -= 1
class VendingMachine(StateMachine):
changeAvailable = ChangeAvailable()
amount = 0
FirstDigit first = null
ItemSlot[][] items = ItemSlot[4][4]
# Conditions:
def notEnough(self, input):
i1 = first.getValue()
i2 = input.getValue()
return items[i1][i2].getPrice() > amount
def itemAvailable(self, input):
i1 = first.getValue()
i2 = input.getValue()
return items[i1][i2].getQuantity() > 0
def itemNotAvailable(self, input):
return !itemAvailable.condition(input)
#i1 = first.getValue()
#i2 = input.getValue()
#return items[i1][i2].getQuantity() == 0
# Transitions:
def clearSelection(self, input):
i1 = first.getValue()
i2 = input.getValue()
ItemSlot is = items[i1][i2]
print (
"Clearing selection: item " + is +
" costs " + is.getPrice() +
" and has quantity " + is.getQuantity())
first = null
def dispense(self, input):
i1 = first.getValue()
i2 = input.getValue()
ItemSlot is = items[i1][i2]
print(("Dispensing item " +
is + " costs " + is.getPrice() +
" and has quantity " + is.getQuantity()))
items[i1][i2].decrQuantity()
print ("Quantity " +
is.getQuantity())
amount -= is.getPrice()
print("Amount remaining " +
amount)
def showTotal(self, input):
amount += ((Money)input).getValue()
print("Total amount = " + amount)
def returnChange(self, input):
print("Returning " + amount)
amount = 0
def showDigit(self, input):
first = (FirstDigit)input
print("First Digit= "+ first)
def __init__(self):
StateMachine.__init__(self, State.quiescent)
for(int i = 0 i < items.length i++)
for(int j = 0 j < items[i].length j++)
items[i][j] = ItemSlot((j+1)*25, 5)
items[3][0] = ItemSlot(25, 0)
"""
buildTable(Object[][][]{
::State.quiescent, # Current state
# Input, test, transition, next state:
:Money.class, null,
showTotal, State.collecting,
::State.collecting, # Current state
# Input, test, transition, next state:
:Quit.quit, null,
returnChange, State.quiescent,
:Money.class, null,
showTotal, State.collecting,
:FirstDigit.class, null,
showDigit, State.selecting,
::State.selecting, # Current state
# Input, test, transition, next state:
:Quit.quit, null,
returnChange, State.quiescent,
:SecondDigit.class, notEnough,
clearSelection, State.collecting,
:SecondDigit.class, itemNotAvailable,
clearSelection, State.unavailable,
:SecondDigit.class, itemAvailable,
dispense, State.wantMore,
::State.unavailable, # Current state
# Input, test, transition, next state:
:Quit.quit, null,
returnChange, State.quiescent,
:FirstDigit.class, null,
showDigit, State.selecting,
::State.wantMore, # Current state
# Input, test, transition, next state:
:Quit.quit, null,
returnChange, State.quiescent,
:FirstDigit.class, null,
showDigit, State.selecting,
)
"""