所以我的任务是为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列开始,然后检查得足够远,看看它们是否都是相同的字符,但我似乎无法弄清楚如何实现这一点。有人能指出我正确的方向吗?
答案 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种颜色,例如blankSpace
,user1
和user2
。上面的程序会检查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