• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mam buga w grze "tictactoe"(Nie, nie z obiektowego kursu MZ'a tylko własny pomysł)

Object Storage Arubacloud
0 głosów
263 wizyt
pytanie zadane 24 marca 2020 w C i C++ przez RubiN Początkujący (290 p.)

Gdy podaję wartość zmiennej wybor i jest niewłaściwa czyli różna od 1,2,3,4,5,6,7,8,9 (numerów pola)

a następnie podam poprawną wartość to dzieje się tak jak na screenie , gdy zrobię to co wcześniej tylko że poprawną

będzie 1 to już nie ma pola -1 więc się nie wyświetli . Jeśli podam 2 fałszywe wartości i dopiero 1 poprawną wyświetla 3 X'y . pomóżcie bo już nad tym ślęczę godzinę : ( ps: nie zwracajcie uwagi na inne rzeczy bo ten kod i tak jeszcze zrefaktoryzuje . Jestem świeżakiem w programowaniu więc pomóżcie pls.

#include <iostream>
#include <windows.h>

using namespace std;

char pole[9];
char p=' ';
char o='O';
char x='X';
int wybor;

string setcolor(unsigned short color){
    HANDLE hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hcon, color);
    return "";
}




void warunki1()
{
    if( pole[0]==x && pole[1]==x && pole[2]==x)
         {
             cout<<"Wygrana X";Sleep(3000);
             exit(0);

         }
         else if(pole[3]==x && pole[4]==x && pole[5]==x)
         {
               cout<<"Wygrana X";Sleep(3000);
             exit(0);
         }

         else if(pole[6]==x && pole[7]==x && pole[8]==x)
         {
                cout<<"Wygrana X";Sleep(3000);
             exit(0);
         }
         else if(pole[0]==x && pole[4]==x && pole[8]==x)
         {
  cout<<"Wygrana X";Sleep(3000);
             exit(0);
         }

          else if(pole[6]==x && pole[4]==x && pole[2]==x)
         {
  cout<<"Wygrana X";Sleep(3000);
             exit(0);
         }
          else if(pole[0]==x && pole[3]==x && pole[6]==x)
          {
  cout<<"Wygrana X";Sleep(3000);
             exit(0);
          }
          else if(pole[1]==x && pole[4]==x && pole[7]==x)
          {
  cout<<"Wygrana X";Sleep(3000);
             exit(0);
          }
          else if(pole[2]==x && pole[5]==x && pole[8]==x)
          {
                cout<<"Wygrana X";Sleep(3000);
             exit(0);
          }

}

void warunki2()
{
    if( pole[0]==o && pole[1]==o && pole[2]==o)
         {
                      cout<<"Wygrana O";Sleep(3000);
             exit(0);

         }
         else if(pole[3]==o && pole[4]==o && pole[5]==o)
         {
                cout<<"Wygrana O";Sleep(3000);
             exit(0);
         }

         else if(pole[6]==o && pole[7]==o && pole[8]==o)
         {
                cout<<"Wygrana O";Sleep(3000);
             exit(0);
         }
         else if(pole[0]==o && pole[4]==o && pole[8]==o)
         {
                cout<<"Wygrana O";Sleep(3000);
             exit(0);
         }

          else if(pole[6]==o && pole[4]==o && pole[2]==o)
         {
                cout<<"Wygrana O";Sleep(3000);
             exit(0);
         }
          else if(pole[0]==o && pole[3]==o && pole[6]==o)
          {
                cout<<"Wygrana O";Sleep(3000);
             exit(0);
          }
          else if(pole[1]==o && pole[4]==o && pole[7]==o)
          {
                cout<<"Wygrana O";Sleep(3000);
             exit(0);
          }
          else if(pole[2]==o && pole[5]==o && pole[8]==o)
          {
                              cout<<"Wygrana O";
                              Sleep(3000);
             exit(0);
          }

}


void sprawdz1 ()
{
wybor=0;
        cout << "Gracz pierwszy(krzyzyk), podaj nr pola : ";cin>>wybor;

    cout<<endl<<endl;

if(wybor!=1&&wybor!=2&&wybor!=3&&wybor!=4&&wybor!=5&&wybor!=6&&wybor!=7&&wybor!=8&&wybor!=9)
{
    cout<<endl<<endl;
    cout<<"Nieprawidlowa wartosc!";
    cout<<endl<<endl;
    Sleep(2000);
    sprawdz1();
}

wybor=wybor-1;

if(pole[wybor]==x || pole[wybor]==o)
{
    cout<<"To pole jest zajete !";
    Sleep(2000);
    system("cls");
    sprawdz1();

}
pole[wybor]=x;
}


void sprawdz2 ()
{
        cout << "Gracz drugi(Kolko), podaj nr pola : "; cin>>wybor;
        if(wybor!=1&&wybor!=2&&wybor!=3&&wybor!=4&&wybor!=5&&wybor!=6&&wybor!=7&&wybor!=8&&wybor!=9)
{
    cout<<endl<<endl;
    cout<<"Nieprawidlowa wartosc!";
    cout<<endl<<endl;
    Sleep(2000);
    sprawdz2();
}
wybor=wybor-1;
if(pole[wybor]==x || pole[wybor]==o)
{
    cout<<"To pole jest zajete !";
    Sleep(2000);
    system("cls");
    sprawdz2();


}
    pole[wybor]=o;
}

void remis()
{
    if((pole[0]==x||pole[0]==o)&&(pole[1]==x||pole[1]==o)&&(pole[2]==x||pole[2]==o)&&(pole[3]==x||pole[3]==o)&&(pole[4]==x||pole[4]==o)&&(pole[5]==x||pole[5]==o)&&(pole[6]==x||pole[6]==o)&&(pole[7]==x||pole[7]==o)&&(pole[8]==x||pole[8]==o))
    {
        cout<<"Remis";
        Sleep(3000);
        exit(0);
    }
}

