Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Gra przestaje działać - prośba o sprawdzenie kodu

Ostatnio zmodyfikowano 2012-03-04 14:42
Autor Wiadomość
Degezor
Temat założony przez niniejszego użytkownika
Gra przestaje działać - prośba o sprawdzenie kodu
» 2012-03-04 12:52:29
Witam!
Piszę grę, jednak napotkałem pewien problem.

Tu jest kod całej gry:
http://wklej.se

Gra polega na tym, że mamy swoją postać i możemy kupować różne przedmioty, trenować, robić zadania i walczyć.

Po uruchomieniu gry, przejściu do miasta(kliknięcie przycisku 'w'), oraz wejściu na arenę(kliknięciu przycisku '2'),
znajdujemy się na arenie i mamy 3 przeciwników do wybrania.
Kiedy nie chcemy walczyć i chcemy przejść z powrotem do postaci(kliknięcie przycisku 'q'), program przestaje działać.
Tak samo się dzieje kiedy stoczymy walkę i będziemy chcieli z powrotem wrócić do postaci.

Szukałem dosyć długo w kodzie i nie wiem co się dzieje. Program prawdopodobnie przestaje działać, kiedy wykonuje się 1069. linijka kodu - wtedy to funkcja Arena() zwraca wartość zmiennej wybor dla funkcji Miasto().

Czy mógłby ktoś sprawdzić mój kod?

Tu dorzucam jeszcze plik .exe wraz z kodem źródłowym:
https://rapidshare.com/files/3533651927/Projekt.rar

PS. Gra nie jest dokończona i ma trochę błędów. Jednak jeżeli macie jakieś pomysły na rozwój gry, pisać śmiało!
P-51922
pekfos
» 2012-03-04 12:53:06
Wstaw nazwę tematu..

//Zlokalizuj błąd debuggerem.
P-51923
Degezor
Temat założony przez niniejszego użytkownika
» 2012-03-04 12:54:49
A możesz mi polecić jakiś debugger? Myślałem o Visual C++, ale nie wiem czy jest dobry.
P-51925
m4tx
» 2012-03-04 13:09:18
IDE w którym piszesz tę grę powinno posiadać debugger...
P-51935
Dragonit
» 2012-03-04 13:12:03
Mi to tam od razu się gra zatnie jak włączę grę i nacisnę [E] lub [R] lub [T].

A powiedz mi co ty zwracasz za pomocą tej funkcji "char Miasto()" i "char Postac()" ?
P-51936
Degezor
Temat założony przez niniejszego użytkownika
» 2012-03-04 13:17:15
@Dragonit

Tak wygląda główna pętla gry:

C/C++
char wybor = 'q';
//główna pętla programu
while( 1 )
{
    switch( wybor )
    {
    case 'q':
        wybor = Postac();
        break;
       
    case 'w':
        wybor = Miasto();
        break;
       
    case 'e':
        wybor = Wyprawa();
        break;
       
    case 'r':
        wybor = Poczta();
        break;
       
    case 't':
        wybor = Menu();
        break;
       
    case 0:
        //jeżeli któraś z funkcji zwróci 0, to program się wyłączy
        return 0;
       
    default:
        wybor = getch();
    }
}

Jeżeli wejdę teraz w funkcję Miasto(), to jak z tej funkcji będę chciał przejść od razu do np. Postac() to funkcja Miasto zwraca teraz mój wybór, czyli np. 'q', A pętla przenosi mnie do funkcji Postac().
Tak samo działa funkcja Postac() i inne. Mam nadzieję, że wytłumaczyłem.

A jak klikasz [e],[r] lub [t] to program się zacina bo te funkcje jeszcze nie są skończone. Narazie mi chodzi o rozwiązanie problemu z funkcją Arena().
P-51938
Dragonit
» 2012-03-04 14:13:38
Coś z tym jest schrzanione, zaraz zobaczę dogłębniej. Trop jest :)

C/C++
CPostac Przeciwnik[ 3 ]; //tablica obiektów przechowująca przeciwników gracza

EDIT: Już wiem :) Destruktor klasy CPostac()

C/C++
//kiedy obiekt bedzie niszczony, to zwolnij cala zajeta pamiec
~CPostac() { if( bron != NULL ) delete bron; if( tarcza != NULL ) delete tarcza;
    if( glowa != NULL ) delete glowa; if( tulow != NULL ) delete tulow;
    if( nogi != NULL ) delete nogi; if( rece != NULL ) delete rece;
    if( naszyjnik != NULL ) delete naszyjnik; if( pierscien != NULL ) delete pierscien; }
P-51948
Degezor
Temat założony przez niniejszego użytkownika
» 2012-03-04 14:42:19
@Dragonit

Dzięki za zaangażowanie, ale dalej nie wiem co w tym kodzie jest złego :/

//Faktycznie, po zakomentowaniu tego destruktora program działa jak należy.
Ale przecież powinno się zwalniać pamięć. Czy ktoś wie jak to rozwiązać? Może zwalnianie ma następować w innym miejscu?

//Problem rozwiązany. Dzięki Ci Dragonit, bo nie spodziewałem się, że problemem jest destruktor.
Zmieniłem trochę klasę postaci, a gra już się nie zawiesza :D

C/C++
class CPostac
{
public:
   
    string nazwa;
    int poziom;
    double zycie;
    double maxZycie;
    int doswiadczenie;
    int zloto;
   
    int sila; //Zwieksza obrazenia
    int szybkosc; //Wieksza szansa na podwojne trafienie
    int kondycja; //Wieksza szansa na unikniecie ciosu
    int zrecznosc; //Wieksza szansa na trafienie
    int wytrzymalosc; //jajco
   
    int pancerz; //Wiecej ciosow przeciwnika wytrzymasz
    int MinObrazenia; //Najmniejsze obrazenia zadawane przeciwnikowi
    int MaxObrazenia; //Najwieksze obrazenia zadawane przeciwnikowi
   
    CPrzedmiot * bron;
    CPrzedmiot * tarcza;
    CPrzedmiot * glowa;
    CPrzedmiot * tulow;
    CPrzedmiot * nogi;
    CPrzedmiot * rece;
    CPrzedmiot * naszyjnik;
    CPrzedmiot * pierscien;
   
    CPostac() { nazwa = "Nienazwany";
        poziom = 1;
        zycie = 80;
        maxZycie = 80;
        doswiadczenie = 0;
        zloto = 100;
        sila = 5;
        szybkosc = 5;
        kondycja = 5;
        zrecznosc = 5;
        wytrzymalosc = 5;
        bron = 0;
        tarcza = 0;
        glowa = 0;
        tulow = 0;
        nogi = 0;
        rece = 0;
        naszyjnik = 0;
        pierscien = 0; }
   
    //kiedy obiekt bedzie niszczony, to zwolnij cala zajeta pamiec
    ~CPostac() { delete bron;
        delete tarcza;
        delete glowa;
        delete tulow;
        delete nogi;
        delete rece;
        delete naszyjnik;
        delete pierscien; }
};
P-51953
« 1 »
  Strona 1 z 1