Connect Four四子棋c++程序 - 碰撞检测(2)

文章目录


上一篇文章里已经完成了四子棋的主要游戏逻辑和画面渲染,现在我们把“碰撞检测”添加上去。这里的碰撞检测就是 检测当前玩家下子以后是否有超过4个棋子连成一条线了。这一部分要完成的工作有:

  1. 检测是否有超过4个棋子连在一起的情形;
  2. 如果有,要把那条直线在游戏中显示出来。

完整代码已经放上github了,在这里
在这里插入图片描述

碰撞检测

超过4个棋子连成一条线有如下三种情况:

  1. 它们在水平方向连成一条线;
  2. 它们在竖直方向连成一条线;
  3. 它们在斜对角线上连成一条线(这里又有两种情况)。

要如何检测呢?首先我们这里只考虑最简单的情形:一旦有人连成4个棋子了,游戏就结束(也就是说不是积分制的那种)。然后我们来确定一下要检测的区域:
如果此时存在4个棋子连成一条直线,那么当前玩家下的那个棋子一定是其中4个棋子之一

这样就很简单了,我们可以从当前玩家下的那个棋子位置着手进行检测,举个水平方向的例子:

  1. 先一直往右边走,直至走出棋盘或者遇到不是当前玩家的棋子,记录下最右边的位置i
  2. 然后在回到原来的位置往左边走,同样直至走出棋盘或者遇到不是当前玩家的棋子,记录下最左边的未知j

接着计算这串棋子的个数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;
	if (i 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值