0

私は現在、大学向けのゼロとクロスのプログラムを作成しています。この任務の必要最小限の作業は完了しましたが、ゲームを終了するための勝利条件を作成するのに問題があります。以下は、これまでに使用したすべてのコードです。

#include <iostream>
#include <string>

using namespace std;

class Player
{
private:
    char NorX;

public:

    char Choose(char InitialValue)
    {
        NorX = InitialValue;
        return InitialValue;
    }

    char GetNorX()
    {
        return NorX;
    }
};

int main()
{
    Player Player1;
    Player Player2;

    Player1.Choose('O');
    Player2.Choose('X'); 

    cout << "The board is being drawn please wait..." << endl;

    const int Rows = 4;
    const int Columns = 4;
    char Board[Rows][Columns] = { {' ', ' ', ' ', ' ' },
                                  {' ', '_', '_', '_' },
                                  {' ', '_', '_', '_' },
                                  {' ', '_', '_', '_' } };

    for (int i = 0; i < Rows; ++i)
    {
        for (int j = 0; j < Columns; ++j)
            cout << Board [i][j];
        cout << endl;
    }

    cout << endl << endl;

    int row;
    int column;

    do
    {
        do
        {
            cout << "Please enter the value of the row you would like to take ";
            cin >> row;
        }while (row != 0 && row != 1 && row != 2 && row != 3);


        do
        {
            cout << "Please enter the value of the column you would like to take ";
            cin >> column;
        }while (column != 0 && column != 1 && column != 2 && column != 3);


        Board [row][column] = Player1.GetNorX();

        for (int i = 0; i < Rows; ++i)
        {
            for (int j = 0; j < Columns; ++j)
                cout << Board [i][j];
            cout << endl;
        }

        /*int row;*/
        do
        {
            cout << "Please enter the value of the row you would like to take ";
            cin >> row;
        }while (row != 0 && row != 1 && row != 2 && row != 3);

        /*int column;*/
        do
        {
            cout << "Please enter the value of the column you would like to take ";
            cin >> column;
        }while (column != 0 && column != 1 && column != 2 && column != 3);

        Board [row][column] = Player2.GetNorX();

        for (int i = 0; i < Rows; ++i)
        {
            for (int j = 0; j < Columns; ++j)
                cout << Board [i][j];
            cout << endl;
        }

        if (Board[1][1] == Board[1][2] == Board[1][3] == 'O')
        {
            cout << endl << "Well done you win";
        }

    }while (column != 4 && row != 4);

    system("pause");
}

プログラムの実行に影響を与えていないように見えるため、問題は if ステートメントで発生します。

4

5 に答える 5

4

比較演算子を連鎖させた結果は、期待したものではありません。これを行う正しい方法は、それらを&&

if (Board[1][1] == 'O' && Board[1][2] == 'O' && Board[1][3] == 'O')

もう1つは次のように機能します

Board[1][1] == Board[1][2]

trueまたはのいずれかを与えるfalse。これと比較されます

true == Board[1][3]

true繰り返しますが、またはのいずれかを与えますfalse。これと比較されます

false == '0'

これは常に になりfalseます。

于 2013-02-20T14:58:07.063 に答える
3

この比較を一緒に文字列化することはできません。

Board[1][1] == Board[1][2] == Board[1][3] == 'O'

発生するのはBoard[1] == Board[1][2]、最初にtrueor false and then that boolean value is compared toBoard[1][3]` などに評価されることだけです。

あなたが望むものは:

Board[1][1] == 'O' && Board[1][2] == 'O' && Board[1][3] == 'O'
于 2013-02-20T14:58:47.323 に答える
1

あなたのif状態は間違っています。
以下のコードに置き換える必要があります。

if ((Board[1][1] == Board[1][2]) && 
    (Board[1][2] == Board[1][3]) && 
    (Board[1][3] == 'O'))

横の当選条件をチェックする場合、横のラインの 3 つのブロックすべての値が0でなければなりません。

于 2013-02-20T14:58:33.500 に答える
1

使用する必要があります

if (Board[1][1] == Board[1][2] && 
    Board[1][1] == Board[1][3] && 
    Board[1][1] == 'O')

また

if (Board[1][1] == 'O' && 
    Board[1][2] == 'O' && 
    Board[1][3] == 'O')

たとえば、ステートメントの現在の形式では、 は ではなく、比較Board[1][2]の結果と比較されます。Board[1][3]=='O'Board[1][3]

于 2013-02-20T14:57:55.707 に答える
-1

gdb などのデバッガーでこれを実行する必要があります。開始するには、Google の「gdb チートシート」を参照してください。コードのどの行が実行されているかを正確に確認でき、特に「if」が評価されていることを確認できます。

于 2013-02-20T15:00:12.370 に答える