Kółko i krzyżyk algorytm sprawdzający

0

Witam,
Od pewnego czasu pracuję nad grą kółko i krzyżyk. Teraz natrafiłem na problem z algorytmem sprawdzającym czy nastąpiła wygrana któregoś z graczy. Algorytm aktualnie ma za zadanie sprawdzanie skrajnej lewej kolumny planszy. Prosiłbym o przejrzenie kodu i podsunięcie jakichś wskazówek.

 #include <iostream>

	using namespace std;
	char tab_temp[3][3] ={'0'};
	bool odw[3][3] = {false};
	int licz=0;
	
void sprawdzenie(int x, int y)
{
	
	odw[x][y]=true;
	licz++;
	if (odw[x+1][y]==false && tab_temp[x+1][y]==tab_temp[x][y] && x+1<3 && x+1>0 ){
	sprawdzenie(x+1, y);
	}
}
		
	
	
int main()
{
	char plansza[9]={'1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9'};
	
	bool kol=true;
	for ( ; ; )
	{
		int a;
		for (int i=0; i<9; i++)
		{
			cout<<plansza[i];
			if ( (i+1)%3==0) cout << endl;
		}
		cout<<"ruch gracza ";
		if (kol==true) cout<<"kolko ";
		else cout<<"krzyzyk ";
		cout<<"wpisz numer pola: ";
		for ( ; ; )
		{
			cin>>a;
			if (a<0 || a>9){
				cout<<"nie ma takiego pola spróbuj jeszcze raz"<<endl;
				continue;
			}
			if (plansza[a-1] == 'O' || plansza[a-1] =='X')
			{
				cout<<"pole zajete wybierz inne ";
				continue;
			}
			else{
				if (kol == true) plansza[a-1]= 'O';
				else plansza[a-1] = 'X';
				break;
			}
		}
		for (int i=0; i<3; i++)              //trzy pętle przypisujące wartosci z planszy do tab_temp
		{
				tab_temp[0][i]=plansza[i];
		}	
		for (int i=0; i<3; i++)
		{
				tab_temp[1][i]=plansza[i+3];
		}	
		for (int i=0; i<3; i++)
		{
				tab_temp[2][i]=plansza[i+6];
		}
		sprawdzenie(0, 0);
		if (licz == 3) cout<<"WYGRANA";
		licz =0;
		
		if (kol==false) kol = true;
		else kol = false;

	}
	return 0;
	getchar();
}
0
  1. używasz tab_temp, plansza i odw, skróć to do samej planszy
  2. char plansza[3][3]={{'1' , '2' , '3'},{'4' , '5' , '6'},{'7' , '8' , '9'}}; for(int i=0;i<9;++i) cout<<plansza[i]; <- zadziała
  3. sprawdzaj tylko jeden pion i jeden poziom te w których był ostatni ruch, zaś w przypadku jeżeli x==y jeszcze główną przekątną, zaś w przypadku jeżeli x+y==3 dodatkową przekątną.
0

Witam ponownie,
Dzięki za rady, wywaliłem odw, zostawiłem tab_temp i plansza ponieważ przekształcenie sprawiało mi truchę trudności. Posiedziałem trochę dzisiaj i zrobiłem algorytm sprawdzający poziom. Niestety gdy ktoś wygrywa program wywala błąd.

#include <iostream>
 
        using namespace std;
        char tab_temp[3][3] ={'0'};
        int temp=0;
