Ĺadny brzuch
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: http://wyslijto.pl/plik/igfacz39cs
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; } }
Prozę o pomoc, to pilne ,a mi się skończły pomysły... Z góry dzieki.
Oczywiście zapomniałem, że żeby zadeklarować tablicę 3x3
powininenem kodować np int [tablica[3][3]. Jszcze jest parę innych blędów w petlach sprawdzajacych wygraną (chyba), ale to jutro o tego siądę. Jeśli ktoś widzi inne błędy to można pisać.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
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: http://wyslijto.pl/plik/igfacz39cs
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; } }
Prozę o pomoc, to pilne ,a mi się skończły pomysły... Z góry dzieki.
Oczywiście zapomniałem, że żeby zadeklarować tablicę 3x3
powininenem kodować np int [tablica[3][3]. Jszcze jest parę innych blędów w petlach sprawdzajacych wygraną (chyba), ale to jutro o tego siądę. Jeśli ktoś widzi inne błędy to można pisać.