状态机在RPG游戏中的应用举例

来源:互联网 发布:es7 js 注解功能 编辑:程序博客网 时间:2024/05/17 02:45

状态机分两种:

(1) Moore状态机: 输出只和当前所处状态有关,而与输入的内容无关。

(2) Mealy状态机:输出与当前所处状态和输入的内容均有关。


状态机要求必须有终节点,当到达综态时,状态机停止。

有限状态机 = 状态 + 事件 + 转换 + 动作


例如RPG中的城门:

状态:Opened,Closed,Unlocked,Locked

事件:openDoor,closeDoor,lockDoor,unlockDoor

转换:两个状态之间的变换;

动作:可以执行的原子操作。

State.java

package hello;public enum State {OPENED,CLOSED,LOCKED,UNLOCKED}
Event.java
public enum Event {open,close,lock,unlock}


FsmState.java

package hello;/** * 城门状态机 * @author henry * */public class FsmState {/** * 当前所处状态 */private State state;public FsmState() {this.state = State.OPENED;}public void enterOpened() {System.out.println("enterOpened");}public void enterLocked() {System.out.println("enterLocked");}public void enterUnlocked() {System.out.println("enterUnlocked");}public void enterClosed() {System.out.println("enterClosed");}/** * 处理事件 * @param e */public void processEvent(Event e) {State oldState = state;boolean pass = false;switch (state) {case CLOSED : {if (e == Event.open) {state = State.OPENED;pass = true;} else if (e == Event.lock) {state = State.LOCKED;pass = true;}} break;case UNLOCKED : {if (e == Event.lock) {state = State.LOCKED;pass = true;} else if (e == Event.open){state = State.OPENED;pass = true;}} break;case LOCKED : {if (e == Event.unlock) {state = State.UNLOCKED;pass = true;}} break;case OPENED : {if (e == Event.close) {state = State.CLOSED;pass = true;}} break;default : break;}if (oldState == state && !pass) {return;}switch (state) {case CLOSED : {enterClosed();} break;case UNLOCKED : {enterUnlocked();} break;case LOCKED : {enterLocked();} break;case OPENED : {enterOpened();} break;default : break;}}}


Test.java

package hello;public class Test {public static void main(String[] args) {FsmState doorState = new FsmState();doorState.processEvent(Event.close);doorState.processEvent(Event.lock);doorState.processEvent(Event.unlock);doorState.processEvent(Event.open);}}


输出结果:

enterClosedenterLockedenterUnlockedenterOpened



0 0
原创粉丝点击