[BCB6] Gra kółko i krzyżyk z GUI - problem

0

Witam!

Piszę na zaliczenie grę kółko i krzyżyk. Korzystam z przycisków speed button tworzonych dynamicznie (przechowuję je w tabeli 3x3 - taki sam wymiar ma tabela intów na której sprawdzam kto wygrał) Calość jest podzielona na dwie części :

  • plik lib_kolkoikrzyzyk.cpp - zawiera dwie klasy (CGra (metody ModyfikujPlansze() i SprawdzWygrana()) i CGracz(zbiornik dla statystyk ile wygranyh,przegranych, remisow + metoda AlgorytmSI())
  • plik KolkoKrzyzyk.cpp - tu "oprogramowuję" GUI, tworzę obiekty z lib_kolkokrzyzyk i przez buttony hę na nich operować.

Całość jest napisana w Borland C++ Builder 6, link do paczki z plikami: <url>http://wyslijto.pl/plik/igfacz39cs </url>

Problem w tym, że gdy wybiorę już tryb gry i użyję któregokolwiek z buttonów tworzonych dynamicznie wyskakuje Access Violation i nie wiem pojecia co zmienić, żeby było dobrze.

Poniżej zamieszczam kod do metody OnClick dla dynamicznych SpeedButtonów (bo wydaje mi się, że to na nim się wysypuje):

//funkcja aktualizuje obiekt planszy zawierajacej tablice int'ow w zaleznosci od wcisnieych buttonow 
void AktualizujPlansze(){ 
        for(int i=0;i<3;i++) 
                for(int j=0;j<3;j++){ 
                        if(PolaGry[i][j]->Tag==1){ 
                                gra.ModyfikujPlansze(i,j,1); 
                                PolaGry[i][j]->Down=true; 
                } 
                if(PolaGry[i][j]->Tag==5){ 
                        gra.ModyfikujPlansze(i,j,2); 
                        PolaGry[i][j]->Down=true; 
                } 
        } 
} 

//Wyswietlnie obrazkow na SpeedButtonac w zaleznosci od wartosci tablicy intow 
void WyswietlPola(){ 
        for(int i=0;i<3;i++) 
                for(int j=0;j<3;j++){ 
                        if (gra.nPlanszaGry[i][j]==1) PolaGry[i][j]->Glyph->LoadFromFile("kolko.bmp"); 
                        if (gra.nPlanszaGry[i][j]==5) PolaGry[i][j]->Glyph->LoadFromFile("krzyzyk.bmp"); 
                } 
} 


//funkcja podpieta pod OnClick dla buttonów dynamicznych 
void __fastcall Pomocnicza::WykonajRuch(TObject* Sender){ 
        bool bRuch; 

        //sprawdzamy nr gracza 
        if(nrGracza==1){ 
                //sprawdzamy czy ma grac komputer, jesli nie przechodzi dalej 
                if(gracz1.SprawdzCzySI()==true){ 
                        //sprawdzamy czy mozna wygrac, jesli tak - wykonuje ruch 
                        bRuch=gracz1.AlgorytmSI(gra,1,1); 
                        //sprawdamy czy mozna przegrac, jeli tak - wykonuje ruch blokujacy 
                        if(bRuch==0) bRuch=gracz1.AlgorytmSI(gra,1,2); 
                        //Jesli nie wykonano ruchu, to wstawiamy w losowym wolnym polu 
                        if(bRuch==0){ 
                                int i,j; 
                                while(bRuch==0){ 
                                        i=rand()%3; 
                                        j=rand()%3; 
                                        if(gra.PobierzIJ(i,j)==0){ 
                                                gra.ModyfikujPlansze(i,j,1); 
                                                bRuch=1; 
                                        } 
                                } 
                        } 
                        //Wyswietlenie ruchu 
                        WyswietlPola(); 
                }else{ 
                        //wyswietlamy obrazek po kliknieciu + aktualizacja tablicy intow 
                        ((TSpeedButton*)Sender)->Glyph->LoadFromFile("kolko.bmp"); 
                        ((TSpeedButton*)Sender)->Tag=1; 
                        AktualizujPlansze(); 

                } 
                nrGracza=2; // zmieniamy nr gracza na nastepny 
        }else{ 
                if(gracz2.SprawdzCzySI()==true){ 
                        bRuch=gracz2.AlgorytmSI(gra,2,1); 
                        if(bRuch==0) bRuch=gracz1.AlgorytmSI(gra,2,2); 
                        if(bRuch==0){ 
                                int i,j; 
                                while(bRuch==0){ 
                                        i=rand()%3; 
                                        j=rand()%3; 
                                        if(gra.PobierzIJ(i,j)==0){ 
                                                gra.ModyfikujPlansze(i,j,2); 
                                                bRuch=1; 
                                        } 
                                } 
                        } 
                        WyswietlPola(); 
                }else{ 
                        ((TSpeedButton*)Sender)->Glyph->LoadFromFile("krzyzyk.bmp"); 
                        ((TSpeedButton*)Sender)->Tag=5; 
                        AktualizujPlansze(); 
                } 
                nrGracza=1; 
        } 

 //sprawdzamy czy ktorys z gacy wygral lub czy gra zakoncona remisem        
       switch(gra.SprawdzWygrana()){ 
                case 1: ShowMessage("Wygral "+Plansza->Gracz1->Caption); 
                        gracz1.UstawWygrane((gracz1.PobierzWygrane()+1)); 
                        gracz2.UstawPrzegrane((gracz2.PobierzPrzegrane()+1)); 
                        Plansza->Gracz1LiczbaW->Caption=(String)gracz1.PobierzWygrane(); 
                        Plansza->Gracz2LiczbaP->Caption=(String)gracz2.PobierzPrzegrane(); 
                        bGraWToku=0; 
                        Plansza->StartGry->Visible=true; 
                        break; 
                case 2: ShowMessage("Wygral "+Plansza->Gracz2->Caption); 
                        gracz2.UstawWygrane((gracz2.PobierzWygrane()+1)); 
                        gracz1.UstawPrzegrane((gracz1.PobierzPrzegrane()+1)); 
                        Plansza->Gracz2LiczbaW->Caption=(String)gracz2.PobierzWygrane(); 
                        Plansza->Gracz1LiczbaP->Caption=(String)gracz1.PobierzPrzegrane(); 
                        bGraWToku=0; 
                        Plansza->StartGry->Visible=true; 
                        break; 
                case 0: ShowMessage("Remis!"); 
                        gracz1.UstawRemisy((gracz1.PobierzRemisy()+1)); 
                        gracz2.UstawRemisy((gracz2.PobierzRemisy()+1)); 
                        Plansza->Gracz1LiczbaR->Caption=(String)gracz1.PobierzRemisy(); 
                        Plansza->Gracz2LiczbaR->Caption=(String)gracz2.PobierzRemisy(); 
                        bGraWToku=0; 
                        Plansza->StartGry->Visible=true; 
                        break; 
        } 
}

Z góry dzięki za pomoc.

0

sprawdzales czemu ten AV leci? czy w momencie kiedy on leci wszystko co dynamiczne zdazylo sie juz po-utwarzac?

0

znam ten kod on sie zwiesza na "gra.SprawdzWygrana()" a blad pewnie przez to ze tablice masz za mala zamiast pola[3][3] masz pewnie pola[2][2]

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