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

本文探讨了状态机在角色扮演游戏(RPG)中的应用,分别介绍了Moore和Mealy状态机的区别,并强调了有限状态机在设计中包含的状态、事件、转换和动作要素。以RPG中的城门为例,详细阐述了不同状态(如Opened、Closed、Unlocked、Locked)以及对应事件(openDoor, closeDoor, lockDoor, unlockDoor)如何驱动状态转换和执行相关动作。" 139514343,9849913,2024年全国青少信息素养大赛图形化编程集训题解析,"['青少儿信息素养', '图形化编程', '编程挑战', '复赛', '逻辑运算']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

状态机分两种:

(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);
	}
}


输出结果:

enterClosed
enterLocked
enterUnlocked
enterOpened



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值