簡體   English   中英

井字游戲不起作用

[英]Tic Tac Toe game won't work

因此,大約一周前我學習了編程。 我決定制作一個井字游戲作為一項業余愛好項目,我啟動並運行了基本的游戲輸入法,但其中一個方面不起作用。 我編寫了一段非常簡單的代碼,以驗證有人打5步棋是否贏了。 一旦有人獲勝,就應該顯示“ Game Over!”。 但這不是出於某種原因。 有人可以幫忙嗎? _ __ _ __ _ __ _ ___ 注意:代碼中驗證人是否成功的方法還不完整。 它僅用於行,因為當我對其進行測試時,它不起作用。

#include <iostream>
#include <cstdlib>

using namespace std;
int main()
{
    char grid[3][3];
    int p;
    cout << "Enter column number. \n";
    cin >> p;
    int o;
    cout << "Enter row number. \n";
    cin >> o;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    int q;
    cout << "Enter column number. \n";
    cin >> q;
    int r;
    cout << "Enter row number. \n";
    cin >> r;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    int s;
    cout << "Enter column number. \n";
    cin >> s;
    int t;
    cout << "Enter row number. \n";
    cin >> t;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    int v;
    cout << "Enter column number. \n";
    cin >> v;
    int b;
    cout << "Enter row number. \n";
    cin >> b;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    int f;
    cout << "Enter column number. \n";
    cin >> f;
    int g;
    cout << "Enter row number. \n";
    cin >> g;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
    int i;
    cout << "Enter column number. \n";
    cin >> i;
    int u;
    cout << "Enter row number. \n";
    cin >> u;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            grid[u][i] = 'O';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
    int a1;
    cout << "Enter column number. \n";
    cin >> a1;
    int e1;
    cout << "Enter row number. \n";
    cin >> e1;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            grid[u][i] = 'O';
            grid[e1][a1] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
    int a8;
    cout << "Enter column number. \n";
    cin >> a8;
    int b8;
    cout << "Enter row number. \n";
    cin >> b8;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            grid[u][i] = 'O';
            grid[e1][a1] = 'X';
            grid[b8][a8] = 'O';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
    int a9;
    cout << "Enter column number. \n";
    cin >> a9;
    int b9;
    cout << "Enter row number. \n";
    cin >> b9;
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            grid[x][y] = '-';
            grid[o][p] = 'X';
            grid[r][q] = 'O';
            grid[t][s] = 'X';
            grid[b][v] = 'O';
            grid[g][f] = 'X';
            grid[u][i] = 'O';
            grid[e1][a1] = 'X';
            grid[b8][a8] = 'O';
            grid[b9][a9] = 'X';
            cout << grid[x][y] << " ";
        }
        cout << endl;
    }
    if (grid[0][0] == grid[0][1] == grid[0][2] || grid[1][0] == grid[1][1] == grid[1][2] || grid[2][0] == grid[2][1] == grid[2][2])
    {
        cout << "Game Over! \n\n";
    }
}

在C ++中, ==符號不能像代數類那樣工作。 在C ++中,表達式a == b == c具有非常不同的含義。 在C ++中,它僅適用於成對的項,並返回truefalse值。 (請參閱下文。)

要查看3個事物是否彼此相等,您需要說(a == b && b == c) 您的網格檢查將需要如下所示:

if ( (grid[0][0] == grid[0][1] && grid[0][1] == grid[0][2]) || 
     (grid[1][0] == grid[1][1] && grid[1][1] == grid[1][2]) ||
     (grid[2][0] == grid[2][1] && grid[2][1] == grid[2][2]) )

您還會注意到我在其中加了多余的括號。 它們不是嚴格必需的,但是某些編譯器會在混合&&||時發出警告。 在相同的表達中。 括號使您可以將要分組的項目明確,並將平息這些警告。


那么,什么 C ++編譯器與您的代碼在做什么? 您已經編寫了grid[0][0] == grid[0][1] == grid[0][2] 編譯器根據其運算符優先級規則解釋為(grid[0][0] == grid[0][1]) == grid[0][2]

編譯器將首先比較grid[0][0]grid[0][1] 根據它們是否相等,這將產生一個truefalse布爾值(C ++ bool )。 到現在為止還挺好。

比較之后,它將bool結果與grid[0][2] 由於grid[0][2]是一個char ,它將bool值提升為數值。 true變為1, false變為0。所有網格值都不具有值0或1-它們全都是'-''X''O' ,因此第二次比較總是失敗。

對於所有三行重復相同的情況。

據我了解,您不能寫:

grid[0][0] == grid[0][1] == grid[0][2]

你應該有:

grid[0][0] == grid[0][1] && grid[0][1]== grid[0][2]

在C ++中,它們是二進制運算符,因此==只能應用於兩個變量,不能鏈接到三個變量。 現在,它將第一個結果(是/否)與第三個數字進行比較。

我的資料來源:

C ++井字游戲

如果您使用一個數組並將框1到9編號,則程序將小很多:

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+

該數組將如下所示:

const unsigned int BOARD_CAPACITY = 9;
unsigned int board[BOARD_CAPACITY + 1];

board數組聲明有一個額外的插槽,因此您可以安全地使用索引1到9。

單行檢查:

bool row_wins = false;
if ((board[1] == board[2]) && (board[2] == board[3]))
{
  row_wins = true;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM