1. ホーム
  2. c++

[解決済み] C++と多次元配列を使ったチックタックトー【終了しました

2022-02-12 20:53:37

質問内容

皆さん、ありがとうございました!プログラミングは初めてで、不器用な私ですが、よろしくお願いします。動作するようになりました! ゲームオーバーのチェックに使うforループや、盤面の設定に使うカウンタなど、コードにいくつか問題がありました。しかし、最終的なコードにはバグがないようです。コンソールに、2人が一緒に遊べるようなラベル付きのマスがプリントアウトされるのです。今、とても幸せです。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

bool over = false;

void print_board(char board[3][3])
{
    cout<<"\n------------------\n";
    cout<<"\n  "<<board[0][0]<<"  |  "<<board[0][1]<< "  |  "<<board[0][2];
    cout<<"\n------------------\n";
    cout<<"\n  "<<board[1][0]<<"  |  "<<board[1][1]<< "  |  "<<board[1][2];
    cout<<"\n------------------\n";
    cout<<"\n  "<<board[2][0]<<"  |  "<<board[2][1]<< "  |  "<<board[2][2];
    cout<<"\n------------------\n";
}

bool checkForCorrectMove (char board[3][3], int choice, bool player1Turn)
{
    int xCor;
    int yCor;
    xCor = ((choice + 2) / 3) - 1; 
    yCor = (choice - 1) % 3;
    if (((board[xCor][yCor]) != 'X') && ((board[xCor][yCor]) != 'O'))
    {
        if (player1Turn)
            board[xCor][yCor] = 'X';
        if (!player1Turn)
            board[xCor][yCor] = 'O';
        return true;
    }
    else 
        return false;
}

bool checkRow(char board[3][3])
{
    for (int i = 0; i<3; i++)
    {
        if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]))
        {
            return true;
        }
    }
    return false;
}
bool checkColumn (char board[3][3])
{
    for (int i = 0; i<3; i++)
    {
        if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]))
        {
            return true;
        }
    }
    return false;
}
bool checkForWin (char board[3][3])
{
    bool win = false;
    bool line_win = false;
    if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
    {
        win = true;
        return win;
    }
    if ((board[2][0] == board[1][1]) && (board[1][1] == board[0][2]))
    {
        win = true;
        return win;
    }

    if (checkColumn(board) || checkRow (board))
    {
        win = true;
        return win;
    }
    return win;
}

int main()
{
    cout << "Welcome to Tic Tac Toe!\n";
    int choice;
    int boardcounter = 1;
    bool isOkayToMove = true;
    bool player1Turn = true;
    char board[3][3];
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            board[i][j] = boardcounter + '0';
            boardcounter++;
        }
    }
    print_board(board);
    do {
        if (player1Turn)
        {
            cout <<"\n\nPlayer 1, please enter a number that corresponds to an open space: ";
        }
        else
        {
            cout <<"\n\nPlayer 2, please enter a number that corresponds to an open space: ";
        }
        cin>>choice;
        isOkayToMove = checkForCorrectMove(board, choice, player1Turn);
        if (isOkayToMove)
        {
            over = checkForWin(board);
            print_board(board);
            player1Turn = !player1Turn;
        }
        else
        {
            cout <<"\n\nYou have attempted to move into a space that is already occupied, please try again.";
            print_board(board);
        }
    }
    while (over == false);
    cout <<"\n\nCongratulations!";
    player1Turn = !player1Turn;
    if (player1Turn)
        cout<<" Player 1 has won!";
    else
        cout<<" Player 2 has won!";
}

C++でチックタックトーのゲームを作ろうとしているのですが、苦戦しています。以前にも質問されたことがあると思いますが、私の具体的なコード(C++を勉強中です)の何が問題なのか、他の人の例を見てもなかなかわからないのです。以下がそのコードです。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

bool over = false;

