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(‘娃娃已售空,不会出现娃娃’)
}
}