制作一个Decentraland 的象棋棋盘 PART 2

上回说到用 Decentraland SDK 制作一个象棋棋盘的场景

image.png

还没看之前的帖子的, 可以去看 Part 0 和 Part 1

Part 0 : 尝试使用 Decentraland SDK

Part 1:用Decentraland SDK 建模

模型建好后,接下来就可以implement 象棋的逻辑。 这是因为棋子可以走动的范围必须符合棋规,然后要有办法判断绝杀了没有。

首先我到 Github 去找看有哪些现成的代码可以直接使用,然后就找到了这个由 LengYanYu258 开发的 xiangqi.js
https://github.com/lengyanyu258/xiangqi.js

这个象棋引擎已经包含了各种检查, 包挂棋子下一步可以活动的范围,绝杀,长将,长抓等等。


image.png

不过,这个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 的简写 。

image.png

所以这个字串就已经涵盖了整个棋局的状态。 图里用的字母 H (Horse) 有些则是用 N (Knight) ,

相/象应该是 B (Bishop) 图里用的是 E (Elephant) 。 我是根据 xiangqi.js (N 和 B)的用法 。

image.png

后面还有一个字母是表明现在是轮到谁 (r 或 b ) 还有一些为了配合西洋棋的格式的place holder。

可以把这个 string 字串放到 memcache 就可以随时读取棋局状态了。


暂时就说到此, 其他的改天在说 。

谢谢阅读。