zoukankan      html  css  js  c++  java
  • openspiel 随笔 05.05

    现阶段的任务是向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。今天晚上先不改了,先记着。
  • 相关阅读:
    一个C#读写Dxf的类库DXFLibrary
    我的敏捷之路
    C#+GDAL读写文件
    IIS并发连接数和数据库连接池
    .net网站iis应用池完美解决方案
    超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
    C#代码连接Oracle数据库一段时间以后[connection lost contact]的问题
    C#程序以管理员权限运行
    C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)
    Redis连接的客户端(connected_clients)数过高或者不减的问题解决方案
  • 原文地址:https://www.cnblogs.com/zh1903/p/12832809.html
Copyright © 2011-2022 走看看