现阶段的任务是向openspiel 中添加e一个自己的游戏

上次已经将大体的逻辑写完了,但运行时出了问题。state 为空。

Incorrect number of characters in string.
这个错误容易找,位于batter_chess.cc 的
std::unique_ptr<State> BattleChessGame::DeserializeState
不懂意思就找翻译,Deserialize 的意思是反序列化,是将 string 反序列化 为游戏的状态。batter_chess 的代码前面我基本仿照国际象棋的代码去写,后面是直接照搬 breakthrough 的代码过来改的。 那次写到这个函数的时候已经快凌晨一点了,我就偷懒了没有改
而是在breakthrough 的代码上自己注释了一些代码,想直接build 和 test 一下。
前面我判断后面几个函数可能并不重要,但是这个错误告诉我们后面几个函数都是非常重要的,只有 undoAction 这个函数你写不写影响都不大。
进一步来猜测openspiel游戏构建的逻辑.

对于 openspiel 的每一个游戏,都有 game 和 state 类。他们的关系有点复杂, 游戏有游戏状态,但我估计它只保存一个游戏状态,表示现在。
而 state 类的构造函数又有 game 对象。
我可能描述不清楚。game 类只是一个游戏的运行框架,游戏的主要逻辑还是在 state 类。state 只是游戏中的一个状态。
doApplyAction 是将动作实现,改变现有的状态,而这个函数里面又有 player 的切换。这个函数执行完之后, player 已经切换。对于 perfectInformation game, 这个游戏状态也是下一个 player 能够观察到的状态。
生成新的 Action 数组。也就是 LegalActions 。但是这个状态不能给该玩家使用,这个状态已经结束了它的生命周期。
所以 State 要序列化,变成字符串。
下一个玩家通过这个字符串反序列化一个状态。从该状态下生成一个 合法的动作数组,再挑选一个动作,然后 doApplyAction()

如此往复就是游戏的一个个回合。

所以不能够正确反序列化,所以游戏的状态那里是空, 上面的错误也触发了。

今晚遇到的第二个问题, action数组为空。问题的原因,
我使用 whitePieces, blackPieces 数组保存棋子的类型和棋子所在的状态,但是这些 Piece 没有正确的初始化,其值全部为(0, 0)
正确初始化后就没有问题了。
第三个问题
Spiel Fatal Error: /home/zhanghao/桌面/PycharmProjecr/open_spiel/open_spiel/tests/basic_tests.cc:127 action < game.NumDistinctActions()

这个我去查看了basic_tests.cc 的代码, 说是检查动作的排序,breakthrough 没有排序,所以我也没写, 加入排序后 错误消失了。

找到的一个bug
doApplyAction 没有维护 whtePieces 和 blackPieces。今天晚上先不改了,先记着。

openspiel 随笔 05.05的更多相关文章

  1. OpenSpiel 随笔 05.14

    ------------恢复内容开始------------ 这两天年总算把自己的游戏写完了,也通过了所有的测试. 我将自己的代码上传到了我的github上, 地址是 https://github.c ...

  2. 随笔编号-05 BigDecimal 处理集合

    1  创建一个BigDecimal 对象 BigDecimal Sum = new BigDecimal(0); 2  一个BigDecimal 对象,保留2位小数点 Sum.setScale(2,B ...

  3. 【2018.05.05 C与C++基础】C++中的自动废料收集:概念与问题引入

    在阅读C++语言的设计与演化一书时,作者多次提到希望能设计出一个自动废料收集,然而出于种种考虑,始终未将自动废料收集纳入标准讨论中,而是由Coder自己考虑是否在程序中实现废料收集. 当然了,许多Ja ...

  4. 什么是泛型 转载自http://www.blogjava.net/Jack2007/archive/2008/05/05/198566.html

    我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类 ...

  5. 2016/05/05 smarty ①分页 ② 查询后分页 ③缓存

    samrty  分页   查询后分页 0505fch.php <?php include("init.inc.php"); include("DBDA.php&qu ...

  6. 2016/05/05 smarty ① 登录 ②主页面 ③删除 ④让缩略信息显示完整 (补:增加 修改 )

    共  八个页面 ①login.php <?php include("init.inc.php"); $smarty->display("login.html& ...

  7. 梦想MxWeb3D,三维CAD协同设计平台 2019.05.05更新

    SDK开发包下载地址: http://www.mxdraw.com/ndetail_20140.html 在线演示网址: http://www.mxdraw.com:3000/ 1.  增加CAD绘图 ...

  8. 梦想CAD控件 2019.05.05更新

    下载地址: http://www.mxdraw.com/ndetail_20141.html 1. 增加vs2017版本控件 2. 增加windows触摸屏支持 3. 增加手写签名功能 4. 修改PL ...

  9. 2015.05.05,外语,读书笔记-《Word Power Made Easy》 15 “如何谈论事情进展” SESSION 42

    HOW TO TALK ABOUT WHAT GOES ON TEASER PREVIEW 一些以-ate结束的动词,通常表示: to exhaust([ig'zɔ:st] n. 排气,排气装置 v. ...

随机推荐

  1. 2.JAVA自带的序列化反序列化机制

  2. 如何使用NuGet package .nupkg文件?

    如果你本来就有.nupkg文件并且你只需要.dll文件的话,你可以通过打开.zip下的lib文件夹来获取. 例如:

  3. 深入理解HDFS分布式文件系统

    深入理解HDFS:Hadoop分布式文件系统: https://blog.csdn.net/bingduanlbd/article/details/51914550

  4. JAVA MD5加密算法实现与原理解析

    public static String md5Encode(String inputStr) { MessageDigest md5 = null; try { md5 = MessageDiges ...

  5. git push 提交时出错 the remote end hung up unexpectedly

    错误原因 与远程服务的连接中断,但是检查发现origin还在,可能是文件太大,缓存不够,增加缓存大小 解决方案 专案目录 >.git >config 在末尾增加如下代码 [http] po ...

  6. Spring AOP系列(三) — 动态代理之JDK动态代理

    JDK动态代理 JDK动态代理核心是两个类:InvocationHandler和Proxy 举个栗子 为便于理解,首先看一个例子: 希望实现这样一个功能:使用UserService时,只需关注自己的核 ...

  7. Go 接口类型

    接口作用 Go语言中的接口是一种类型,类似于Python中的抽象基类. Go语言中使用接口来体现多态,是duck-type的一种体现. 如,只要一个东西会叫,会走,那么我们就可以将它定义为一个动物的接 ...

  8. phpstorm中配置使用svn详细步骤

    一.搭建SVN环境 1.下载VisualSVN Sever.下载地址:https://www.visualsvn.com/server/download/ 2.安装VisualSVN Server. ...

  9. 用于编写下一代JavaScript的编译器。

    下载 用于编写下一代JavaScript的编译器. 支持巴别塔 Babel(发音为babble)是一个由社区驱动的项目,被许多公司和项目使用,由一群志愿者维护.如果你愿意帮助支持这个项目的未来,请考虑 ...

  10. 使用css实现轮播图

    使用css3实现图片轮播 前言:实现图片轮播的方式有很多种 ,例如js ,css 等等. 本文主要讲述使用纯css3实现轮播图 工具介绍: 使用的编辑器: Hbuilder 进入正题 html代码: ...