int main()
{
    for(int i=0;i<=8;i++)
{
    pole[i]=p;
}

    while(true)
    {



        sprawdz1();

         cout<<"|";if(pole[0]==x){setcolor(12);}else{setcolor(11);}cout<<pole[0];setcolor(15);cout<<"|";if(pole[1]==x){setcolor(12);}else{setcolor(11);}cout<<pole[1];setcolor(15);cout<<"|";if(pole[2]==x){setcolor(12);}else{setcolor(11);}cout<<pole[2];setcolor(15);cout<<"|"<<endl;
         cout<<"|";if(pole[3]==x){setcolor(12);}else{setcolor(11);}cout<<pole[3];setcolor(15);cout<<"|";if(pole[4]==x){setcolor(12);}else{setcolor(11);}cout<<pole[4];setcolor(15);cout<<"|";if(pole[5]==x){setcolor(12);}else{setcolor(11);}cout<<pole[5];setcolor(15);cout<<"|";cout<<endl;
         cout<<"|";if(pole[6]==x){setcolor(12);}else{setcolor(11);}cout<<pole[6];setcolor(15);cout<<"|";if(pole[7]==x){setcolor(12);}else{setcolor(11);}cout<<pole[7];setcolor(15);cout<<"|";if(pole[8]==x){setcolor(12);}else{setcolor(11);}cout<<pole[8];setcolor(15);cout<<"|";cout<<endl;

         warunki1();
         warunki2();

    sprawdz2();
remis();
         cout<<"|";if(pole[0]==x){setcolor(12);}else{setcolor(11);}cout<<pole[0];setcolor(15);cout<<"|";if(pole[1]==x){setcolor(12);}else{setcolor(11);}cout<<pole[1];setcolor(15);cout<<"|";if(pole[2]==x){setcolor(12);}else{setcolor(11);}cout<<pole[2];setcolor(15);cout<<"|"<<endl;
         cout<<"|";if(pole[3]==x){setcolor(12);}else{setcolor(11);}cout<<pole[3];setcolor(15);cout<<"|";if(pole[4]==x){setcolor(12);}else{setcolor(11);}cout<<pole[4];setcolor(15);cout<<"|";if(pole[5]==x){setcolor(12);}else{setcolor(11);}cout<<pole[5];setcolor(15);cout<<"|";cout<<endl;
         cout<<"|";if(pole[6]==x){setcolor(12);}else{setcolor(11);}cout<<pole[6];setcolor(15);cout<<"|";if(pole[7]==x){setcolor(12);}else{setcolor(11);}cout<<pole[7];setcolor(15);cout<<"|";if(pole[8]==x){setcolor(12);}else{setcolor(11);}cout<<pole[8];setcolor(15);cout<<"|";cout<<endl;
           warunki1();
         warunki2();
remis();

}
    return 0;
}

 

 

1 odpowiedź

0 głosów
odpowiedź 24 marca 2020 przez tangarr Mędrzec (154,860 p.)
wybrane 24 marca 2020 przez RubiN
 
Najlepsza

1. Poprawne formatowanie kodu jest naprawdę ważne. Bez tego czytanie kodu jest BAAARDZO utrudnione.
2. Problemem jest rekurencyjne wywołanie funkcji sprawdz1 i sprawdz2. W momencie podania błędnego pola funkcja wykonuje się jeszcze raz, ale aktualna funkcja nie zostaje przerwana. Po skończeniu wewnętrznego wywołania funkcja zewnętrzna kontynuuje. Aby rozwiązać problem wystarczy dodać słowo kluczowe return w odpowiednich miejscach
 

void sprawdz1 ()
{
    wybor=0;
    cout << "Gracz pierwszy(krzyzyk), podaj nr pola : ";cin>>wybor;

    cout<<endl<<endl;

    if(wybor!=1&&wybor!=2&&wybor!=3&&wybor!=4&&wybor!=5&&wybor!=6&&wybor!=7&&wybor!=8&&wybor!=9)
    {
        cout<<endl<<endl;
        cout<<"Nieprawidlowa wartosc!";
        cout<<endl<<endl;
        Sleep(2000);
        sprawdz1();
        return; // ZABEZPIECZENIE PRZED WYKONANIEM DALSZEGO KODU
    }

    wybor=wybor-1;

    if(pole[wybor]==x || pole[wybor]==o)
    {
        cout<<"To pole jest zajete !";
        Sleep(2000);
        system("cls");
        sprawdz1();
        return;  // ZABEZPIECZENIE PRZED WYKONANIEM DALSZEGO KODU
    }
    pole[wybor]=x;
}
komentarz 24 marca 2020 przez RubiN Początkujący (290 p.)
OOO o tym nie wiedziałem że można tak zrobić dzięki :D
komentarz 24 marca 2020 przez tangarr Mędrzec (154,860 p.)
W takich sytuacjach to nawet trzeba. Jak chcesz to ci mogę pokazać jak uniknąć rekurencji w tej sytuacji. (rekurencja to ZUOOOO)

Podobne pytania

0 głosów
1 odpowiedź 240 wizyt
0 głosów
1 odpowiedź 400 wizyt
pytanie zadane 26 lipca 2016 w C i C++ przez Gracjan Pasik Obywatel (1,810 p.)
0 głosów
2 odpowiedzi 129 wizyt

92,565 zapytań

141,416 odpowiedzi

319,597 komentarzy

61,948 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...