首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ Gomoku对角线检查器

c++ Gomoku对角线检查器
EN

Stack Overflow用户
提问于 2022-05-24 22:24:51
回答 1查看 268关注 0票数 0

因此,我是一个相对较新的编码。所以我得为一个项目做一个Gomoku游戏。Gomoku就像tic-tac-脚趾,但必须连续5次。已被给予某些限制,如板子大小为6x6至15x15。至少使用一个类。我选择使用数组。我创建了PlayerOne作为一种算法,它的移动基于PlayerOne的最后一步,并在下一步移动一个随机块。第二种算法是随机的。因为在检查赢球时,我的水平和垂直跳棋似乎有效,但我的两种对角线跳棋都有问题,他们说一排连续3个块对角线是5块。我分别创建了我的检查程序,手动填写每一行进行测试,对角线检查器在那里很好,但它们在整个代码中并不好。我将在这里分享这两个对角线检查器,然后在下面分享整个代码,希望更容易阅读。也有相当多的cout语句,因为它试图找出哪里的问题,在较早的过程中。如果有人能看到问题发生在哪里,如果能指出地点,就会非常感激。

代码语言:javascript
复制
int game::diagonalCheckerNegSlope(int arr[15][15], int size) {
    int count1;
    int count2;
    int whoWon = 0;

    for (int i = 0; i < size; i++) {
        count1 = 0;
        count2 = 0;
        for (int j = 0; j < size; j++) {
            if (arr[j][i] == 1) {

                for (int d = 0; (i + d < size) && (j + d < size); d++)
                    if (arr[i + d][j + d] == 1) {
                        count1++;
                        if (count1 == 5) {
                            whoWon = 1;
                        }
                    } else {
                        count1 = 0;
                    }

            }
            if (arr[j][i] == 2) {

                for (int d = 0; (i + d < size) && (j + d < size); d++)
                    if (arr[i + d][j + d] == 2) {
                        count2++;
                        if (count2 == 5) {
                            whoWon = 2;
                        }
                    } else {
                        count2 = 0;
                    }

            }

        }

    }
    if (whoWon != 1 && whoWon != 2) {
        whoWon = 3;
    }

    return whoWon;
}

int game::diagonalCheckerPosSlope(int arr[15][15], int size) {
    int count1;
    int count2;
    int whoWon = 0;

    for (int i = 0; i < size; i++) {
        count1 = 0;
        count2 = 0;
        for (int j = 0; j < size; j++) {
            if (arr[i][j] == 1) {

                for (int d = 0; (i + d < size) && (j - d < size); d++)
                    if (arr[i + d][j - d] == 1) {
                        count1++;
                        if (count1 == 5) {
                            whoWon = 1;
                        }
                    } else {
                        count1 = 0;
                    }

            }
            if (arr[i][j] == 2) {

                for (int d = 0; (i + d < size) && (j - d < size); d++)
                    if (arr[i + d][j - d] == 2) {
                        count2++;
                        if (count2 == 5) {
                            whoWon = 2;
                        }
                    } else {
                        count2 = 0;
                    }
            }
        }

    }
    if (whoWon != 1 && whoWon != 2) {
        whoWon = 3;
    }
    return whoWon;
}

int主码

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include "game.h"
#include <iomanip>
#include <ctime>
using namespace std;



int main() {
    string inputSize = "input.txt";
    int size =0;
    srand(time(0));

    int arr[15][15];

    game Gomuko;

    size = Gomuko.getSize(inputSize, arr);
    if(size >=6 && size <=15){

    Gomuko.initZero(arr, size);
//  Gomuko.printArr(arr,size);

    Gomuko.Play(arr, size);

    Gomuko.printArr(arr,size);

    }else{
        cout << "Invalid input" << endl;
    }


    return 0;
}

类的.h文件

代码语言:javascript
复制
#ifndef GAME_H_
#define GAME_H_

#include <string>
#include <ctime>
using namespace std;

