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.