1

3x3 の 2D tic-tac-toe ゲームをコーディングするのに忙しいので、すぐに 3D バージョンに変換したいと思います - 友人が教えてくれたものです。

とにかく、私は基本的なことのほとんどをダウンしています (プレイヤー 1、プレイヤー 2、行と列の値の入力など。しかし、値の行または値の列が互いに等しいかどうかを比較するのに行き詰まりました。

constexpr size_t rows = 3;
constexpr size_t cols = 3;

char gameBoard[rows][cols] = {
{'-','-','-'},
{'-','-','-'},
{'-','-','-'}
};

これが入力プロセスによって次のように変更された場合:

char gameBoard[rows][cols] = {
{'O','O','O'},
{'X','X','-'},
{'-','-','X'}
};

行1がいっぱいになり、必要な出力を提供できることを認識してもらいたいです。

forループを使用して、最初の char と 2 番目の 3 分の 1 の間の等価性を確認したかったの&&ですが、何らかの理由でこれを行うと、与えられた "win text" という出力が得られるだけのようです。

与えられた入力に感謝します:)

*したがって、この質問には回答がありましたが、行と列をテストするために行ったことのコードを提供したかっただけです。私はちょうどそれを仕上げているので、対角線セクションを含めていませんが、それはかなり簡単なはずです (たとえば、左上から右下への対角線をテストする[i][j]必要はありません)。[j][j]

for (size_t i = 0; i != 1; i++)
        {
            int win_cnt = 0;
            for (size_t j = 0; j != 3; j++)
            {
                if (gameBoard[i][j] == 'X')
                {
                    win_cnt++;
                    if (win_cnt == 3)
                    {
                        system("cls"); //Please do not mind this, this is a placeholder
                        cout << "\n Player 1 has won the game!" << endl;
                        return 0;
                    }
                }
            }//Check for row win

            win_cnt = 0;
            for (size_t j = 0; j != 3; j++)
            {
                if (gameBoard[j][i] == 'X')
                {
                    win_cnt++;
                    if (win_cnt == 3)
                    {
                        system("cls"); //Please do not mind this, this is a placeholder
                        cout << "\n Player 1 has won the game!" << endl;
                        return 0;
                    }
                }
            }//Check for column win
        }//Check for win PRIMARY

システムの使用を気にしないでください。使用済みの「コンソール」画面をクリアする関数をコーディング中です。system("cls") は、今すぐデバッグするためのより高速な方法です。

4

2 に答える 2

1

あなたはそのようなことをすることができます:

// Check rows
for (int row=0; row<rows; ++row) {
  char first = gameBoard[row][0];
  int col = 1;
  while (gameBoard[row][col]==first && col<cols) ++col;

  if (col==cols-1) return new std::string(first) + " wins"!;
}

同様に、列と対角線を確認できます

于 2013-06-04T18:03:15.233 に答える
0

素朴で最も単純な解決策は、2 つのループを用意することです。1 つは 3 つすべてが に等しいかどうかをチェックし'O'、そうでない場合は、3 つすべてが に等しいかどうかをチェックするために別のループを実行し'X'ます。

次の擬似コードのようなもの:

winner = check_winner('O');
if (winner != 'O')
    winner = check_winner('X');

if (winner != '-')
    std::cout << "The winner is " << winner << '\n';

もちろん、関数check_winnerは実際のチェックを行い、シンボルを返す'-'か、勝者がいない場合に返します。

于 2013-06-04T17:57:36.820 に答える