恭喜,你发布的帖子
发布于 2021-02-03 08:44:12
10楼
厉害,可以讲一下思路让大家学习学习
好吧,大家对思路都比较感兴趣。具体如下
第一部分 PLC端
1 、实现逻辑判定和出牌是否允许全部在PLC端实现,主要函数可以参考这下面这个文件(这个是经典wincc、的,同样适用于wincc Unified版)。
2、最核心的最主要的就是根据出牌的张数来枚举判定牌的类型,然后返回牌的类型以及为了方便判断大小,利用了一套计算将选择合规的牌进行了和运算。
其他PLC端代码请参照文件,需要注意的是识别牌类型里面我用的背景数据有重复,因为正常你只能是一种张数来判定,不存在既是3张,又是4张。这点算是合理利用,否在在300plc中可能数据块超过大小。
3、洗牌实现原理(FB11)是每次从(剩余)牌堆中随机抽取一张放到新牌堆里面,循环遍历直到将牌堆完全转移到新牌堆里。
4、发牌原理:这个很简单,以为上面洗牌已经随机了所这里采取的直接每人17张一次性到位
5、齐牌:将手牌按照从小到大排序(FB12,采用的冒泡算法)这里排序了是方便玩家查看,和后面计算。
第二部分 Wincc端大部分适用于经典Wincc和UNIfied.(请注意经典Wincc和UNIfied版本中函数名称可能有点不一样,编程语言差异可能函数数量也有差异)
1、wincc (unified)端动态化实现,主要是利用plc端数据结构中牌的状态、以及脚本来实现的。如果不嫌麻烦可以给每一张牌编写脚本,这个效率有点低,所以我没有采用。因为wincc(Unified)不支持运行时动态创建对象和绑定事件,所以我不得不先创建好20*5+3个牌的图形对象。
2、 实际创建过程,我分了5组,每次先创建一个(比如a_0)并在里面写好需要的脚本(每个脚本一模一样)然后直接复制,wincc会自动命名为a_1、a_2、.......
3、经典Wincc版本和UNIfied在创建图片对象时候有点区别,经典Wincc我采用的脚本返回图片,这样我真的能达到只创建一个图片对象,但是Unified我利用脚本返回设置的方式有点问题,所以这里我用了图形列表,导致我这里手动修改了20*5次,还好这个相对简单。
4、这种有个核心的函数GetRowColByObjectName。这个实现根据传进去的对象名称返回Row,Col,其中Row代表玩家或者已出牌。Col代表牌对应的张数。
其他很多函数都依赖比如GetPokerStatusByRowCol等,需要注意的函数实现根据变量的命名来写,且变量命名要有一定规则,否则类似GetPokerStatusByRowCol这类的函数将无任何意义。
5、针对画面布局,经典版本大部分是我手动调整的,因为其支持编组以及水平、垂直均分。但是Unified全部是利用脚本来实现的布局,不支持编组和均分,手动调整略麻烦。
6、画面刷新主要是依赖画面每次加载初次刷新布局,和在属性中周期调用实现,另外每次点击出牌和不出按钮也动态刷新一次。
7、动态显示主要是依赖Row中牌的总张数与Col的值来进行比较,来实现隐藏于显示。
8、至于当前已出和上一轮已出,依赖于PLC数据结构中的loc的值。
9、经典版本的音效实现采用的调用外部程序发送命令来实现。Unified版本未实现
请填写推广理由:
分享
只看
楼主