因此,我的任务是为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列开始,然后向前检查足够远,看它们是否都是相同的字符,但我似乎想不出如何做到这一点。有人能给我指明正确的方向吗?
发布于 2017-11-19 02:50:23
计数匹配数,或在没有匹配时重置计数。
假设是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种颜色,比如blankSpace、user1和user2。上面的程序检查user1是否获胜。
因此,您可以向函数中添加一个参数,以判断您要测试的是哪种颜色的win (比如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;
}发布于 2017-11-19 01:53:05
您可以设置两个计数器,一个用于红色光盘,另一个用于黄色光盘。然后,在嵌套循环的主体中,每当您遇到一个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
}
}
}
}发布于 2017-11-19 02:16:19
代码将取决于您是否想知道是否有人在董事会中获胜,如果您在特定的移动后获胜。
这是一个常见而简单的代码,您可以在每次移动后或在董事会中的每个位置执行该代码:
这个想法是从中心向各个方向移动(一块作品的新位置),使某些东西像星星“*”(就像明星角色)。
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 truehttps://stackoverflow.com/questions/47372811
复制相似问题