class game {
public:
    game();
    int getSize(string inputFileName, int dataArray[15][15]);
    void initZero(int arr[15][15], int size);
    void printArr(int arr[15][15], int size);
    void movePlayerOne(int arr[15][15], int size, int counter2);
    void movePlayerTwo(int arr[15][15], int size);
    void Play(int arr[15][15], int size);
    int PlayerOneSurroundRow(int arr[15][15],int size);
    int PlayerOneSurroundCol(int arr[15][15],int size);
    int findFirstMoveRow(int arr[15][15], int size);
    int findFirstMoveCol(int arr[15][15], int size);
    bool isValid(int newRow, int newCol, int size);
    int horizontalChecker(int arr[15][15], int size);
    int verticalChecker(int arr[15][15], int size);
    int diagonalCheckerNegSlope(int arr[15][15], int size);
    int diagonalCheckerPosSlope(int arr[15][15], int size);
    int WholeWinnerChecker(int arr[15][15], int size);
private:

    int randRow(int size);
    int randCol(int size);
};

#endif /* GAME_H_ */

最后,类的.cpp文件

代码语言:javascript
复制
#include "game.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <ctime>
using namespace std;

game::game() {
    // TODO Auto-generated constructor stub

}

int game::getSize(string inputFileName, int dataArray[15][15]) {//make between 6 and 15.
    ifstream inputData;

    int size = 0;
    int counter = 0;

    inputData.open(inputFileName);

    if (!inputData) {
        cout << "Cannot open the file \"" << inputFileName << "\"" << endl;
    }
    else {
        while (inputData >> size) {
            counter++;
        }
        cout << "There are " << counter << " board sizes in the inputFile"
                << endl;
        cout << "The size of the board is " << size << "x" << size << endl
                << endl;
    }
    return size;
}

void game::initZero(int arr[15][15], int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            arr[i][j] = 0;
        }
    }
}

void game::printArr(int arr[15][15], int size) {

    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }

    cout << endl << endl;
}

int game::randRow(int size) {

    int randNoRow = 0;
    randNoRow = rand() % size;
    return randNoRow;
}

int game::randCol(int size) {

    int randNoCol = 0;
    randNoCol = rand() % size;
    return randNoCol;
}

int game::findFirstMoveRow(int arr[15][15], int size) {
    int positionRow;
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (arr[i][j] == 1) {
                positionRow = i;
            }
        }
    }

    return positionRow;
}

int game::findFirstMoveCol(int arr[15][15], int size) {
    int positionCol;
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (arr[i][j] == 1) {
                positionCol = j;
            }
        }
    }

    return positionCol;
}

int game::PlayerOneSurroundRow(int arr[15][15], int size) {

    int positionRow = game::findFirstMoveRow(arr, size);
//  cout << "The old row is " << positionRow << endl;

    int oldRow = positionRow;
    int randChoice = 0;
    int newRow = 0;

    randChoice = (rand() % 3);
//  cout << "randChoice Row case:  " << randChoice << endl;

    switch (randChoice) {
    case 0:
        newRow = oldRow - 1;
        break;
    case 1:
        newRow = oldRow;
        break;
    case 2:
        newRow = oldRow + 1;
        break;
    }
//  cout << "Test2" << endl << endl;
    if (newRow > size - 1) {
//      cout << "Row too big as Row is " << newRow << endl;
        newRow = newRow - 1;
//      cout << "Row is now " << newRow << endl;

    }
    if (newRow < 0) {
//      cout << "Row too small as row is " << newRow << endl;
        newRow = newRow + 1;
//      cout << "Row is now " << newRow << endl;

    }

//  cout << "The new row is: " << newRow << endl;

    return newRow;
}

