0

既に持っているものからどのように進めればよいかわかりません。配列を機能させるのに問題があり、プログラムを再実行するたびにチャートがリセットされるのにも問題があります。X と O は保存されませんが、空白のチャートに戻ります。どんなヒントでも役に立ちます。ありがとう

/**
Lab 4 - Due 7/22/2010.

Convert Lab 3 to a class

1. Implement displayBoard to display Tic Tac Toe board.
2. Prompt User for a box on the board to select, i.e. a number between 1 and 9 with 1 being the upper left corner.

use cin.get(box) to get the box number and isdigit to verify it is a
number;
1 | 2 | 3
4 | 5 | 6
7 | 8 | 9
If the box is available put the appropriate X or O in there and switch players, i.e. X becomes O and vice versa.
If the box is NOT available warn the user and get another box until they select a valid open box.

3. After all spots have been select Display "Game Over!";
4. Write a main function to use the TicTacToe class and test all of the above functionality.

**/


#include <iostream>

#include <limits>

using namespace std;


class TicTacToe {
public:
    void displayBoard();
    void getMove();
    void playGame();
private:
    char board[9];
    char player; // Switch after each move.
};

int main ()
{
    TicTacToe ttt;

    for (int i = 0; i < 9; i++) {
        ttt.playGame();
    }
}

void TicTacToe::playGame()
{
    displayBoard();


    getMove();    

    // Your implementation here...
}

void TicTacToe::displayBoard()
{
    // Your implementation here...

    bool firstMove = true;
    if (firstMove  == true)
    {

        for (int i = 0; i < 9; i++) {
            board[i] = i + 1;
        }

    }

    firstMove == false;
    for (int i = 0; i < 9; i++) 
    {
        if ( (i+1) % 3 == 0 )
        {
            cout << board[i] << endl;
        }
        else 
        {

            cout << board[i] << " | ";
        }
    }
}

void TicTacToe::getMove()
{
    if (player == 'X') { 
        player = 'O';
    }
    else {
        player = 'X';
    }

    cout << player << " ";
    cout << "Enter Box: ";
    char c;


    bool move;
    move = true;

    do {
        cin.get(c);
        cin.ignore(numeric_limits<int>::max(), '\n');
        if (c > '9' || c < '0')
            // error message
            cout << "please enter a number 1-9" << endl;

        int number = c - '0';

        cout << "your number is " << number << endl;
        // Your implementation here...

        if (c == '1' && board[0] == '1') {
            board[0] = player;

            move = false;
        }
        else if(c == '2' && board[1] == '2')
        {
            board[1] = player;
            move = false;
        }
        else if(c == '3' && board[2] == '3')
        {
            board[2] = player;
            move = false;
        }
        else if(c == '4' && board[3] == '4')
        {
            board[3] = player;
            move = false;
        }
        else if(c == '5' && board[4] == '5')
        {
            board[4] = player;
            move = false;
        }
        else if(c == '6' && board[5] == '6')
        {
            board[5] = player;
            move = false;
        }
        else if(c == '7' && board[6] == '7')
        {
            board[6] = player;
            move = false;
        }
        else if(c == '8' && board[7] == '8')
        {
            board[7] = player;
            move = false;
        }
        else if(c == '9' && board[8] == '9')
        {
            board[8] = player;
            move = false;
        }

    } while (!move);     
}

@Bunnitあなたのアドバイスから、私はそれを変えることができました。今、私の唯一の問題は、各ボックスを X または O に置き換えることです。

4

3 に答える 3

2

DisplayBoard 機能を使用してボードを表示していますか?

    bool firstMove = true;
    if (firstMove  == true)
    {

        for (int i = 0; i < 9; i++) {
            board[i] = i + 1;
        }

    }

ここで何を達成しようとしているのか正確にはわかりませんが、 firstMove は常に true になるため、これが呼び出されるたびにボードがリセットされます。

firstMove == false;

この行は効果がありません。firstMove を false にfirstMove = false;設定しても、関数が呼び出されるたびに firstMove が true に設定されているため、上記の if ステートメントは引き続き呼び出されます。静的変数を使用できます: static firstMove == true;.

編集

また、char と int を混同しているようにも見えます。DisplayBoard では、各ボード タイルを対応する番号 (上記の for ステートメント) と等しくなるように設定しますが、getMove 関数でこれをチェックすると、同等の文字を使用しますif (c == '1' && board[0] == '1')。1!='1'. 宿題なので、ASCII チャートを調べて、それが何に等しいかを調べるのはあなたに任せます。

于 2011-07-29T05:42:59.823 に答える
0

プログラムが終了すると、そのメモリはすべてオペレーティング システムによって解放され、他のプログラムが使用できるようになります。プログラムが終了すると、変数と配列のすべての値が失われます。

次回プログラムが実行されるまで永続的な状態を維持したい場合は、変数/配列をファイルやデータベースなどの記憶媒体に保存する必要があります。プログラムが後で開始されると、それらの変数/配列を記憶媒体からロードし直します。

ファイルの読み取り/書き込み方法をまだ教えていない場合、プログラムが起動するたびにゲームボードが以前の状態に復元されることを彼らが期待しているとは思えません。

于 2011-07-29T05:48:15.807 に答える
0

ボードに数字を入力してから X と O で上書きするのではなく、整数形式で入力する必要があります。それは上書きの問題に役立つかもしれません。また、あなたが 2D 配列をカバーしているかどうかはわかりませんが、2D 配列を使用すると、プログラミングと論理的思考プロセスがもう少し役立つでしょう。

于 2011-07-29T18:31:24.010 に答える