棋盘上识别三连时,横向与纵向可能同时命中同一格。先分别找出所有连续段,再取格子的并集,才不会让交叉点被重复计数。
下面给出一组可以从头复算的练习数据。先按约定记录每一步,再比较最后的核对条件;遇到差异时,不急着修改答案,而是先找出从哪一步开始不同。本例描述的是明确限定的游戏规则模型,不代替某款作品自己的说明。
约定与输入
本例六行六列,连续三格或更多同色都标记,仅横竖有效。只识别当前棋盘,不执行消除、补位或生成新格,因此没有后续连锁计算。
每段三连窗口都标记其格子;较长同色段可能被多个窗口命中,使用集合合并去重。
坐标为列x、行y,均从0开始 CDCABA BBBDDD DADACD BBCADC BBCCCD BDAAAC
逐步观察
第0行CDCABA,横向命中列[]。
第1行BBBDDD,横向命中列[0, 1, 2, 3, 4, 5]。
第2行DADACD,横向命中列[]。
第3行BBCADC,横向命中列[]。
第4行BBCCCD,横向命中列[2, 3, 4]。
第5行BDAAAC,横向命中列[2, 3, 4]。
第0列,纵向命中行[3, 4, 5]。
第1列,纵向命中行[]。
第2列,纵向命中行[]。
第3列,纵向命中行[]。
第4列,纵向命中行[]。
第5列,纵向命中行[]。
横向12格,纵向3格,交叉0格,合并后15格。
复核办法
对每个格子分别向两侧延伸,检查经过它的横段或竖段是否至少三格。得到的格子集合应与逐段扫描一致,最终数的是格子而不是命中片段的数量。
一段四连包含两个三格窗口,但实际只有四个格子。统计奖励或动画目标前,必须先明确统计单位是格子、连续段还是窗口,本例的答案只表示格子集合。
把边界、顺序与适用范围写进记录,比只记一个最后数字更有用。可以另外构造刚好在边界、完全没有变化和多个条件同时成立的情况,查看规则是否仍自洽;若要改变设定,保留原案例作为对照,再重新计算受影响的部分。
