Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TIC TAC ToIP C++覆盖板_C++_Arrays_If Statement - Fatal编程技术网

TIC TAC ToIP C++覆盖板

TIC TAC ToIP C++覆盖板,c++,arrays,if-statement,C++,Arrays,If Statement,嗨,我已经按照我大部分时间想要的方式设置好了。我尝试实现的最后一个部分是使其在输入Xor 0时不会覆盖自身。如果有人能看看它,告诉我我的noRepeat函数到底做错了什么,我会非常感激。谢谢 #include <iostream> using namespace std; const int ROWS = 3; const int COLS = 3; char Player1 = 'X'; char Player2 = 'O'; int row, col; char board[3

嗨,我已经按照我大部分时间想要的方式设置好了。我尝试实现的最后一个部分是使其在输入Xor 0时不会覆盖自身。如果有人能看看它,告诉我我的noRepeat函数到底做错了什么,我会非常感激。谢谢

#include <iostream>

using namespace std;
const int ROWS = 3;
const int COLS = 3;
char Player1 = 'X';
char Player2 = 'O';
int row, col;
char board[3][3]= { '*', '*', '*', '*', '*', '*', '*', '*', '*'};  //Game board


//Prototypes

void noRepeat();
void drawBoard();
void selection(int&, int&);
char winner();
void switchPlayer();

int main()
{
    cout << "Tic Tac Toe!" << endl << endl;

    drawBoard();
    cout << endl << endl;
    while (1)
    {

        if ( noRepeat() )
        {
            selection(row, col);
            drawBoard();
            switchPlayer();
        }
        if (winner() == 'X')
        {
            cout << "Player 1 wins!" << endl;
            break;
        }
        else if (winner() == 'O')
        {
            cout << "Player 2 wins!" << endl;
            break;
        }

    }


    return 0;
}


// input function
void selection(int &row, int &col)
{
    cout << "Enter a number for row between 0 - 2" << endl;
    cin >> row;
    if (row < 0 || row > 2) {
        cout << "Invalid selection select a row between 0 - 2" << endl;
        cin >> row;
    }

    cout << "Enter a number for col between 0 - 2" << endl;
    cin >> col;
    if (col < 0 || col > 2) {
        cout << "Invalid selection select a row between 0 - 2" << endl;
        cin >> col;
    }



    if (row == 0 && col == 0)
        board[0][0] = Player1;
    else if (row == 0 && col == 1)
        board[0][1] = Player1;
    else if (row == 0 && col == 2)
        board[0][2] = Player1;
    else if (row == 1 && col == 0)
        board[1][0] = Player1;
    else if (row == 1 && col == 1)
        board[1][1] = Player1;
    else if (row == 1 && col == 2)
        board[1][2] = Player1;
    else if (row == 2 && col == 0)
        board[2][0] = Player1;
    else if (row == 2 && col == 1)
        board[2][1] = Player1;
    else if (row == 2 && col == 2)
        board[2][2] = Player1;


}


//Board function
 void drawBoard() {
    for (int i = 0; i < ROWS; i++) {

        for (int j = 0; j < COLS; j++) {
            cout << board[i][j];
        }
        cout << endl;
    }
}


//Function to switch between X's and O's

void switchPlayer() {

    char temp = Player1;
    if (Player1) {
        Player1 = Player2;
    }

    if (Player2)
    {
        Player2 = temp;
    }
}


//conditional winner checker
char winner() {
    if (board[0][0] == 'X' && board[0][1] == 'X' && board[0][2] == 'X')
        return 'X';
    if (board[1][0] == 'X' && board[1][1] == 'X' && board[1][2] == 'X')
        return 'X';
    if (board[2][0] == 'X' && board[2][1] == 'X' && board[2][2] == 'X')
        return 'X';

    if (board[0][0] == 'X' && board[1][0] == 'X' && board[2][0] == 'X')
        return 'X';
    if (board[0][1] == 'X' && board[1][1] == 'X' && board[2][1] == 'X')
        return 'X';
    if (board[0][2] == 'X' && board[1][2] == 'X' && board[2][2] == 'X')
        return 'X';

    if (board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X')
        return 'X';
    if (board[2][0] == 'X' && board[1][1] == 'X' && board[0][2] == 'X')
        return 'X';

//Player 2
    if (board[0][0] == 'O' && board[0][1] == 'O' && board[0][2] == 'O')
        return 'O';
    if (board[1][0] == 'O' && board[1][1] == 'O' && board[1][2] == 'O')
        return 'O';
    if (board[2][0] == 'O' && board[2][1] == 'O' && board[2][2] == 'O')
        return 'O';

    if (board[0][0] == 'O' && board[1][0] == 'O' && board[2][0] == 'O')
        return 'O';
    if (board[0][1] == 'O' && board[1][1] == 'O' && board[2][1] == 'O')
        return 'O';
    if (board[0][2] == 'O' && board[1][2] == 'O' && board[2][2] == 'O')
        return 'O';

    if (board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O')
        return 'O';
    if (board[2][0] == 'O' && board[1][1] == 'O' && board[0][2] == 'O')
        return 'O';
}


//Function to prevent overwriting.
void noRepeat() {
    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            if (board[i][j] == Player1 || board[i][j] == Player2) {
                cout << "Invalid selection, please choose a row and column 
again."
            }
        }
    }
}

