Помогите превратить кодирование C ++ в функцию - PullRequest
0 голосов
/ 30 июля 2010

SigTerm сказал это: "Пахнет как плохой код. SquareOne..squareSix, вероятно, должен быть массивом. Вместо констант char, вероятно, следует использовать перечисления или целые числа ..." Как мне сделать это с помощью этого кода для доски, если бы кто-то мог предложить код, который я должен был бы использовать, чтобы пользователи вводили строку и столбец для X и O для игры.

void showboard(char &squareOne, char &squareTwo, char &squareThree, char &squareFour, char &squareFive, char &squareSix, char &squareSeven,
                char &squareEight, char &squareNine)
{

    cout << squareOne << "|" << squareTwo << "|" << squareThree << endl
            << "-+-+-"<< endl
            << squareFour << "|" << squareFive << "|" << squareSix << endl
            << "-+-+-"<< endl
            << squareSeven << "|" << squareEight << "|" << squareNine << endl;

Проблема в том, что я взял этот код и превратил его в функцию. Ниже приведен код того, что я пытаюсь превратить в функцию. После этой функции "checkboard" я пытаюсь превратить код над ней в функцию

  bGameOver     = false;
                bool bWinGame   = true;
                // Check for end of game conditions
                if (squareOne != '1') {
                    if (squareTwo == squareOne && squareThree == squareOne) {
                        bGameOver = true;
                    }
                    if (squareFour == squareOne && squareSeven == squareOne) {
                        bGameOver = true;
                    }
                }
                if (squareFive != '5') 
                {
                    if (squareOne == squareFive && squareNine == squareFive) 
                    {
                        bGameOver = true;
                    }
                    if (squareTwo == squareFive && squareEight == squareFive) 
                    {
                        bGameOver = true;
                    }
                    if (squareFour == squareFive && squareSix == squareFive) 
                    {
                        bGameOver = true;
                    }
                    if (squareThree == squareFive && squareSeven == squareFive) 
                    {
                        bGameOver = true;
                    }
                }
                if (squareNine != '9') 
                {
                    if (squareThree == squareNine && squareSix == squareNine) 
                    {
                        bGameOver = true;
                    }
                    if (squareSeven == squareNine && squareEight == squareNine) 
                    {
                        bGameOver = true;
                    }
                }
                /* Need to check the board full (no-win condition*/)
                if (squareOne != '1' && squareTwo != '2' && squareThree != '3' &&
                    squareFour != '4' && squareFive != '5' && squareSix != '6' &&
                    squareSeven != '7' && squareEight != '8' && squareNine != '9' && !bGameOver)
                {
                    bGameOver = true;
                    bWinGame = false;
                }

                system("cls");

                if (bGameOver) 
                {
                    if (bWinGame) 
                    {
                        cout << "Player " << currentPlayer << " wins!" << endl;
                    }
                    // Print ending board
                    cout << squareOne << "|" << squareTwo << "|" << squareThree << endl;
                    cout << "-+-+-"<< endl;
                    cout << squareFour << "|" << squareFive << "|" << squareSix << endl;
                    cout << "-+-+-"<< endl;
                    cout << squareSeven << "|" << squareEight << "|" << squareNine << endl;

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

                    if (cPlayAgain == 'y') 
                    {
                        bGameOver = false;
                        /* Clear the board*/
                        squareOne = '1';
                        squareTwo = '2';
                        squareThree = '3';
                        squareFour = '4';
                        squareFive = '5';
                        squareSix = '6';
                        squareSeven = '7';
                        squareEight = '8';
                        squareNine = '9';
                    }
                    currentPlayer[100] = 1;
                } 

            } while (!bGameOver);



