回复:移植一个扑克游戏踩过WinCC Unified脚本系统(JavaScript)的一些坑以及利用VScode编写代码技巧

已锁定

keepdoing

  • 帖子

    21
  • 精华

    0
  • 被关注

    19

论坛等级:游侠

注册时间:2018-12-10

普通 普通 如何晋级?

发布于 2021-02-03 08:44:12

10楼

展开查看
以下是引用匆匆又三年在2021-02-02 17:55:59的发言 >7楼

厉害,可以讲一下思路让大家学习学习

好吧,大家对思路都比较感兴趣。具体如下

第一部分 PLC端

1 、实现逻辑判定和出牌是否允许全部在PLC端实现,主要函数可以参考这下面这个文件(这个是经典wincc、的,同样适用于wincc Unified版)。

PLC以及WinCC中部分函数说明.pdf

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版本未实现





评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC WinCC / Panel

共有32939条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。