void poziom (int x, int y)
{	
	temp++;
	if(y==1 && tab_temp[x][y-1]==tab_temp[x][y] && tab_temp[x][y+1]==tab_temp[x][y]) temp=3;
	if(tab_temp[x][y]==tab_temp[x][y+1] && y+1<9 && y+1>0) poziom(x, y+1);
	if(tab_temp[x][y]==tab_temp[x][y-1] && y-1<9 && y-1>0) poziom(x, y-1);
} 
void sprawdzenie(int x, int y)
{
		
		poziom(x, y);
}

 
 
 
int main()
{
        char plansza[9]={'1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9'};
 
        bool kol=true;
        for ( ; ; )
        {
                int a, x ,y;
                for (int i=0; i<9; i++)
                {
                        cout<<plansza[i];
                        if ( (i+1)%3==0) cout << endl;
                }
                cout<<"ruch gracza ";
                if (kol==true) cout<<"kolko ";
                else cout<<"krzyzyk ";
                cout<<"wpisz numer pola: ";
                for ( ; ; )
                {
                        cin>>a;
                        if (a<0 || a>9){
                                cout<<"nie ma takiego pola spróbuj jeszcze raz"<<endl;
                                continue;
                        }
                        if (plansza[a-1] == 'O' || plansza[a-1] =='X')
                        {
                                cout<<"pole zajete wybierz inne ";
                                continue;
                        }
                        else{
                                if (kol == true) plansza[a-1]= 'O';
                                else plansza[a-1] = 'X';
                                break;
                        }
                }
                for (int i=0; i<3; i++)              //trzy pętle przypisujące wartosci z planszy do tab_temp
                {
                                tab_temp[0][i]=plansza[i];
                }        
                for (int i=0; i<3; i++)
                {
                                tab_temp[1][i]=plansza[i+3];
                }        
                for (int i=0; i<3; i++)
                {
                                tab_temp[2][i]=plansza[i+6];
                }
                if (a<=3) {
					x=0;
					y=a-1;
				}
				if (a>3 && a<=6) {
					x=1;
					y=a-1-3;
				}
				if (a>6) {
					x=2;
					y=a-1-6;
				}
                sprawdzenie(x, y);
                if (temp==3) break;
                temp=0;
 
                if (kol==false) kol = true;
                else kol = false;
 
        }
        return 0;
        getchar();
}
 
 
0

wyświetla się "program przestał działać"

0
#include <iostream>
using namespace std;

int main()
  {
   while(true)
     {
      char tb[][3]={{'1','2','3'},{'4','5','6'},{'7','8','9'}};
      struct { const char *name,sign; } Player[]={{"krzyzyk",'X'},{"kolko",'O'}};
      unsigned turn=0;
      while(turn<9)
        {
         for(unsigned y=0;y<3;++y,cout<<endl) for(unsigned x=0;x<3;++x) cout<<tb[y][x]<<' ';
         cout<<"Ruch gracza "<<Player[turn&1].name<<": ";
         unsigned r;
         if((cin>>r)&&(1<=r)&&(r<=9))
           {
            unsigned P=r-1,Y=P/3,X=P-Y*3;
            if(tb[Y][X]=='0'+r)
              {
               char sign=Player[turn&1].sign;
               tb[Y][X]=sign;
               unsigned V=0,H=0,D=0,B=0;
               for(unsigned i=0;i<3;++i)
                 {
                  if(tb[Y][i]==sign) ++H;
                  if(tb[i][X]==sign) ++V;
                  if(tb[i][i]==sign) ++D;
                  if(tb[i][2-i]==sign) ++B;
                 }
               if((V==3)||(H==3)||(D==3)||(B==3))
                 {
                  for(unsigned y=0;y<3;++y,cout<<endl) for(unsigned x=0;x<3;++x) cout<<tb[y][x]<<' ';
                  cout<<endl<<"WYGRYWA "<<Player[turn&1].name<<endl;
                  while(cin.get()!='\n') {}
                  break;
                 }
               ++turn;
              }
            else cout<<"pozycja zajeta"<<endl;
           }
         else
           {
            cin.clear();
            cout<<"podaj liczbe 1..9"<<endl;
           }
         while(cin.get()!='\n') {}
         cout<<endl;
        }
      if(turn>=9) cout<<endl<<"REMIS"<<endl;
      cout<<"Nacisnij enter ";
      while(cin.get()!='\n') {}
      cout<<"NOWA GRA"<<endl<<endl<<endl;
     }
   return 0;
  }

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