函数noRepeat返回void。但必须返回布尔类型。

1当玩家选择行/列时,需要检查数组在该选择中是否有“*”字符,即尚未使用。2添加一个int变量“selections”,并在任何有效的选择上将其递增1。当选择点击9时,电路板已满。就像那样,你根本不需要吃东西

noRepeat函数只打印,但返回void。那么,问诺雷佩特的目的是什么

函数switchPlayer不执行任何操作。例如,下面这一个,如果您传递当前玩家,则返回另一个:…Use:1 Add char currentplayer=Player1;变量,2 currentPalayer=switchPlayercurrentPalayer;当你想换播放器的时候。当Player1和Player2可以是define的const char时,使用currentplayer变量

我想还有更多的问题

顺便说一句:将winner功能削减到1/2:

//conditional winner checker
char winner() {
    if (board[0][0] == board[0][1] && board[0][1] == board[0][2])
        return board[0][0];
    if (board[1][0] == board[1][1] && board[1][1] == board[1][2])
        return board[1][0];
    if (board[2][0] == board[2][1] && board[2][1] ==board[2][2]))
        return board[2][0];

    if (board[0][0] == board[1][0] && board[1][0] == board[2][0])
        return board[0][0] ;
    if (board[0][1] == board[1][1] && board[1][1] == board[2][1])
        return board[0][1];
    if (board[0][2] == board[1][2] && board[1][2] == board[2][2])
        return board[0][2];

    if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
        return board[0][0];
    if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
        return board[2][0];
}

我们都可以建议对您的代码进行改进,也许应该在下一步进行处理。除了进行主要的重新编码之外,让我们来看看对其中一个函数进行的小调整:

void selection(int &row, int &col)
{
    cout << "Enter a number for row between 0 - 2" << endl;
    cin >> row;
    while (row < 0 || row > 2) {
        cout << "Invalid selection select a row between 0 - 2" << endl;
        cin >> row;
    }

    cout << "Enter a number for col between 0 - 2" << endl;
    cin >> col;
    while (col < 0 || col > 2) {
        cout << "Invalid selection select a row between 0 - 2" << endl;
        cin >> col;
    }

    board[row][col] = Player1;
}
我对您的函数所做的是将验证逻辑从if更改为while循环,因为您希望在收到有效输入之前一直询问。另一件事是我重构了你的setter。当一个单排板[行]列]=玩家时,为什么会有所有这些if变化;你能做同样的工作吗

总的来说,我不喜欢这个函数,因为这里错过了对“*”进行验证的机会。如果不重写该函数的更大部分,我无法证明这一点

我对代码的其他问题是:

“X”和“O”的处理。我会选择值为0或1的int currentPlayer。您可以实现一个charplayermarker[2]={'X','O'};查找,以便在移动时使用正确的符号。 切换播放器逻辑错误。你只需要一个变量,你有两个变量,它可以解决复杂的问题。如果您只有一个变量,那么可以将其实现为1行:例如currentPlayer=1-currentPlayer; 板本身,我会选择char board[ROW][COL+2];并添加了LF和NUL终止符,然后打印电路板将只打印3个字符串:putsboard[0];踏板[1];踏板[2]; 获胜条件已被另一用户重构 僵局是无法避免的。大多数的TIC-TAC-TOE玩家很快就达到了这个目标 noRepeat的实现毫无意义。
如果noRepeat-但是noRepeat是空的-那它甚至可以编译吗?另外,通过输入“X”或“O”作为参数,并使用相同的逻辑将获胜者一分为二。这里有一个提示:当你得到这样的结果时,最好打印数组中的内容,以便准确地看到发生了什么。添加日志行以查看代码所采用的路径,从而了解正在发生的情况。然后,您将获得一项技能,帮助您修复许多bug。如果您使用的是像VisualStudio或Netbeans这样的IDE,那么请学习如何单步执行代码并在变量上添加监视。我提到的这些东西都是我们称之为调试的一部分。这是编程的正常部分。祝你好运。我还建议下载并安装Visual Studio 2017社区。这是一个全功能版本,免费。
void selection(int &row, int &col)
{
    cout << "Enter a number for row between 0 - 2" << endl;
    cin >> row;
    while (row < 0 || row > 2) {
        cout << "Invalid selection select a row between 0 - 2" << endl;
        cin >> row;
    }

    cout << "Enter a number for col between 0 - 2" << endl;
    cin >> col;
    while (col < 0 || col > 2) {
        cout << "Invalid selection select a row between 0 - 2" << endl;
        cin >> col;
    }

    board[row][col] = Player1;
}