热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Generator函数在流程掌握中的运用

扯蛋做了两年的Nodejs全栈开辟,不知道为何跑来做游戏呢(大概是厦门nodejs不好找事情吧)。用的是网易的pomelo的游戏框架。现接办了一个棋牌游戏:二十一点,不懂的划定规矩

扯蛋

做了两年的Nodejs全栈开辟,不知道为何跑来做游戏呢(大概是厦门nodejs不好找事情吧)。用的是网易的pomelo的游戏框架。现接办了一个棋牌游戏:二十一点,不懂的划定规矩的能够自行百度。
《Generator函数在流程掌握中的运用》

二十一点游戏流程图

《Generator函数在流程掌握中的运用》

近况

接办了平台其他相干游戏的代码,流程掌握互相交织,不轻易明白、难以保护。(多是刚做游戏的缘由,假如你们有什么更简朴的流程掌握要领,迎接分享)。我下意识的就想到了Generator函数的特征,以为用着这里异常轻易(之前一向以为这是个异步流程掌握中过分性子的要领,而且须要合营co才自动实行,所以基础没现实用过,koa不算…)

Js Generator函数完成流程掌握的长处

1、易于明白、便于开辟、轻易保护(看到Generator函数如同看到了流程图)
2、开辟思路清晰(每一个阶段(函数)只须要关注本身的营业逻辑,完成直接下一步,而不必管下一步要做什么操纵)
3、不存在会遗忘消灭定时器的题目

简朴说下Generator的实行流程

1、Generator函数实行后会天生一个Iterator。(注重不要加new)(简朴说就是个有next要领的对象,实行一次返回一个值)
2、每次next的挪用,实行yield背面的语句并返回该语句实行的效果
3、每次只实行一个yield,背面的语句不会再实行、只要在实行下次next函数时才实行。(能够应用这点做定时器的清算事情,而且能够说基础不会遗忘)
4、yield* 能够将背面的变量(可迭代的变量,字符串、数组等)中的值一个一个的返回。实行一次返回个中的一个值

Js Generator函数圆满完成流程图代码(部份)

class EsydProcess {
constructor(room) {
/**
* ...其他变量
*/
this.flow = this.flowGenerator();
}
*['flowGenerator']() {
yield this.betStage(); // 下注
this.betStageTimer && clearTimeout(this.betStageTimer);// 下注阶段完成后直接消灭定时器。完整不必忧郁定时器没有被清算的状况
yield this.assignStage(); // 分牌
if (this.esydCard.getCardPoint(this.bankerCards[0]) === 1) {
yield this.ensureStage(); // 保险
this.ensureStageTimer && clearTimeout(this.ensureStageTimer);
if (this.esydCard.getCardType(this.bankerCards) !== CardTypes.BLACK_JACK) {
yield* this.operateStage(); // 操纵
}
} else {
yield* this.operateStage(); // 操纵
}
yield this.settleStage(); // 结算
}
*['operateStage']() {
// 关照进入玩家操纵阶段
this.noticeChangeStage(esydConsts.gameStage.OPERATE_STAGE);
let players = this.players;
for (let uid in players) {
let player = players[uid];
// 操纵第一副牌
yield this.changeOperatingPlayer(player);
player.getCurCardInfo().isStop = true;
this.operateTimer && clearTimeout(this.operateTimer);
if (player.isSperated) {
// 假如有一副牌,操纵第二副牌
player.curCardsIndex = 1;
yield this.changeOperatingPlayer(player);
player.getCurCardInfo().isStop = true;
this.operateTimer && clearTimeout(this.operateTimer);
}
}
yield this.bankerOperate(); // 农户操纵
}
// 转到下个阶段
nextStage() {
process.nextTick(() => {
this.flow.next();
});
} // 最先游戏
start(seats) {
/**
* ...
*
*/
// 第一次next,直接进入下注阶段。全部流程走完游戏终了
this.nextStage();
} betStage(){
// 进入下注阶段
this.noticeChangeStage(esydConsts.gameStage.BET_STAGE);
/**
* 其他操纵
*/
this.betStageTimer = setTimeout(() => {
this.betStageTimer = null;
// 超时,直接进入下一步。没有下注的玩家运用默许底注
this.nextStage();
}, esydConsts.stageTime.BET_STAGE);
}
assignStage(){
/**
* ...
* 分牌操纵,完成直接下一步
*/
this.nextStage();
}
ensureStage(){
/**
* ...
* 种种操纵,如关照客户端、最先超时定时器等。操纵完后直接下一步就Ok了。只须要专注当前函数的功用,完成直接下一步
*/
this.nextStage();
}
// 监听用户下注操纵
userBetOperateListener(uid){ /**
* ...
* 搜检是不是在下注阶段,不是不能下注、纪录每一个玩家下注等
*/

// 纪录已下注的玩家
this.betedPlayers[uid] = true;
if (Object.keys(this.betedPlayers).length === this.seatCount) {
// 假如一切玩家都押注终了,
this.nextStage();
}
} /**
* 其他函数...
*/
}

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
author-avatar
卢健波_785
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有