0

我正在为数据结构类开发类似宝石迷阵的游戏。自从我介绍 C++ 以来已经有好几年了,我的逻辑已经很生疏了。

我的代码将 4 的匹配识别为 3 的两个匹配。我不确定如何绕过 3 的匹配来匹配 4。我尝试过类似的 if 语句if (counter = 3 && board[y][x] == board[y][x-1]),但它没有像我一样故意的。

这是我的代码:

// Counts the number of matches (3 or more)
// returns number of matches found
int CountJewels(){
int matches = 0;

// Horizontal jewels
for (int y = 0; y < size; y++){
    int counter = 1;
    for (int x = 1; x < size; x++){
        if (board[y][x] == board[y][x-1]){
            counter++;
            if (counter >= 3){
                matches++;
            }
        } else  {
            counter = 1;
        }
    }
}

// Vertical jewels
for (int x = 0; x < size; x++){
    int counter = 1;
    for(int y = 1; y < size; y++){
        if(board[y][x] == board[y-1][x]){
            counter++;
            if (counter >= 3){
                matches++;
            }
        } else  {
            counter = 1;
        }
    }
}
cout << matches << endl;
return matches;
}
4

4 回答 4

2

很简单。只需将条件更改为counter == 3. 3 个或更多的匹配项将被识别为单个匹配项,因为当连续匹配单元格的数量 >= 3 时,您只计算一次。

于 2013-09-15T09:56:20.503 回答
1

一个想法可以是不直接增加匹配,而只是增加相同珠宝中的计数。最后,当找到一个不相同的字符时,如果你的计数大于 2,则将其计为一次匹配:

//Counts the number of matches (3 or more)
// returns number of matches found
int CountJewels(){
int matches = 0;

// Horizontal jewels
for (int y = 0; y < size; y++){
    int counter = 1;
    for (int x = 1; x < size; x++){
        if (board[y][x] == board[y][x-1]){
            counter++;
        } else  {
            //Check if there was a matching before the mismatch.
            if(counter > 2){
              matches++;
            }
            counter = 1;
        }
    }
    //Checking last cell matches.
    if(counter > 2){
        matches++;
    }
}

//Vertical jewels
for (int x = 0; x < size; x++){
    int counter = 1;
    for(int y = 1; y < size; y++){
        if(board[y][x] == board[y-1][x]){
            counter++;
        } else  {
            //Check if there was a matching before the mismatch.
            if(counter > 2){
              matches++;
            }
            counter = 1;
        }

    }
    //Checking last cell matches.
    if(counter > 2){
        matches++;
    }
}
于 2013-09-15T09:59:43.453 回答
0

你可以使用类似的东西:

// Horizontal jewels
for (int y = 0; y < size; y++){
    int counter = 1;
    for (int x = 1; x < size; x++){
        if (board[y][x] == board[y][x-1]){
            counter++;
        } else  {
            foundAlignmentOf(counter);
            counter = 1;
        }
    }
    foundAlignmentOf(counter); // Or use extra row/column with sentinel values
}

wherefoundAlignmentOf(counter)被称为找到的每个对齐(因此您可以根据对齐的大小使用测试条件)。

于 2013-09-15T10:07:08.640 回答
0

我知道宝石迷阵的规则,我可以提供帮助。

答案很简单,向后执行 if/then 或 select 语句...

if (counter >= 5) matches++;
else if (counter == 4) matches++;
else if (counter == 3) matches++;

或者

select (counter)
{
    case 5: matches++;
        break;
    case 4: matches++;
        break;
    case 3: matches++;
        break;
    case else: break;
}

你可以走得更高,甚至做一个反向 for/do 循环来检查和保存一些代码。这只是一个例子……

于 2013-09-15T10:13:22.893 回答