上回说到用 Decentraland SDK 制作一个象棋棋盘的场景
还没看之前的帖子的, 可以去看 Part 0 和 Part 1
Part 0 : 尝试使用 Decentraland SDK
模型建好后,接下来就可以implement 象棋的逻辑。 这是因为棋子可以走动的范围必须符合棋规,然后要有办法判断绝杀了没有。
首先我到 Github 去找看有哪些现成的代码可以直接使用,然后就找到了这个由 LengYanYu258 开发的 xiangqi.js
https://github.com/lengyanyu258/xiangqi.js
这个象棋引擎已经包含了各种检查, 包挂棋子下一步可以活动的范围,绝杀,长将,长抓等等。
不过,这个library 是用Javascript 写的, Decentraland 只能跑Typescript 的代码。 虽然Typescript 是 Javascript 的 Superset , 但是我研究了很久还是迟迟无法直接使用。
研究了各种方法, 包挂在 tsconfig 开 allowjs, 加了各种 declaration file 什么 .d.ts 等等还是不行。
最后没办法的情况下, 我把整个 xiangqi.js 转成 xiangqi.ts 了。 大部分的代码不用从写, 只需要稍微的把它用typescript 的object oriented 的方式演绎出来就可以了, (例如加入this. 去各个instance variables 上) ,因为javascript 的 OO 写法 Decentraland貌似不能接受。
这个是原装的代码 ,这个是改过后的代码。 改成 typescript 后就可以在 Decentraland SDK 上用了。
研究过程里,我发现象棋或西洋棋要表达棋局的state 都是用一个叫 FEN 的字串来描述整个棋局 。 FEN是 Forsyth–Edwards Notation 的简写 。
所以这个字串就已经涵盖了整个棋局的状态。 图里用的字母 H (Horse) 有些则是用 N (Knight) ,
相/象应该是 B (Bishop) 图里用的是 E (Elephant) 。 我是根据 xiangqi.js (N 和 B)的用法 。
后面还有一个字母是表明现在是轮到谁 (r 或 b ) 还有一些为了配合西洋棋的格式的place holder。
可以把这个 string 字串放到 memcache 就可以随时读取棋局状态了。
暂时就说到此, 其他的改天在说 。
谢谢阅读。