int game::PlayerOneSurroundCol(int arr[15][15], int size) {

    int positionCol = findFirstMoveCol(arr, size);
//  cout << "The old col is " << positionCol << endl;

    int oldCol = positionCol;
    int randChoice = 0;
    int newCol = 0;

    randChoice = (rand() % 3);
    cout << "randChoice Col case: " << randChoice << endl;

    switch (randChoice) {
    case 0:
        newCol = oldCol - 1;
        break;
    case 1:
        newCol = oldCol;
        break;
    case 2:
        newCol = oldCol + 1;
        break;
    }
//  cout << "Test2" << endl << endl;
    if (newCol > size - 1) {
//      cout << "Col too big as is " << newCol << endl;
        newCol = newCol - 1;
//      cout << "Col is now " << newCol << endl;
    }
    if (newCol < 0) {
//      cout << "Col too small as is " << newCol << endl;
        newCol = newCol + 1;
//      cout << "Col is now " << newCol << endl;

    }

//  cout << "The new col is: " << newCol << endl;

    return newCol;
}

bool game::isValid(int newRow, int newCol, int size) {
    bool valid = false;
    if (((newRow < size) && (newCol < size))
            && ((newRow >= 0) && (newCol >= 0))) {
        valid = true;
    }
    return valid;
}

void game::movePlayerOne(int arr[15][15], int size, int counter2) {

    int newRow = 0;
    int newCol = 0;
    int oldRow = 0;
    int oldCol = 0;
    int count3 = 0;

    if (counter2 == 0) {
        oldRow = randRow(size);
        oldCol = randCol(size);

        arr[oldRow][oldCol] = 1;
//      cout << "Test1" << endl << endl << endl;
        counter2++;
    }

    else {

//      cout << "Test 3" << endl;

        newRow = game::PlayerOneSurroundRow(arr, size);
        newCol = game::PlayerOneSurroundCol(arr, size);

        if (arr[newRow][newCol] == 0 && isValid(newRow, newCol, size)) {
            arr[newRow][newCol] = 1;
//          cout << "Test4" << endl;
//          cout << "randNoRow = " << newRow << endl;
//          cout << "randNoCol = " << newCol << endl;

            oldRow = newRow;
            oldCol = newCol;
        }

        else if ((arr[newRow][newCol] == 1) || (arr[newRow][newCol] == 2)
                || (newRow > size) || (newCol > size) || (newRow < 0)
                || (newCol < 0)) {
            cout
                    << "There has been a match, or even out of bounds, going again. "
                    << endl << endl;

            while ((arr[newRow][newCol] == 1) || (arr[newRow][newCol] == 2)) {

//              cout << "Test5" << endl;
                newRow = game::PlayerOneSurroundRow(arr, size);
                newCol = game::PlayerOneSurroundCol(arr, size);

//              cout << "randNoRow = " << newRow << endl;
//              cout << "randNoCol = " << newCol << endl;

                count3++;
                if ((arr[newRow][newCol] != 1 && arr[newRow][newCol] != 2)
                        && isValid(newRow, newCol, size)) {
                    arr[newRow][newCol] = 1;
//                  cout << "Test6" << endl;
//
//                  cout << "randNoRow = " << newRow << endl;
//                  cout << "randNoCol = " << newCol << endl;

                    oldRow = newRow;
                    oldCol = newCol;
                    break;
                }

                if (count3++ > 3) {
//                  cout << "Test 7" << endl;
//                  newRow = randRow(size);
//                  newCol = randCol(size);
                    while (arr[newRow][newCol] == 1 || arr[newRow][newCol] == 2) {
                        newRow = randRow(size);
                        newCol = randCol(size);
//                      cout << "Test 8" << endl;
//                      cout << "randNoRow = " << newRow << endl;
//                      cout << "randNoCol = " << newCol << endl;

                        if (arr[newRow][newCol] == 0) {
                            arr[newRow][newCol] = 1;
//                          cout << "Test 9" << endl;
//                          cout << "randNoRow = " << newRow << endl;
//                          cout << "randNoCol = " << newCol << endl;
                            oldRow = newRow;
                            oldCol = newCol;
                            break;
                        }
                    }

                    break;
                }
            }

        }
    }
}

