سؤال

لذلك أحاول برمجة طريقة لإعادة تشغيل لعبة TIC Tac Toe بعد أن يفوز شخص ما أو يفقد أو العلاقات. لذلك في الأساس محاولتي للحصول على إعادة التشغيل للعمل، لا يعمل. إذا فاز اللاعب 1 واكتب 1 للإعادة، فسيطلب ذلك اللاعب 2 لإدخالها.

مخطط pseudocode:

do {
  set entire 2d array to '*'
  do {
    player 1 input
    does game tie?
    does player 1 win
    player 2 input
    does game tie?
    does player 2 win
  } while no one wins
} while replay = 1

رمزي الفعلي:

//tie check, replay, use pointer notation
#include <iostream>
using namespace std;

void initialize(char [][3]);
void player1(char [][3]);
void player2(char [][3]);
void display(char [][3]);
char check(char [3][3]);
int checkWin(int);
int tie(int);
int askReplay();
int main()
{
    char board[3][3];
    char end = '*';
    int row1, column1, row2,column2;
    int replay = 0;
    int turns = 0;
    //replay loop
    do {
        //set board to *
        initialize(board);
        display(board);
        do {
            //player 1 turn
            player1(board);
            turns++;
            display(board);

            //if turns = 9 then tie
            replay = tie(turns);
            //check if player 1 won
            end = check(board);
            replay = checkWin(end);

            //player 2 turn
            player2(board);
            turns++;
            display(board);

            //if turns = 9 then tie
            replay = tie(turns);
            //check if player 2 won
            end = check(board);
            replay = checkWin(end);

        } while (end == '*');
    } while (replay == 1);
    return 0;
}

void initialize(char (*array)[3])
{
    for (int i = 0;i < 3;i++)
        for (int j = 0;j < 3;j++)
            array[i][j] = '*';
    cout << "New Game\n";
}

void player1(char (*array)[3])
{
    int row1, column1;
    cout << "Player 1\nRow: ";
    cin >> row1;
    while (row1 < 0 || row1 > 2) {
        cout << "Enter a number between 0 and 2 for Row:: ";
        cin >> row1;
    }

    cout << "Column: ";
    cin >> column1;
    while (column1 < 0 || column1 > 2) {
        cout << "Enter a number between 0 and 2 for Column: ";
        cin >> column1;
    }

    if (array[row1][column1] == '*')
        array[row1][column1] = 'X';
    else {
        cout << "Space Occupied\n";
        player1(array);
    }
}

void player2(char (*array)[3])
{
    int row2,column2;
    cout << "Player 2\nRow: ";
    cin >> row2;
    while (row2 < 0 || row2 > 2) {
        cout << "Enter a number between 0 and 2 for Row: ";
        cin >> row2;
    }

    cout << "Column: ";
    cin >> column2;
    while (column2 < 0 || column2 > 2) {
        cout << "Enter a number between 0 and 2 for Column: ";
        cin >> column2;
    }

    if (array[row2][column2] == '*')
        array[row2][column2] = 'O';
    else {
        cout << "Space Occupied\n";
        player2(array);
    }
}

void display(char (*array)[3])
{
    for (int x = 0;x < 3;x++) {
        for (int y = 0;y < 3;y++)
            cout << *(*(array + x) + y) << " ";
        cout << endl;
    }
}

char check(char (*array)[3])
{
    int i;

    /* check rows */
    for(i = 0; i < 3; i++)
    if(array[i][0] == array[i][1] && array[i][0] == array[i][2])
        return array[i][0];

    /* check columns */
    for(i = 0; i < 3; i++)
        if(array[0][i] == array[1][i] && array[0][i] == array[2][i])
            return array[0][i];

    /* test diagonals */
    if(array[0][0] == array[1][1] && array[1][1] == array[2][2])
        return array[0][0];

    if(array[0][2] == array[1][1] && array[1][1] == array[2][0])
        return array[0][2];
    return '*';
}

int checkWin(int over)
{
    if (over == '*')
        return 0;
    if (over == 'X')
        cout << "Player 1 Won!\n";
    else if (over == 'O')
        cout << "Player 2 Won!\n";

    //ask if they want to play again
    int answer;
    answer = askReplay();

    switch (answer) {
    case 1:
        return 1;
    case 2:
        cout << "Thank you for playing.\n";
        exit(0);
    }
}

int tie(int count)
{
    if (count == 9) {
        int answer;
        cout << "Tie game";

        answer = askReplay();

        switch (answer) {
        case 1:
            return 1;
        case 2:
            cout << "Thank you for playing.\n";
            exit(0);
        }
    }
}

int askReplay()
{
    int input;
    do {
        cout << "Play Again?\n1.Yes\n2.No\nEnter 1 or 2: ";
        cin >> input;
        if (input > 2 || input < 1)
            cout << "Invalid Option\n";
    } while(input > 2 || input < 1);

    return input;
}
هل كانت مفيدة؟

المحلول

يبدو أنك تواجه مشكلات مع حلقة رئيسية.

أقترح على إجراء متغير يتحكم في تشغيل اللاعب الذي يقوم بتبديل ذلك.

do  
{    
  set entire 2d array to '*'  
  current player = 0
  do  
  {  
    (current player + 1) input  
    does game tie?  
    does (current player + 1) win

    current player = (current player + 1) % 2  
  }while no one wins     
}while replay = 1

معرفة ما إذا كان ذلك يجعلك أكثر من ذلك.

نصائح أخرى

قد ترغب في البحث عن نمط تصميم تذكار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top