首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查c#中行中的n个连续字符

如何检查c#中行中的n个连续字符
EN

Stack Overflow用户
提问于 2017-11-19 01:17:43
回答 3查看 273关注 0票数 1

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

我很难编写一个程序来检查一列获胜,在那里玩家完全水平地赢了比赛。到目前为止,我的情况如下:

代码语言:javascript
复制
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列开始,然后向前检查足够远,看它们是否都是相同的字符,但我似乎想不出如何做到这一点。有人能给我指明正确的方向吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-19 02:50:23

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

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

代码语言:javascript
复制
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是否获胜。

因此,您可以向函数中添加一个参数,以判断您要测试的是哪种颜色的win (比如colorCheck),整个函数就变成了

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-11-19 01:53:05

您可以设置两个计数器,一个用于红色光盘,另一个用于黄色光盘。然后,在嵌套循环的主体中,每当您遇到一个r增量,红色光盘计数器就会增加一个,黄色磁盘也是如此。

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

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

代码语言:javascript
复制
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
                }
          }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-11-19 02:16:19

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

这是一个常见而简单的代码,您可以在每次移动后或在董事会中的每个位置执行该代码:

这个想法是从中心向各个方向移动(一块作品的新位置),使某些东西像星星“*”(就像明星角色)。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47372811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档