void print_board(char board[3][3])
{
    cout<<"\n------------------\n";
    cout<<"\n  "<<board[0][0]<<"  |  "<<board[0][1]<< "  |  "<<board[0][2];
    cout<<"\n------------------\n";
    cout<<"\n  "<<board[1][0]<<"  |  "<<board[1][1]<< "  |  "<<board[1][2];
    cout<<"\n------------------\n";
    cout<<"\n  "<<board[2][0]<<"  |  "<<board[2][1]<< "  |  "<<board[2][2];
    cout<<"\n------------------\n";
}

bool checkForCorrectMove (char board[][3], int choice, bool player1Turn)
{
    int xCor;
    int yCor;
    switch(choice)
    {
        case 1: xCor = 0, yCor = 0;
        case 2: xCor = 0, yCor = 1;
        case 3: xCor = 0, yCor = 2;
        case 4: xCor = 1, yCor = 0;
        case 5: xCor = 1, yCor = 1;
        case 6: xCor = 1, yCor = 2;
        case 7: xCor = 2, yCor = 0;
        case 8: xCor = 2, yCor = 1;
        case 9: xCor = 2, yCor = 2;
    }
    if (((board[xCor][yCor]) != 'X') && ((board[xCor][yCor]) != 'O'))
    {
        if (player1Turn)
            board[xCor][yCor] = 'X';
        if (!player1Turn)
            board[xCor][yCor] = 'O';
        return true;
    }
    else 
        return false;
}

bool checkForWin (char board[][3])
{
    bool win = false;
    if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]))
    {
        win = true;
    }
    else if ((board[2][0] == board[1][1]) && (board[1][1] == board[0][2]))
    {
        win = true;
    }
    for (int i = 0; i<3; i++)
    {
        for (int j = 0; i < 3; j++) 
        {
            if (board[i][j] != board [i][0]);
            win = false;
        }
    }
    for (int i = 0; i<3; i++)
    {
        for (int j = 0; i < 3; j++) 
        {
            if (board[i][j] != board [0][j]);
            win = false;
        }
    }
    return win;
}

int main()
{
    cout << "Welcome to Tic Tac Toe!\n";
    int choice;
    int boardcounter = 1;
    bool isOkayToMove = true;
    bool player1Turn = true;
    char board[3][3];
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            board[i][j] = (char) boardcounter;
            boardcounter++;
        }
    }
    print_board(board);
    do {
        if (player1Turn)
        {
            cout <<"\n\nPlayer 1, please enter a number that corresponds to an open space: ";
        }
        else
        {
            cout <<"\n\nPlayer 2, please enter a number that corresponds to an open space: ";
        }
        cin>>choice;
        switch(choice);
        isOkayToMove = checkForCorrectMove(board, choice, player1Turn);
        if (isOkayToMove)
        {
            print_board(board);
            over = checkForWin(board);
            player1Turn = !player1Turn;
        }
        else
        {
            cout <<"\n\nYou have attempted to move into a space that is already occupied, please try again.";
            print_board(board);
        }
    }
    while (over == false);
    cout <<"\n\nCongratulations!";
    if (player1Turn)
        cout<<" Player 1 has won!";
    else
        cout<<" Player 2 has won!";
}

解決方法は?

私が発見した問題です。

    int boardcounter = 1;
//...
        for (int j = 0; j < 3; j++)
        {
            board[i][j] = (char) boardcounter;
            boardcounter++;
        }

問題は、キャストの (char) は変換されません。 int 変数から テキスト を表現します。 キャストは実際に整数をより小さなサイズの整数型変数に変換します。

数字を文字に変換する方法は、次のようにたくさんあります。 snprintf , tostring および ostringstream .

0〜9の数字という限られた範囲なので、これで済んでしまうかもしれません。

board[row][column] = '0' + boardcounter;

あなたのコードを見直して、整数が変換されている他の場所を見つけることをお勧めします。 char で、適宜変更してください。

ちなみに、ほとんどの三目並べゲームでは、「'」、「X」、「O」を値として使用します。