void game::movePlayerTwo(int arr[15][15], int size) {

//  cout << "Test" << endl;

    int randNoRow = 0;
    int randNoCol = 0;

    randNoRow = randRow(size);
    cout << "randNoRow = " << randNoRow << endl;

    randNoCol = randCol(size);
    cout << "randNoCol = " << randNoCol << endl;

    cout << endl;

    if ((arr[randNoRow][randNoCol] == 1) || (arr[randNoRow][randNoCol] == 2)) {
        //cout << "There has been a match, going again. " << endl << endl;
        while ((arr[randNoRow][randNoCol] == 1)
                || (arr[randNoRow][randNoCol] == 2)) {

            int randNoRow = 0;
            int randNoCol = 0;

            randNoRow = randRow(size);
            //cout << "randNoRow = " << randNoRow << endl;

            randNoCol = randCol(size);
            //cout << "randNoCol = " << randNoCol << endl;

            //cout << endl;

            if (arr[randNoRow][randNoCol] == 0) {
                arr[randNoRow][randNoCol] = 2;
                break;
            }
        }

    } else {
        arr[randNoRow][randNoCol] = 2;
    }
}

int game::horizontalChecker(int arr[15][15], int size) {
    int count1;
    int count2;
    int whoWon = 0;

    for (int i = 0; i < size; i++) {
        count1 = 0;
        count2 = 0;
        for (int j = 0; j < size; j++) {
            if (arr[i][j] == 1) {
                count1++;
                if (count1 == 5) {
                    whoWon = 1;
                }

            } else {
                count1 = 0;
            }
            if (arr[j][i] == 2) {
                count2++;
                if (count2 == 5) {
                    whoWon = 2;
                }

            } else {
                count2 = 0;
            }

        }
        if (whoWon != 1 && whoWon != 2) {
            whoWon = 3;
        }
    }
    return whoWon;
}

int game::verticalChecker(int arr[15][15], int size) {
    int count1;
    int count2;
    int whoWon = 0;

    for (int i = 0; i < size; i++) {
        count1 = 0;
        count2 = 0;
        for (int j = 0; j < size; j++) {
            if (arr[j][i] == 1) {
                count1++;
                if (count1 == 5) {
                    whoWon = 1;
                }

            } else {
                count1 = 0;
            }
            if (arr[j][i] == 2) {
                count2++;
                if (count2 == 5) {
                    whoWon = 2;
                }

            } else {
                count2 = 0;
            }

        }
        if (whoWon != 1 && whoWon != 2) {
            whoWon = 3;
        }
    }
    return whoWon;
}
int game::diagonalCheckerNegSlope(int arr[15][15], int size) {
    int count1;
    int count2;
    int whoWon = 0;

    for (int i = 0; i < size; i++) {
        count1 = 0;
        count2 = 0;
        for (int j = 0; j < size; j++) {
            if (arr[j][i] == 1) {

                for (int d = 0; (i + d < size) && (j + d < size); d++)
                    if (arr[i + d][j + d] == 1) {
                        count1++;
                        if (count1 == 5) {
                            whoWon = 1;
                        }
                    } else {
                        count1 = 0;
                    }

            }
            if (arr[j][i] == 2) {

                for (int d = 0; (i + d < size) && (j + d < size); d++)
                    if (arr[i + d][j + d] == 2) {
                        count2++;
                        if (count2 == 5) {
                            whoWon = 2;
                        }
                    } else {
                        count2 = 0;
                    }

            }

        }

    }
    if (whoWon != 1 && whoWon != 2) {
        whoWon = 3;
    }

    return whoWon;
}

int game::diagonalCheckerPosSlope(int arr[15][15], int size) {
    int count1;
    int count2;
    int whoWon = 0;

    for (int i = 0; i < size; i++) {
        count1 = 0;
        count2 = 0;
        for (int j = 0; j < size; j++) {
            if (arr[i][j] == 1) {

                for (int d = 0; (i + d < size) && (j - d < size); d++)
                    if (arr[i + d][j - d] == 1) {
                        count1++;
                        if (count1 == 5) {
                            whoWon = 1;
                        }
                    } else {
                        count1 = 0;
                    }

            }
            if (arr[i][j] == 2) {

                for (int d = 0; (i + d < size) && (j - d < size); d++)
                    if (arr[i + d][j - d] == 2) {
                        count2++;
                        if (count2 == 5) {
                            whoWon = 2;
                        }
                    } else {
                        count2 = 0;
                    }
            }
        }

    }
    if (whoWon != 1 && whoWon != 2) {
        whoWon = 3;
    }
    return whoWon;
}

