ts 实现 抓娃娃 状态机

const { ccclass, property } = cc._decorator;

@ccclass
export default class MainTwo extends cc.Component {

toyMachine: ToyMachine;
start() {
    //程序入口
    this.toyMachine = new ToyMachine(10) //放入十个娃娃
    console.log("------------测试开始------------")
    //测试
    this.test();

    let func = () => {
        if (this.toyMachine.getCurrentState().name === '娃娃售空') {
            console.log('娃娃已售空');
            console.log("------------测试完毕------------");
            this.unschedule(func);
        } else {
            this.test();
        }
    };

    this.schedule(func, 1);
}
test() {

    //投币开始
    console.log('投入一枚硬币')
    this.toyMachine.insertCoins()

    // 转动曲柄
    console.log('转动手柄')
    this.toyMachine.usePad()
    // 按出爪键
    this.toyMachine.pushBtn();
    // 出娃娃
    this.toyMachine.out();

    console.log(`当前库存${this.toyMachine.getCount()}`)
}

}

interface State {
name: string,
insertCoins(): void,//投币
usePad(): void, //转动手柄
pushBtn(): void, //按出爪键
out(): void, //出娃娃
}

class ToyMachine {
private noMoneyState: State //没投币 闲置
private hasMoneyState: State //有投币
private isPlayingState: State //正在玩状态
private outState: State //出娃娃
private soldOutState: State //娃娃售空

private state: State//状态
private count: number//娃娃数
constructor(count: number) {
    this.count = count;
    this.noMoneyState = new NoMoneyState(this);
    this.hasMoneyState = new HasMoneyState(this);
    this.isPlayingState = new IsPlayingState(this);
    this.outState = new OutState(this);
    this.soldOutState = new SoldOutState(this);
    if (count > 0) {
        this.setState(this.getNoMoneyState());
    } else {
        this.setState(this.getSoldOut());
    }
}

//管理当前状态的方法
public setState(state: State) {
    console.log("切换到 " + state.name + " 状态");
    this.state = state;
}
public getState() {
    return this.state;
}

//得到所有状态实例的方法
public getNoMoneyState() {
    return this.noMoneyState
}
public getHasMoneyState() {
    return this.hasMoneyState
}
public getIsPlayingState() {
    return this.isPlayingState
}
public getOutState() {
    return this.outState
}
public getSoldOut() {
    return this.soldOutState
}

//调用当前状态动作的方法
public insertCoins() {
    // 将投币脱销给当前状态
    this.state.insertCoins()
}
public usePad() {
    // 将转动手柄脱销给当前状态
    this.state.usePad()
}
public pushBtn() {
    // 将按出爪键脱销给当前状态
    this.state.pushBtn()
}
public out() {
    // 将出娃娃脱销给当前状态
    this.state.out()
}

//机器本身的逻辑
public getCount() {
    return this.count
}
public release() {
    this.count--;
    console.log('发放娃娃')
}
public getCurrentState() {
    return this.state;
}

}

class NoMoneyState implements State {
private toyMachine: ToyMachine
public name: string
constructor(toyMachine: ToyMachine) {
this.toyMachine = toyMachine
this.name = ‘无币’
}
insertCoins(): void {
console.log(‘您已投币’)
this.toyMachine.setState(this.toyMachine.getHasMoneyState())
}
usePad(): void {
console.log(‘您转动了手柄,但是没有投币’)
}
pushBtn(): void {

    console.log('您按出了爪键,但是没有投币')
}
out(): void {
    //如果没给钱就不能抓娃娃
    console.log('你需要先投币')
}

}

class HasMoneyState implements State {
private toyMachine: ToyMachine
public name: string
constructor(toyMachine: ToyMachine) {
this.toyMachine = toyMachine
this.name = ‘有币’
}
insertCoins(): void {
console.log(‘您已经投过币了’)

}
usePad(): void {
    console.log('您转动了手柄')
    this.toyMachine.setState(this.toyMachine.getIsPlayingState())
}
pushBtn(): void {
    console.log('您按出了爪键')
}
out(): void {
    console.log('你刚投币,还不能出娃娃')
}

}

class IsPlayingState implements State {
private toyMachine: ToyMachine
public name: string
constructor(toyMachine: ToyMachine) {
this.toyMachine = toyMachine
this.name = ‘游玩中’
}
insertCoins(): void {
console.log('您已经投过币了,请玩完在投币 ')
}
usePad(): void {
console.log(‘您正在转动手柄’)
}
pushBtn(): void {
console.log(‘您正在按出爪键’)
let winner = Math.random() <= 0.5
if (winner) {
console.log(‘您抓到了娃娃’)
this.toyMachine.setState(this.toyMachine.getOutState())
} else {
console.log(‘您没有抓到娃娃’)
this.toyMachine.setState(this.toyMachine.getNoMoneyState())
}
}
out(): void {
console.log(‘你正在玩,还不能出娃娃’)
}

}

class OutState implements State {
private toyMachine: ToyMachine
public name: string
constructor(toyMachine: ToyMachine) {
this.toyMachine = toyMachine
this.name = ‘出娃娃’
}
insertCoins(): void {
console.log(‘您已经投过币了,正在出娃娃,请等待’)
}
usePad(): void {
console.log(‘您已经转动过手柄了,正在出娃娃,请等待’)

}
pushBtn(): void {
    console.log('您已经按出过爪键了,正在出娃娃,请等待')
}
out(): void {
    this.toyMachine.release();
    // 改变至下一个状态
    if (this.toyMachine.getCount() > 0) { // 库存为正
        this.toyMachine.setState(this.toyMachine.getNoMoneyState()) // 设置到未投币状态
    } else {
        this.toyMachine.setState(this.toyMachine.getSoldOut()) // 库存等于小于零 设置到售罄状态
    }
}

}

class SoldOutState implements State {
private toyMachine: ToyMachine
public name: string
constructor(toyMachine: ToyMachine) {
this.toyMachine = toyMachine
this.name = ‘娃娃售空’
}
insertCoins(): void {
console.log(‘娃娃已售空,请停止投币’)
}
usePad(): void {
console.log(‘娃娃已售空,请您停止转动手柄’)
}
pushBtn(): void {
console.log(‘娃娃已售空,请您停止按出爪键’)
}
out(): void {
console.log(‘娃娃已售空,不会出现娃娃’)

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值