赞
踩
完整代码已经放上github了,在这里
超过4个棋子连成一条线有如下三种情况:
要如何检测呢?首先我们这里只考虑最简单的情形:一旦有人连成4个棋子了,游戏就结束(也就是说不是积分制的那种)。然后我们来确定一下要检测的区域:
如果此时存在4个棋子连成一条直线,那么当前玩家下的那个棋子一定是其中4个棋子之一
这样就很简单了,我们可以从当前玩家下的那个棋子位置着手进行检测,举个水平方向的例子:
接着计算这串棋子的个数n = i - j,如果n >= 4,那么就表明当前玩家赢了。类似地,我们按照相同的原理检测其他走向的直线。
因为一些变量在不同函数之间都会使用,我们先定义几个新的类成员变量:
int _startPos = -1; // 用来记录位置i
int _endPos = -1; // 用来记录位置j
bool _connected = false; // 当前棋局是否有4个棋子连成一条线
下面直接来看检测代码:
void checkCollision() { if (_lastPos != -1) { checkFromPos(_lastPos); } } void checkFromPos(int pos) { int tx = pos % _nbWGrids, ty = pos / _nbWGrids; int i, j, x, y; // check horizontally y = ty; for (x = pos % _nbWGrids; x < pos % _nbWGrids + 4; x++) { if (x >= _nbWGrids || _contents[x + y * _nbWGrids] != _contents[pos]) break; } i = (x - 1) + y * _nbWGrids; for (x = pos % _nbWGrids; x > pos % _nbWGrids - 4; x--) { if (x < 0 || _contents[x + y * _nbWGrids] != _contents[pos]) break; } j = (x + 1) + y * _nbWGrids;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。