void checkboard(char** pCurrentPlayer, char &squareOne, char &squareTwo, char &squareThree, char &squareFour, char &squareFive, char &squareSix, char &squareSeven,
                    char &squareEight, char &squareNine, char &playerMarker, bool bGameOver)
    {

            bGameOver       = false;
            bool bWinGame   = true;
            // Check for end of game conditions
            if (squareOne != '1') {
                if (squareTwo == squareOne && squareThree == squareOne) {
                    bGameOver = true;
                }
                if (squareFour == squareOne && squareSeven == squareOne) {
                    bGameOver = true;
                }
            }
            if (squareFive != '5') 
            {
                if (squareOne == squareFive && squareNine == squareFive) 
                {
                    bGameOver = true;
                }
                if (squareTwo == squareFive && squareEight == squareFive) 
                {
                    bGameOver = true;
                }
                if (squareFour == squareFive && squareSix == squareFive) 
                {
                    bGameOver = true;
                }
                if (squareThree == squareFive && squareSeven == squareFive) 
                {
                    bGameOver = true;
                }
            }
            if (squareNine != '9') 
            {
                if (squareThree == squareNine && squareSix == squareNine) 
                {
                    bGameOver = true;
                }
                if (squareSeven == squareNine && squareEight == squareNine) 
                {
                    bGameOver = true;
                }
            }
            // Need to check the board full (no-win condition)
            if (squareOne != '1' && squareTwo != '2' && squareThree != '3' &&
                squareFour != '4' && squareFive != '5' && squareSix != '6' &&
                squareSeven != '7' && squareEight != '8' && squareNine != '9' && !bGameOver)
            {
                bGameOver = true;
                bWinGame = false;
            }

            system("cls");

            if (bGameOver) 
            {
                if (bWinGame) 
                {
                    cout << "Player " << pCurrentPlayer << " wins!" << endl;
                }
                // Print ending board
                cout << squareOne << "|" << squareTwo << "|" << squareThree << endl;
                cout << "-+-+-"<< endl;
                cout << squareFour << "|" << squareFive << "|" << squareSix << endl;
                cout << "-+-+-"<< endl;
                cout << squareSeven << "|" << squareEight << "|" << squareNine << endl;

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

                if (cPlayAgain == 'y') 
                {
                    bGameOver = false;
                    // Clear the board
                    squareOne = '1';
                    squareTwo = '2';
                    squareThree = '3';
                    squareFour = '4';
                    squareFive = '5';
                    squareSix = '6';
                    squareSeven = '7';
                    squareEight = '8';
                    squareNine = '9';
                }
                pCurrentPlayer = "1";
            } 

    } 

Ответы [ 3 ]

1 голос
/ 30 июля 2010

В PlayerMove() вы передаете pCurrentPlayer как char **, который является указателем на указатель.Измените это на char *, тогда оно должно правильно отображать содержимое в функции.Вы не изменяете значение указателя в этой функции, поэтому ему не требуется дополнительная косвенность.

Удалите также адрес оператора (&) из соответствующих аргументов вызова функции.

0 голосов
/ 13 августа 2010

Эй, просто так получилось, что не так давно я написал «игру» в стиле c ++ tic toe для сообщения в блоге.

http://alongbutsimplenameformyblog.blogspot.com/2010/08/tic-tac-toe.html

Здесь я старался изо всех силписать компактный, но читаемый код и помнить о производительности.Я получил программу из 32 строк кода.Единственное, чего я не делаю, так это позволяю игре быть «играбельной».

Если вы посмотрите на мой код, вы сможете увидеть способ организации вашей игры в многомерный массив.,То, как вы читаете это (если вы не в курсе, извините, если я говорю вам то, что вы знаете):

arrayName[rowNumber][columnNumber];

Итак, чтобы поменять верхнюю правую рамку крестика-нолика.'x' вы бы сказали:

arrayName[0][2] = 'x';

Когда вы используете массивы, имейте в виду, что он начинается с элемента 0, а не с элемента 1. Это то, что я забыл при запуске, по крайней мере.

Итак, надеюсь, прочитав мой код, вы сможете увидеть, как довольно легко проверить условие выигрыша в функции.Если у вас есть вопросы о том, как работает мой код, или о том, как реализовать это, не стесняйтесь.Я вернусь периодически.Кроме того, поскольку учебный год начинается осенью, я должен больше писать в блоге о таких вещах, когда я помогаю студентам первого и второго курса в моей программе.Так что не стесняйтесь в закладки или подписаться.

#include < iostream >

const char grid[3][3] = {'x', ' ', 'o', 'o','x', 'o', 'x', 'x', 'o'};

inline const bool checkLine(char x, char y, char z) {
    return (x == y && y == z && x != ' ');
}

inline const bool checkWin(){
    bool a = 0, b = 0;
    for(unsigned char i = 0; i < 3; ++i)
       if(checkLine(grid[i][0], grid[i][1], grid[i][2]) || checkLine(grid[0][i], grid[1][i], grid[2][i]))
           return true;
    for(unsigned char i = 0; i < 2; ++i)
        if(checkLine(grid[i == 0 ? 0 : 2][0], grid[1][1], grid[i == 0 ? 2 : 0][2]))
            return true;
    return false;
}

int main(){
    for (unsigned char i = 0; i < 3; ++i) {
        for (unsigned char j = 0; j < 3; ++j)
            std::cout << grid[i][j];     
        std::cout << "\n";
    }

    if (checkWin()) 
        std::cout << "WINNER\n";

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

Эта строка:

currentPlayer[100] = 1;

Очень проблематично.

currentPlayer должен указывать либо на playerOne, либо на playerTwo.

Я понятия не имею, что вы пытаетесь сделать с этой строкой, но это явно неправильно.

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