TicTacToe - komputer się gubi

0

Hej, no więc postanowiłem zmodyfikować moje TicTacToe, żeby nie było już tylko dla dwóch graczy, ale żeby była też opcja pogrania z komputerem. Założenie było takie, że komputer ma losowo wybierać (nie używałem tu schematów blokowych) pola, ale priorytetem dla niego ma być blokada/dokończenie linii. Problem w tym, że czasem się gubi i użytkownik może wpisać swój znak np. 2 razy pod rząd. Oto kod funkcji:

 
void vsComputer()
{
    char mark;
    int player;
    do
    {
        DrawBoard();
        player=(player%2)?1:2; //THIS LOOP SWITCH PLAYERS
        if(player==1)
        {
            char mark='X';
            int choice;
            cout<<"Your turn. Enter the number: ";
            do {
                    fnClear();
                    cin>>choice;
                    if(choice>9 || cin.fail() || choice<1 || c_Square[choice] == 'O' || c_Square[choice] == 'X') cout<<"Error. Try again: ";
                } while(choice>9 || cin.fail() || choice<1 || c_Square[choice] == 'O' || c_Square[choice] == 'X');

            if (choice == 1 && c_Square[1] == '1') c_Square[1] = mark;
            else if (choice == 2 && c_Square[2] == '2') c_Square[2] = mark;
            else if (choice == 3 && c_Square[3] == '3') c_Square[3] = mark;
            else if (choice == 4 && c_Square[4] == '4') c_Square[4] = mark;
            else if (choice == 5 && c_Square[5] == '5') c_Square[5] = mark;
            else if (choice == 6 && c_Square[6] == '6') c_Square[6] = mark;
            else if (choice == 7 && c_Square[7] == '7') c_Square[7] = mark;
            else if (choice == 8 && c_Square[8] == '8') c_Square[8] = mark;
            else if (choice == 9 && c_Square[9] == '9') c_Square[9] = mark;
        }
        if(player==2)
        {
            char mark='O';
            int choice;

            do {
                choice=Random();
                } while(choice>9 || cin.fail() || choice<1 || c_Square[choice] == 'O' || c_Square[choice] == 'X');

            //BLOCK PLAYER'S STREAK
            if((c_Square[1]=='X' && c_Square[2]=='X') || (c_Square[7]=='X' && c_Square[5]=='X') || (c_Square[6]=='X' && c_Square[9]=='X') && c_Square[3]==3) c_Square[3]=mark;
            else if((c_Square[3]=='X' && c_Square[2]=='X') || (c_Square[7]=='X' && c_Square[4]=='X') || (c_Square[5]=='X' && c_Square[9]=='X') && c_Square[1]==1) c_Square[1]=mark;
            else if((c_Square[1]=='X' && c_Square[3]=='X') || (c_Square[8]=='X' && c_Square[5]=='X') && c_Square[2]==2) c_Square[2]=mark;
            else if((c_Square[3]=='X' && c_Square[9]=='X') || (c_Square[4]=='X' && c_Square[5]=='X') && c_Square[6]==6) c_Square[6]=mark;
            else if((c_Square[8]=='X' && c_Square[2]=='X') || (c_Square[1]=='X' && c_Square[9]=='X') || (c_Square[3]=='X' && c_Square[7]=='X') || (c_Square[4]=='X' && c_Square[6]=='X') && c_Square[5]==5) c_Square[5]=mark;
            else if((c_Square[1]=='X' && c_Square[7]=='X') || (c_Square[5]=='X' && c_Square[6]=='X') && c_Square[4]==4) c_Square[4]=mark;
            else if((c_Square[1]=='X' && c_Square[4]=='X') || (c_Square[5]=='X' && c_Square[3]=='X') || (c_Square[8]=='X' && c_Square[9]=='X') && c_Square[7]==7) c_Square[7]=mark;
            else if((c_Square[5]=='X' && c_Square[2]=='X') || (c_Square[7]=='X' && c_Square[9]=='X') && c_Square[8]==8) c_Square[8]=mark;
            else if((c_Square[7]=='X' && c_Square[8]=='X') || (c_Square[1]=='X' && c_Square[5]=='X') || (c_Square[3]=='X' && c_Square[6]=='X') && c_Square[9]==9) c_Square[9]=mark;

            //COMPLETE COMPUTER'S STREAK
            else if((c_Square[1]=='O' && c_Square[2]=='O') || (c_Square[7]=='O' && c_Square[5]=='O') || (c_Square[6]=='O' && c_Square[9]=='O') && c_Square[3]==3) c_Square[3]=mark;
            else if((c_Square[3]=='O' && c_Square[2]=='O') || (c_Square[7]=='O' && c_Square[4]=='O') || (c_Square[5]=='O' && c_Square[9]=='O') && c_Square[1]==1) c_Square[1]=mark;
            else if((c_Square[1]=='O' && c_Square[3]=='O') || (c_Square[8]=='O' && c_Square[5]=='O') && c_Square[2]==2) c_Square[2]=mark;
            else if((c_Square[3]=='O' && c_Square[9]=='O') || (c_Square[4]=='O' && c_Square[5]=='O') && c_Square[6]==6) c_Square[6]=mark;
            else if((c_Square[8]=='O' && c_Square[2]=='O') || (c_Square[1]=='O' && c_Square[9]=='O') || (c_Square[3]=='O' && c_Square[7]=='O') || (c_Square[4]=='O' && c_Square[6]=='O') && c_Square[5]==5) c_Square[5]=mark;
            else if((c_Square[1]=='O' && c_Square[7]=='O') || (c_Square[5]=='O' && c_Square[6]=='O') && c_Square[4]==4) c_Square[4]=mark;
            else if((c_Square[1]=='O' && c_Square[4]=='O') || (c_Square[5]=='O' && c_Square[3]=='O') || (c_Square[8]=='O' && c_Square[9]=='O') && c_Square[7]==7) c_Square[7]=mark;
            else if((c_Square[5]=='O' && c_Square[2]=='O') || (c_Square[7]=='O' && c_Square[9]=='O') && c_Square[8]==8) c_Square[8]=mark;
            else if((c_Square[7]=='O' && c_Square[8]=='O') || (c_Square[1]=='O' && c_Square[5]=='O') || (c_Square[3]=='O' && c_Square[6]=='O') && c_Square[9]==9) c_Square[9]=mark;

            else if (choice == 1 && c_Square[1] == '1') c_Square[1] = mark;
            else if (choice == 2 && c_Square[2] == '2') c_Square[2] = mark;
            else if (choice == 3 && c_Square[3] == '3') c_Square[3] = mark;
            else if (choice == 4 && c_Square[4] == '4') c_Square[4] = mark;
            else if (choice == 5 && c_Square[5] == '5') c_Square[5] = mark;
            else if (choice == 6 && c_Square[6] == '6') c_Square[6] = mark;
            else if (choice == 7 && c_Square[7] == '7') c_Square[7] = mark;
            else if (choice == 8 && c_Square[8] == '8') c_Square[8] = mark;
            else if (choice == 9 && c_Square[9] == '9') c_Square[9] = mark;
        }
        player++;
    } while(CheckWin()==-1);
    DrawBoard();
    Winner(player);
}

Edit: Wrzucam zdjęcie.
bez tytułu.JPG

3

Ja pergole widziałem!
Próbuję sobie wyobrazić twój kod po przeróbce na plansze 100x100, 5-ka wygrywa i włos mi się jeży jak to sobie wyobrażam.
Zapoznaj się z pojęciem pętli i przepisz to po ludzku.

0

W C++ tablice indeksuje się od 0.

0

Próbuję i nie potrafię wymyślić takiej pętli, która sprawdzałaby, czy dla

c_Square[choice]

są spełnione warunki dokończenia/przerwania linii. Jakieś wskazówki?

0
  1. Sprawdzasz czy c_Square[choice] jest pustę
  2. Sprawdzasz czy istnieje przechodząca przez c_Square[choice] linia zawierająca dwa znaki gracza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1