문제

그래서 누군가가 승리, 패배 또는 넥타이를 마친 후에 Tic Tac Toe 게임을 재생하는 방법을 프로그래밍하려고합니다. 따라서 기본적으로 재생을위한 나의 시도는 작동하지 않습니다. 플레이어 1이 승리하고 1 타입 1이되면 플레이어 2에게 입력을 요청합니다.

의사 코드 개요 :

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

그것이 당신을 더 나아가게하는지보십시오.

다른 팁

Memento Design 패턴을 찾아 볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top