井字游戏C ++覆盖开发板

时间:2018-07-02 02:32:06

标签: c++ arrays if-statement

嗨,所以我在大多数情况下都按照我想要的方式进行了设置。我要实现的最后一部分是使它具有这样的功能,以便在输入X0时输入都不会覆盖自身。如果有人可以看一下并告诉我我的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."
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

(1)当玩家选择Row / Col时,有必要检查数组在该选择中是否具有'*'字符(即尚未使用)。 (2)添加一个int变量“选择”,并在任何有效选择上将其递增1。当选择达到9时,电路板已满。这样,您根本不需要noRepeat()

noRepeat()函数仅打印但返回空值。那么问if (noRepeat())的目的是什么?

函数switchPlayer()不执行任何操作。例如,如果您传递“当前玩家”,则下面的这个返回另一个:。用途:(1)添加char currentPalayer = Player1;变量,(2)添加currentPalayer = switchPlayer(currentPalayer);想要切换播放器。当currentPalayerPlayer1可以是Player2的{​​{1}}时,请使用const char变量

#define

我想还有更多问题。

顺便说一句:将winner()函数减少到1/2:

char switchPlayer(char currentPlayer) {

    const int K = Player1 + Player2;

    return (char) (K - currentPlayer);
}

答案 1 :(得分:0)

您的函数noRepeat()返回void。但是必须返回boolean类型。

答案 2 :(得分:0)

我们都可以建议您改进代码,也许应该在https://codereview.stackexchange.com/处进行处理。除了进行重大的编码外,我们来看一下对其中一个功能进行细微的调整:

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循环,因为您要一直询问直到收到有效输入。另一件事是我重构了你的二传手。当一个1缸衬纸if可以完成相同的工作时,为什么会有所有这些board[row]col] = Player;的变化?

总的来说,我不喜欢此功能,因为这里错过了对'*'进行验证的机会。如果不重写该函数的大部分内容,我将无法证明这一点。

我在代码中遇到的其他问题是:

  • “ X”和“ O”的处理。我本来会选择值为{0或1的int currentPlayer的。您可能已经实现了char playerMarker[2] = { 'X', 'O' };的查找,因此在进行移动时会使用正确的符号。
  • 切换播放器逻辑错误。您只需要一个变量,就可以使用两个变量来处理复杂的事情。如果您只有一个变量,则可以将其实现为1个底线:例如currentPlayer = 1 - currentPlayer;
  • 板子本身,我本来会用char board[ROW][COL + 2];并添加一个LF和NUL终止符,然后打印该板子只需打印3个字符串:puts(board[0]); puts(board[1]); puts(board[2]);
  • 获胜条件已经被其他用户重构
  • 不存在僵局。其中,大多数TIC-TAC-TOE参与者迅速达到
  • noRepeat的实现没有任何意义。