https://gist.github.com/xsir317/c319ea4ed73c539961707353c5ccc263
gist 打不开的凑合看这个吧 xsir317/renju
曾经从一个C++的源码那里(传送门: Index of /renlib/opensrc 就是那个ForbiddenPointFinder )找到了最初的判断禁手的源码,然后自己改了一版php用了很久。
棋盘么,五子棋判断胜负,加上有禁手、假禁手的逻辑和嵌套,并不是那么容易的,涉及很多形状判断,以及大量的横、竖、斜向的数棋子什么的, 写得不好就会i ++ j ++ 整个代码里都是,重复代码会导致整体质量很差。
我新写的这个类,把方向定义为向量, 比如斜向分别是 [ +1,+1] [-1,-1] 和 [+1,-1] [-1,+1] 这样用一个方法去处理挪格子的问题,省去了原先代码中很多和方向、挪格子相关的冗余代码。
加上注释什么的,一共不到500行,去除注释的实际代码可能也就350行。
胜负逻辑一层层梳理,也不是很复杂。
首先,按照目前的五子棋(连珠)规则,先五为胜,后手方(白棋)长连视同五连。先手方(黑棋)禁手判负。比赛之中是要求后手方当场指出,咱们这里直接就判断了。
胜负判断:如果落子为黑方,形成了五连则返回黑胜,此时无视禁手;如果没有形成五连则检查禁手,如果禁手了则返回黑方禁手,白胜。如果为白方,形成了五连或者长连,返回白胜。
禁手判断&