Created
November 9, 2018 01:59
-
-
Save frame-lang/bbfbb23c7b5ae3f61c3f9e06fe4e57fc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//-------------------------------------------------// | |
// // | |
// FMN // | |
// // | |
//-------------------------------------------------// | |
// Original source is course material for cs4731 at Georgia Institute of Technology | |
// Author: Dr. Stephen Lee-Urban | |
// see https://www.cc.gatech.edu/~surban6/2016-cs4731/lectures/2016_06_02_DecisionMaking_FSM.pdf | |
#GaTech_cs4731_fsm3 | |
-interface- | |
no_percept | |
predator | |
no_predator | |
hungry | |
hungry_food | |
-machine- | |
$Idle | |
|predator| ->> $Flee ^ | |
|hungry| ->> $FindFood ^ | |
$Search => $FindFood | |
|hungry_food| ->> $Eat ^ | |
$Eat => $FindFood | |
|hungry| ->> $Search ^ | |
$FindFood | |
|predator| ->> $Flee ^ | |
|no_percept| ->> $Idle ^ | |
$Run => $Flee | |
|hungry_food| ->> $RunSearch ^ | |
$RunSearch => $Flee | |
|hungry| ->> $Run ^ | |
$Flee | |
|no_percept| ->> $Idle ^ | |
|no_predator| ->> $FindFood ^ | |
//-------------------------------------------------// | |
// // | |
// Implementation // | |
// // | |
//-------------------------------------------------// | |
class FrameEvent { | |
var _msg:String | |
var _params:Object | |
var _return:Object | |
FrameEvent(msg:String, params:Object = null) { | |
_msg = msg | |
_params = params | |
} | |
} | |
//-------------------------------------------------// | |
class GaTech_cs4731_fsm3 { | |
/********************************** | |
-interface- | |
predator | |
predator_hungry | |
hungry | |
hungry_food | |
***********************************/ | |
func predator() { _state(new FrameEvent("predator")) } | |
func predator_hungry() { _state(new FrameEvent("predator_hungry")) } | |
func hungry() { _state(new FrameEvent("hungry")) } | |
func hungry_food() { _state(new FrameEvent("hungry_food")) } | |
// -machine- | |
var _state(e:FrameEvent) = Idle | |
/********************************** | |
$Idle | |
|predator| ->> $Flee ^ | |
|hungry_food| ->> $Eat ^ | |
|hungry| ->> $Search ^ | |
***********************************/ | |
func GatherTreasure(e:FrameEvent) { | |
if (e._msg == "monsterInSight") { | |
_state = Flee | |
return | |
} | |
} | |
/********************************** | |
$Flee | |
|predator_hungry| ->> $FleeSearch ^ | |
***********************************/ | |
func Flee(e:FrameEvent) { | |
if (e._msg == "predator_hungry") { | |
_state = FleeSearch | |
return | |
} | |
} | |
/********************************** | |
$Search | |
|predator| ->> $Flee ^ | |
|hungry_food| ->> $Eat ^ | |
|predator_hungry| ->> $FleeSearch ^ | |
***********************************/ | |
func Search(e:FrameEvent) { | |
if (e._msg == "predator") { | |
_state = Flee | |
return | |
} | |
if (e._msg == "hungry_food") { | |
_state = Eat | |
return | |
} | |
if (e._msg == "predator_hungry") { | |
_state = FleeSearch | |
return | |
} | |
} | |
/********************************** | |
$Eat | |
|predator| ->> $Flee ^ | |
|hungry| ->> $Search ^ | |
***********************************/ | |
func Eat(e:FrameEvent) { | |
if (e._msg == "predator") { | |
_state = Flee | |
return | |
} | |
if (e._msg == "hungry") { | |
_state = Search | |
return | |
} | |
} | |
/********************************** | |
$FleeSearch | |
|predator| ->> $Flee ^ | |
***********************************/ | |
func FleeSearch(e:FrameEvent) { | |
if (e._msg == "predator") { | |
_state = Flee | |
return | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment