如何在c中检查行中n个连续的相同字符

时间:2017-11-19 01:17:43

标签: c nested-loops

所以我的任务是为Connect-N编写一个程序,它基本上是游戏Connect-4,但是用户指定行数和列数(不必是正方形)并指定连续数要获胜的棋子(这不一定适合棋盘)。例如,如果用户指定3x3板,他们也可以说需要连续4件才能获胜。

我在编写程序以检查行获胜时遇到问题,其中玩家完全横向赢得游戏。这是我到目前为止所做的:

bool horizontalWin(char **board, const int numRows, 
const int numCols, const char blankSpace, const int numToWin) {
  if((numCols - numToWin) < 0) {
      return false;
  }
  else {
    for (int row = 0; row < numRows; ++row) {
      for (int col = 0; col <= numCols-numToWin; ++col) {
        ///This is where I need help
      }
    }
  }
return false;
}

仅供参考:变量blankSpace为'*',用于表示电路板上的空白区域。

我的想法是有一个嵌套的for循环,从第0列开始,然后检查得足够远,看看它们是否都是相同的字符,但我似乎无法弄清楚如何实现这一点。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

计算匹配数,或在没有匹配时重置计数。

假设board[row][col],并且您检查的颜色为user1

for (int row = 0; row < numRows; ++row) {
    int match = 0;
    for (int col = 0; col <= numCols-numToWin; ++col) {
        if (board[row][col] != user1) match = 0;
        else {
            match++;
            if (match >= numToWin) return true;
        }
    }
}

请注意,您可以if (++match >= numToWin) return true;保存一行(如果您认为这是可读的)。

这不在问题描述中,但如果您有两个玩家,则应该有3种颜色,例如blankSpaceuser1user2。上面的程序会检查user1是否胜出。

所以你可以在函数中添加一个参数来告诉你为胜利测试的颜色(比如colorCheck),整个函数就变成了

bool horizontalWin(char **board, const int numRows, 
const int numCols, const char blankSpace, const int numToWin, const in colorCheck) {
  if((numCols - numToWin) < 0) {
      return false;
  }
  else {
     for (int row = 0; row < numRows; ++row) {
        for (int col = 0; col <= numCols-numToWin; ++col) {
           if (board[row][col] != colorCheck) match = 0;
           else {
              match++;
              if (match >= numToWin) return true;
           }
        }
     }
  }
  return false;
}

答案 1 :(得分:0)

您可以设置两个计数器,一个用于红色光盘,另一个用于黄色光盘。然后在嵌套循环体内,每当遇到r增量时,红色光盘反转一个,黄色光盘也是如此。

然后,您可以在每次迭代后检查这些计数器是否等于赢得游戏所需的给定N

您可以这样做,假设您表示带有r的红色磁盘和带有y的黄色磁盘:

else 
{
    int red_c, yellow_c;
    for (int row = 0; row < numRows; ++row) 
    {
          red_c=0; yellow_c=0;
          for (int col = 0; col < numCols; ++col) 
          {
                if(board[r][c]=='r') red_c++;
                else if (board[r][c]=='y') yellow_c++;

                if(red_c == numToWin )
                {
                    //Red wins
                }

                else if(yellow_c == numToWin )
                {
                    //Yellow wins
                }
          }
    }
}

答案 2 :(得分:0)

代码将取决于您是否想知道如果您在特定行动后获胜,是否有人在董事会中获胜。

这是一个常见且简单的代码,您可以在每次移动后或在电路板中的每个位置执行该代码:

这个想法是从中心(一个片段的新位置)向各个方向移动,制作像星星一样的东西。 *&#34; (像明星人物一样)

consecutivesInHorizontal =0
consecutivesInVertical = 0
consecutivesDiagLeft =0
consecutiveDiagRight = 0

for i =1 ; i < height && i<width && i<= 4 ; i++
if(board[centerX][centerY+i] == myPieceColor)
    consecutivesInVertical++;
if(board[centerX][centerY-i] == myPieceColor)
    consecutivesInVertical++;

if(board[centerX+i][centerY] == myPieceColor)
    consecutivesInHorizontal++;
if(board[centerX-i][centerY] == myPieceColor)
    consecutivesInHorizontal++;

if(board[centerX+i][centerY-i] == myPieceColor)
    consecutivesDiagLeft++;
if(board[centerX-i][centerY+i] == myPieceColor)
    consecutivesDiagLeft++;

if(board[centerX-i][centerY+i] == myPieceColor)
    consecutiveDiagRight++;
if(board[centerX+i][centerY-i] == myPieceColor)
    consecutiveDiagRight

if any of the consecutive variables == 4
    return true