int game::WholeWinnerChecker(int arr[15][15], int size) {
    int finalWinner = 0;
    int outcome1 = horizontalChecker(arr, size);
    if ((outcome1 == 1) || (outcome1 == 2)) {
        finalWinner = outcome1;
        cout << "Horizontal Win" << endl;
    }
    int outcome2 = verticalChecker(arr, size);
    if ((outcome2 == 1) || (outcome2 == 2)) {
        finalWinner = outcome2;
        cout << "Vertical Win" << endl;
    }
    int outcome3 = diagonalCheckerPosSlope(arr, size);
    if ((outcome3 == 1) || (outcome3 == 2)) {
        finalWinner = outcome3;
        cout << "Diag Pos Win" << endl;
    }
    int outcome4 = diagonalCheckerNegSlope(arr, size);
    if ((outcome4 == 1) || (outcome4 == 2)) {
        finalWinner = outcome4;
        cout << "Diag Neg Win" << endl;
    }

    else if ((finalWinner != 1) && (finalWinner != 2)) {
        finalWinner = 3;
    }

    return finalWinner;
}

void game::Play(int arr[15][15], int size) {
    int counter = 0;
    int Winner=0;
    int boardFull= size*size;
        while(((Winner != 1)&&(Winner != 2))&& (counter < boardFull)){
        cout << "This is turn " << counter + 1 << endl;
        if (counter % 2 == 0) {
            cout << "PlayerOne: " << endl;
            game::movePlayerOne(arr, size, counter);
            if (counter >= 4) {
                Winner = game::WholeWinnerChecker(arr, size);
                if(Winner ==1){
                cout << endl <<"======================" << endl;
                cout << "Winner = " << Winner << endl;
                cout <<"======================" << endl;
                }
            }
        }
        if (counter % 2 == 1) {
            cout << "PlayerTwo:" << endl;
            game::movePlayerTwo(arr, size);
            if (counter >= 5) {
                Winner = game::WholeWinnerChecker(arr, size);
                if (Winner == 2) {
                    cout << endl << "======================" << endl;
                    cout << "Winner = " << Winner << endl;
                    cout << "======================" << endl;
                }
            }
        }
        if(counter == boardFull){
            cout << "Draw" << endl;
        }

        counter++;

    }

}

我还使用了

代码语言:javascript
复制
6
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-24 22:58:02

问题可能是,您没有在j-循环中设置count1count2,而是依赖于else语句中正在重置的变量。但是,如果您的d-循环在执行else语句之前结束((i + d < size) && (j - d < size)变为false“过早”),则计数器不会被重置。解决方案:将零初始化移动到j-循环内部。

一些改进:

如果很多方法都有相同的参数(如int arr[15][15]int size),那么这可能是这些参数应该成为类成员的标志。

只有一个检查函数是可能的。此函数的参数将是搜索的方向(int deltaX,int deltaY),以及正在检查的值(1或2)。达美-所有8个方向的数值如下:

(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,1),(0,1),(1,1)

因此,在d循环中,您不会将d添加或减去ij,而是总是将deltaX添加到i,而将deltaY添加到j

还有,有点先进,但也很有趣。可以用这样一种方式排列代码:人对人、人对计算机、计算机对计算机三种类型的游戏。例如,您只需将类HumanPlayer的对象分配给player 1,将类ComputerPlayer的对象分配给player 2,这将使您能够选择谁先玩,并有几种算法与其竞争。这两个类都必须从基类Player派生出来,其中包含一些已知的方法(如“移动”),有些GameCoordinator将在循环中对两个对象调用此方法“移动”,更新游戏状态,并检查游戏是否已经结束。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72370087

复制
相关文章

相似问题

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