Проблемы с проверкой функции ввода массива с операторами IF - PullRequest
0 голосов
/ 30 июля 2010

Функция void checkboard не работает. Это игра в крестики-нолики. Таким образом, эта функция проверяет после каждого хода, выиграл ли кто-то игру или имеет ничью. После того, как кто-то выиграет или сыграет вничью, настольная карта должна быть сброшена и игра начала. Я просто не могу заставить функцию void checkboard работать. Пожалуйста, помогите мне решить эту проблему.

checkboard должен проверять каждый пользовательский ввод, чтобы увидеть, выиграла ли эта игра. Таким образом, checkboard должен проверить, есть ли у playerOne X в линии или по диагонали, или есть ли у playerTwo Os таким же образом или есть ли связь. Если игрок выигрывает или есть ничья, он сообщает, кто выиграл или что есть ничья, и затем спрашивает пользователя, хотят ли они играть снова или выйти из программы. По их ответу доска сбрасывается или игра выходит.

Проблема, я думаю, в том, что bGameOver продолжает работать, несмотря ни на что. Я поставил после кода перед gameover bGameOver = false, и программа работала так, как и предполагалось. Так что где-то в выражениях if он продолжает делать bGameOver = true после 1 хода.

После того, как она будет решена, я хотел бы получить предложения по ее улучшению только после того, как проблема будет решена.

#include <iostream>
#include <string>




void checkboard(char** CurrentPlayer, char (&squares)[3][3], char &playerMarker, bool bGameOver,char playerOne[]);


using namespace std;

