Trying Something
Hello, loves!
A small idea about the Denizen state machine. Tout le monde déteste l’IA.
Here’s Denizen:
class Denizen:
def __init__(self, *, name,
initial_sayings=None,
gift=None):
if initial_sayings is None:
initial_sayings = ['Hmm...']
self.name = name
self.initial_sayings = NameSayer.cycle(self.name, initial_sayings)
self.gift = gift
self.say = 0
self.gift = gift
self.state = 'seeking'
def interact(self, interactor):
if self.state == 'seeking':
self.seeking(interactor)
elif self.state == 'satisfied':
self.satisfied(interactor)
else:
interactor.announce(message='Buzz: "Impossible Situation"')
return False
def seeking(self, interactor):
if interactor.has('flower'):
if self.gift:
interactor.announce(message='Buzz: "Oh thank you!"')
interactor.announce(message='Buzz: "Here\'s something you may need."')
interactor.receive_content(self.gift)
self.state = 'satisfied'
else:
interactor.announce(self.initial_sayings.saying)
def satisfied(self, interactor):
interactor.announce(message = 'Buzz: "I\'m just a happy little bee!')
We can get rid of the conditional and the strings, like this:
class Denizen:
def __init__(self, *, name,
initial_sayings=None,
gift=None):
if initial_sayings is None:
initial_sayings = ['Hmm...']
self.name = name
self.initial_sayings = NameSayer.cycle(self.name, initial_sayings)
self.gift = gift
self.say = 0
self.gift = gift
self.state = self.seeking
def interact(self, interactor):
self.state = self.state(interactor)
return False
def seeking(self, interactor):
if interactor.has('flower'):
if self.gift:
interactor.announce(message='Buzz: "Oh thank you!"')
interactor.announce(message='Buzz: "Here\'s something you may need."')
interactor.receive_content(self.gift)
return self.satisfied
else:
interactor.announce(self.initial_sayings.saying)
return self.seeking
def satisfied(self, interactor):
interactor.announce(message = 'Buzz: "I\'m just a happy little bee!')
return self.satisfied
We set state to the method for that state, make each state method return the next state, and i interact, just execute the current state.
That seems better to me. Does it seem better to you?
See you next time!