HY,
我试图在 javascript / jQuery中实现Connect Four Game.首先,这不是家庭作业或任何其他职责.我只是想提升自己的能力.
我试图在 javascript / jQuery中实现Connect Four Game.首先,这不是家庭作业或任何其他职责.我只是想提升自己的能力.
我的“playground”是一个简单的html表,有7行6列.
但现在我已经到了我的身边.我坚持检查是否有4个相同的td的主要功能.我正在添加一个类来确定它应该在游戏中代表哪种颜色.
首先,我认为我可以使用.nextAll()和.prevAll()来处理这个问题,但这对我不起作用,因为它之间没有检测.
因为我正在寻找兄弟姐妹,在添加一个新项目时,只是查看了找到的兄弟姐妹的长度,如果他们最后匹配4我认为这是对的,但不是没有:D是否有任何类型的directNext ()它提供了所有下一个css选择器,直到出现不同的东西?
我将把所有代码放入这个jsfiddle:http://jsfiddle.net/LcUVf/5/
也许有人曾经尝试过相同或有人想出一个好主意我不是要求任何人做或完成我的代码.我只想获得实现这样一个算法或示例如何解决它的提示!
无论如何,谢谢!
解决方法
DOM遍历不是特别有效,因此,当你可以避免它时,我建议这样做.将它构建为2D数组以存储和更新游戏状态是有意义的.该表只是数组的直观表示.
我知道,通常情况下,您将构建数组,其中行作为第一个维度,列作为第二个维度,但为了能够将片段添加到每个列的“堆栈”,我将第一个维度作为列和行的第二个维度.
要做检查,看看我做的这个小提琴:
http://jsfiddle.net/Koviko/4dTyw/
有4个方向可供选择:南北,东西,东北 – 西南和东南 – 西北.这可以表示为具有为X和Y定义的增量的对象:
directions = [ { x: 0,y: 1 },// North-South { x: 1,y: 0 },// East-West { x: 1,// Northeast-Southwest { x: 1,y: -1 } // Southeast-Northwest ];
然后,循环遍历该对象并循环通过您的“表格”,从最远的边界开始,这块可能有助于获胜.因此,由于您需要连续4件,因此当前放置的部件可以在任何方向上最多赢得3件.
minX = Math.min(Math.max(placedX - (3 * directions[i].x),0),pieces.length - 1); minY = Math.min(Math.max(placedY - (3 * directions[i].y),pieces[0].length - 1); maxX = Math.max(Math.min(placedX + (3 * directions[i].x),pieces.length - 1),0); maxY = Math.max(Math.min(placedY + (3 * directions[i].y),pieces[0].length - 1),0);
为了避免小于和大于(我遇到过)的任何问题,计算循环遍历各个部分之前的步数,而不是使用计算的边界作为条件.
steps = Math.max(Math.abs(maxX - minX),Math.abs(maxY - minY));
最后,遍历项目,保持与最后放置的棋子相匹配的连续棋子的数量.
function isVictory(pieces,placedX,placedY) { var i,j,x,y,maxX,maxY,steps,count = 0,directions = [ { x: 0,// North-South { x: 1,// East-West { x: 1,// Northeast-Southwest { x: 1,y: -1 } // Southeast-Northwest ]; // Check all directions outerloop: for (i = 0; i < directions.length; i++,count = 0) { // Set up bounds to go 3 pieces forward and backward x = Math.min(Math.max(placedX - (3 * directions[i].x),pieces.length - 1); y = Math.min(Math.max(placedY - (3 * directions[i].y),pieces[0].length - 1); maxX = Math.max(Math.min(placedX + (3 * directions[i].x),0); maxY = Math.max(Math.min(placedY + (3 * directions[i].y),0); steps = Math.max(Math.abs(maxX - x),Math.abs(maxY - y)); for (j = 0; j < steps; j++,x += directions[i].x,y += directions[i].y) { if (pieces[x][y] == pieces[placedX][placedY]) { // Increase count if (++count >= 4) { break outerloop; } } else { // Reset count count = 0; } } } return count >= 4; }