void main() 
{
 char board[3][3];
    board[0][0] = ' ';
    board[0][1] = ' ';
    board[0][2] = ' ';
    board[1][0] = ' ';
    board[1][1] = ' ';
    board[1][2] = ' ';
    board[2][0] = ' ';
    board[2][1] = ' ';
    board[2][2] = ' ';
 bool bGameOver(true);
 char playerMarker;


     // Main game loop
     do 
     {

      showboard(board);

      boardMarker(playerTurn, playerOne, playerTwo, playerMarker, &currentPlayer);

      playerMove(currentPlayer,  board, playerMarker);

      checkboard(&currentPlayer,  board, playerMarker, bGameOver, playerOne);

      alternatePlayers(playerTurn);

     }
     while (!bGameOver);
    }



    void showboard(char (&board)[3][3]) 
    { 
        for(int i = 0; i < 3; ++i)
        {
            for(int j = 0; j < 3; ++j)
            {
                cout << board[i][j];
                if(j < 2) cout << "|";
            }
            cout << "\n";
            if(i < 2) cout << "-+-+-" << endl;;
        }
    } 


    void playerMove(char* CurrentPlayer, char (&board)[3][3], char &playerMarker)
    {
     bool bValidMove;
     int x,y;
     // Prompt the player for a move
     cout << "Player " << CurrentPlayer << "'s move:" << endl;



     // Loop until we get a valid move
     do 
     {
      cout << "Please enter the row number for the place you wish to mark: " << endl;
      cin >> x;
      cout << "Please enter the column number for the place you wish to mark" << endl;
      cin >> y;
      bValidMove = true;

      // Check for a valid move
      if (x == 1 && y == 1)
      {
       board[0][0] = playerMarker;
      } 
      else if (x == 1 && y == 2) 
      {
       board[0][1] = playerMarker;
      } 
      else if (x == 1 && y == 3) 
      {
       board[0][2] = playerMarker;
      }
      else if (x == 2 && y == 1) 
      {
       board[1][0] = playerMarker;
      }
      else if (x == 2 && y == 2)
      {
       board[1][1] = playerMarker;
      }
      else if (x == 2 && y == 3)
      {
       board[1][2] = playerMarker;
      }
      else if (x == 3 && y == 1)
      {
       board[2][0] = playerMarker;
      }
      else if (x == 3 && y == 2)
      {
       board[2][1] = playerMarker;
      }
      else if (x == 3 && y == 3) 
      {
       board[2][2] = playerMarker;
      }
      else 
      {
       cout << "Invalid Move. Try again." << endl;
       bValidMove = false;
      }

     } 
     while (!bValidMove);

    }

   void checkboard(char** CurrentPlayer, char (&board)[3][3], char &playerMarker, bool bGameOver, char playerOne[100])
{

        bGameOver       = false;
        bool bWinGame   = true;
        // Check for end of game conditions
    do
    {
        if (board[0][0] = playerMarker) 
        {
            if (board[0][1] == board[0][0] && board[0][2] == board[0][0]) {
                bGameOver = true;
            }
            if (board[1][0] == board[0][0] && board[2][0] == board[0][0]) {
                bGameOver = true;
            }
        }
        if (board[1][1] != playerMarker) 
        {
            if (board[0][0] == board[1][1] && board[2][2] == board[1][1]) 
            {
                bGameOver = true;
            }
            if (board[0][1] == board[1][1] && board[2][1] == board[1][1]) 
            {
                bGameOver = true;
            }
            if (board[1][0] == board[1][1] && board[1][2] == board[1][1]) 
            {
                bGameOver = true;
            }
            if (board[0][2] == board[1][1] && board[2][0] == board[1][1]) 
            {
                bGameOver = true;
            }
        }
        if (board[2][2] != playerMarker) 
        {
            if (board[0][2] == board[2][2] && board[1][2] == board[2][2]) 
            {
                bGameOver = true;
            }
            if (board[2][0] == board[2][2] && board[2][1] == board[2][2]) 
            {
                bGameOver = true;
            }
        }
        // Need to check the board full (no-win condition)
        if (board[0][0] != playerMarker && board[0][1] != playerMarker && board[0][2] != playerMarker &&
            board[1][0] != playerMarker && board[1][1] != playerMarker && board[1][2] != playerMarker &&
            board[2][0] != playerMarker && board[2][1] != playerMarker && board[2][2] != playerMarker && !bGameOver)
        {
            bGameOver = true;
            bWinGame = false;
        }

        system("cls");

        if (bGameOver) 
        {
            if (bWinGame) 
            {
                cout << "Player " << CurrentPlayer << " wins!" << endl;
            }
            // Print ending board

         for(int i = 0; i < 3; ++i)
        {
            for(int j = 0; j < 3; ++j)
            {
            cout << board[i][j];
            if(j < 2) cout << "|";
            }
            cout << "\n";
            if(i < 2) cout << "-+-+-" << endl;;
        }

            cout << "Game Over!" << endl;
            cout << "Play again (y/n)?" << endl;
            char cPlayAgain;
            cin >> cPlayAgain;

            if (cPlayAgain == 'y') 
            {
                bGameOver = false;
                // Clear the board
                board[0][0] = ' ';
                board[0][1] = ' ';
                board[0][2] = ' ';
                board[1][0] = ' ';
                board[1][1] = ' ';
                board[1][2] = ' ';
                board[2][0] = ' ';
                board[2][1] = ' ';
                board[2][2] = ' ';
            }
        *CurrentPlayer = playerOne;
        } 

} while (!bGameOver);
}

Ответы [ 2 ]

0 голосов
/ 13 сентября 2016
if (board[0][0] = playerMarker)

Это всегда назначит playerMarker на доску [0] [0]. Вы должны привыкнуть к разнице между «=» (назначение) и «==» (вопрос «равны ли они?»), Ср. Условия Йода хотя это вам здесь не поможет.

0 голосов
/ 30 июля 2010

Как насчет использования подписи:

void checkboard(char** CurrentPlayer, char** squares, char &playerMarker, bool bGameOver,char playerOne[]);

Хотя я думаю, что это не единственное, что вы должны изменить, я бы порекомендовал вам прочитать немного больше о массивах и указателях и попрактиковаться с небольшими программами.

Я не знаю, как вы смогли все это кодировать, не заметив, что это не сработало, как ожидалось.

Я также не знаю, собирается ли кто-нибудь найти время и исправить вашу программу для вас. Это домашнее задание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...