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

cos sie zapetlilo

Ostatnio zmodyfikowano 2010-01-22 10:19
Autor Wiadomość
dmx81
Temat założony przez niniejszego użytkownika
cos sie zapetlilo
» 2010-01-17 23:12:14
C/C++
while( !over )
{
    lvl1start = true;
    if( lvl1start == true && zycie > 0 )
         lvl1( zycie, bufor );
   
    // funkcja wykonuje sie az do while(!koniec), gdzie koniec=true jesli zycia<=0 lub lvl_ok lub ESC//
   
    if( zycie > 0 ) //czyli lvl_ok i czy sa zycia>0, bo inaczej sie nie powinno wykonac
    {
        lvl1start = false;
        lvl2start = true;
    }
    if( lvl2start == true && zycie > 0 )
         lvl2( zycie, bufor );
   
    // funkcja wykonuje sie az do while(!koniec), gdzie koniec=true jesli zycia<=0 lub lvl_ok lub ESC//
   
   
    if( zycie <= 0 ) // to sie powinno wykonac przy 0 zyc
    {
        textprintf_ex( bufor, font, 340, 150, makecol( 255, 5, 3 ), 0, "KONIEC GRY!!!" );
        textprintf_ex( bufor, font, 450, 250, makecol( 4, 255, 21 ), 0, "WCISNIJ ESC" );
        over = true;
        readkey();
    }
}


mam problem taki, ze po utracie zyc, plansza przeskakuje na druga, zamiast skonczyc wykonywac petle, nastepnie pozniej w lvl2 po utracie zyc, powraca do lvl1, zawsze z pelna iloscia zyc

lvl1 i lvl2 pobieraja zmienna zycie spod main()
przy warunku wyjscia z lvl (czyli 0 zyc lub ukonczenie lvl)
zwracana jest wartosc return zycie

przy kolizji sie odejmuja (co widac  textprintf_ex(bufor, font, 340,15,   makecol(255, 5, 3),-1, "ZYCIA:: %d", zycie);
P-13118
malan
» 2010-01-17 23:19:23
Z tego co tu widać to powinno działać. Jeśli możesz to pokaż więcej kodu - funkcję lvl1.

//edit:
Po uważnym przeczytaniu Twojego posta chyba wiem gdzie masz błąd.

Deklaracja lvl1 wygląda pewnie tak:
int lvl1( int ilosc_zyc, BITMAP * bufor );
Ciało tej funkcji:
C/C++
int lvl1( int ilosc_zyc, BITMAP * bufor )
{
    //.. wykrywanie kolizji itp.
    return ilosc_zyc;
};
Patrząc teraz na Twój kod to by wszystko wyjaśniało.
Przesyłając w ten sposób ilość_żyć funkcja pracuje na duplikacie, więc jeśli np. przed wejściem do lvl1 zycie = 3 i w trakcie gry user straciłby życie (czyli od ilosc_zyc odejmujemy 1) to nadal zycie = 3. No dobra, ale umieściłeś return ilosc_zyc. Jednak co z tego jeśli nigdzie tego nie zapisujesz ?
C/C++
while( !over )
{
    lvl1start = true;
    if( lvl1start == true && zycie > 0 )
         lvl1( zycie, bufor ); // tu jest zwracane życie..., ale do czego ?
    // ...
Są 2 rozwiązanie Twojego problemu:
1. Użyć takiego zapisu:
C/C++
while( !over )
{
    lvl1start = true;
    if( lvl1start == true && zycie > 0 )
         zycie = lvl1( zycie, bufor ); // teraz zapisujesz "ilosc_zyc" (z funkcji) do zmiennej "zycie"
    // ...
2. Przesłać do funkcji argument przez referencję (Referencje). Jednak aby to zrobić musiałbyś zmienić deklarację (funkcji):
int lvl1( int & ilosc_zyc, BITMAP * bufor );
Od tej pory funkcja nie będzie już pracowała na duplikacie, ale na oryginalnym obiekcie, więc (posługując się powyższym przykładem) jeśli np. przed wejściem do lvl1 zycie = 3 i w trakcie gry user straciłby życie (czyli od ilosc_zyc odejmujemy 1) to tym razem ilosc_zyc = 2 oraz zycie = 2.
Wywołanie funkcji wyglądałoby tak:
C/C++
while( !over )
{
    lvl1start = true;
    if( lvl1start == true && zycie > 0 )
         lvl1( zycie, bufor );
    // ...
lvl1 pracuje na oryginale, więc nic już nie trzeba zwracać :) (czyli return ilosc_zyc można usunąć).

... i tak dla wszystkich funkcji tego typu (lvl1, lvl2, lvl3 itd.).
P-13119
dmx81
Temat założony przez niniejszego użytkownika
» 2010-01-19 21:08:25
ok, wczesniej nie mialem czasu zagladac, dzieki za obszerna i szczegolowa odpowiedz, za chwilke bede probowal tych sposobow. do tej pory nie spodziewalem sie, ze program moze pracowac na duplikacie (no coz, poczatki i zawsze cos nowego wyskoczy) myslalem, ze jesli zadeklaruje zmienna, pozniej funkcja ta zmienna pobierze i zrobi na niej jakies dzialania, pozniej ja zwroci przez return, to ze jest to ciagle ta sama funkcja.

jest moze jakis sposob, aby sie dowiedziec, czy funkcja pracuje na duplikacie czy oryginale?

bo wczesniej nigdy mi sie nie zdarzylo, aby utworzyl sie duplikat zmiennej i mimo zwrocenia jej przez return, nie zadzialalo
jeszcze raz dzieki za wyjasnienie, musze jednak lepiej poznac ten mechanizm, aby nie powtorzyc juz tego bledu - byc moze bedzie to mozna tez umiescic w kursie, chyba ze jest a przeoczylem

ps. teraz widze o co chodzi, rozwiazanie 1 chyba duzo prostsze, zmienna zycie przyjmie wartosc zwracana z lvl1, rozwiazanie 2 tez nie najtrudniejsze, utworzyc referencje na zmienna zycie (o ile dobrze pamietam - byl to wskaznik, jednak po przydziale czegos na co wskazywal, bedzie juz wskazywal zawsze ta jedna zmienna:) )
ok biore sie do roboty
P-13140
malan
» 2010-01-19 21:44:03
Widzę, że już mniej więcej chwyciłeś o co chodzi, ale szczegóły musisz dopracować. Poczytaj bardzo uważnie jeszcze o tym, przerób jeszcze raz dział funkcje, zrób kilka przykładów żeby Ci się utrwaliło.

jest moze jakis sposob, aby sie dowiedziec, czy funkcja pracuje na duplikacie czy oryginale?
C/C++
#include <iostream>
using namespace std;

void duplikat( int );
void oryginal( int & );

int main()
{
    int zmienna = 0;
   
    cout << "Jestem w 'main'" << endl;
    cout << "Adres zmiennej: " <<& zmienna << endl;
    cout << "Wartosc zmiennej: " << zmienna << endl << endl;
   
    duplikat( zmienna );
    cout << "Wartosc zmiennej: " << zmienna << endl << endl;
   
    oryginal( zmienna );
    cout << "Wartosc zmiennej: " << zmienna << endl << endl;
   
    getchar();
    return 0;
};

void duplikat( int z )
{
    cout << "Wchodze do funckji 'duplikat'" << endl;
    cout << "Adres duplikatu: " <<& z << endl;
    cout << "Wartosc duplikatu: " << z << endl << endl;
    z = z + 1;
    return;
};

void oryginal( int & z )
{
    cout << "Wchodze do funckji 'oryginal'" << endl;
    cout << "Adres oryginalu: " <<& z << endl;
    cout << "Wartosc oryginalu: " << z << endl << endl;
    z = z + 1;
    return;
};
Jeśli coś pomieszałem, to przepraszam, ale myślę, że powinno być dobrze.
P-13143
dmx81
Temat założony przez niniejszego użytkownika
» 2010-01-19 23:13:19
Wszystko jest dobrze i ladnie sie kompiluje przyklad :) pomyslec, ze juz myslalem, ze cos wiem hehe ;) a tu takie cos mi wyskoczylo, dzieki wielkie i za pomoc w programie i za super przyklad, jesli nie ma go w kursie, powinien sie koniecznie znalezc, wiele tlumaczy :)
tzn rozumialem o co biega z "jednorazowym wskaznikiem" jak go uzywac, ze mozna go uzywac w "jakichs tam" sytuacjach, ktore mi dotad nie byly potrzebne...a teraz sie doksztalcilem, ze funkcja pobierajac zmienna, pracuje na jej duplikacie, czyli ze tworzy osobne miejsce w pamieci i tworzy jakby druga zmienna o poczatkowej wartosci rownej oryginalnej, lecz oryginalnej nie modyfikuje. ale dobrze, ze mozna uzyc :
zmienna=funkcja(zmienna) przy: return zmienna  .... czyli oryginal przyjmie wartosc, jaka uzyska jego duplikat przez dzialanie funcji :) ale sie rozpisalem, ale pisze tak, jak mysle, ze jakby jakis blad myslowy wyskoczyl, to lepiej mnie poprawic :) dzieki, gra dziala teraz poprawnie, moze pod koniec tyg wrzuce na forum do przetestowania ;) widzac, jakie wpadki zdarza mi sie zaliczyc, nie ma co sie spodziewac jakiegos hitu, ale jak na moj pierwszy projekt, mi sie podoba :D pozdr i wielkie dzieki

p.s. rozumiem, ze od tego momentu wlasnie tak powinienem postepowac, jak to wytlumaczone jest - w przypadku, jesli jakas funkcja ma pobrac wartosc zmiennej, po czym bedzie ja zwracac, powinno sie operowac na referencji, ewentualnie przypisac jej wartosc zwracana przez funkcje

p.s.2 - ale jesli zmienna jest deklarowana w danej funkcji, wystarczy zwrocic ja do funkcji glownej przez return i nic wiecej dodawac nie trzeba?
P-13144
malan
» 2010-01-20 00:51:24
Nie ma jakieś ogólnej zasady kiedy czego używać (przynajmniej się z takowymi nie spotkałem), używasz tego co Ci pasuje. Wiesz, ciężko to ubrać w słowa, musisz to sam zrozumieć..., przypadków jest tak dużo, że trudno to ogarnąć. Może pokaże Ci na małym przykładzie jaki błąd robiłeś:
C/C++
#include <iostream>
using namespace std;

int kwadrat( int liczba )
{
    return liczba * liczba;
};

int main()
{
    int liczba;
   
    cout << "Podaj liczbe: ";
    cin >> liczba;
   
    cout << liczba << " * " << liczba << " = ";
   
    kwadrat( liczba ); // 1
   
    cout << liczba;
   
    cin.sync();
    cin.get();
    return 0;
};
W tym programie jest ten sam błąd, który zrobiłeś. (1) - wywołujesz funkcję, ale nigdzie nie zapisujesz tego co zwróci.
Poprawne rozwiązania:
1.
C/C++
#include <iostream>
using namespace std;

int kwadrat( int liczba )
{
    return liczba * liczba;
};

int main()
{
    int liczba;
   
    cout << "Podaj liczbe: ";
    cin >> liczba;
   
    cout << liczba << " * " << liczba << " = ";
   
    liczba = kwadrat( liczba ); // 1
   
    cout << liczba;
   
    cin.sync();
    cin.get();
    return 0;
};
(1) - teraz do zmiennej liczba zapisujemy już wartość, którą zwraca funkcja.
2.
C/C++
#include <iostream>
using namespace std;

int kwadrat( int liczba )
{
    return liczba * liczba;
};

int main()
{
    int liczba;
   
    cout << "Podaj liczbe: ";
    cin >> liczba;
   
    cout << liczba << " * " << liczba << " = " << kwadrat( liczba ); // 1
   
    cin.sync();
    cin.get();
    return 0;
};
 (1) - w tym przypadku bezpośrednio na ekran zostanie wypisana wartość, którą zwróci funkcja, ale zmienna liczba pozostanie bez zmian.
3.
C/C++
#include <iostream>
using namespace std;

void kwadrat( int & liczba ) // 1
{
    liczba = liczba * liczba; // 3
};

int main()
{
    int liczba;
   
    cout << "Podaj liczbe: ";
    cin >> liczba;
   
    cout << liczba << " * " << liczba << " = ";
   
    kwadrat( liczba ); // 2
   
    cout << liczba;
   
    cin.sync();
    cin.get();
    return 0;
};
(1) - w tym przypadku została użyta referencja (więc definicja funkcji się zmieniła).
(2) - wywołujemy funkcję,
(3) - ... podwajamy wartość i koniec :).

Nie wiem, czy Ci nie namieszałem tymi przykładami - mam nadzieje, że nie :).

P-13145
dmx81
Temat założony przez niniejszego użytkownika
» 2010-01-20 21:00:07
przyklady bardzo fajne :) nie namieszalesz w glowie nic, tylko trzeba na spokojnie przeczytac i zrozumiec, a po chwili wydaje sie to juz oczywiste ;) jeszcze raz dzieki za poswiecony czas
P-13164
malan
» 2010-01-22 10:19:24
Ten też można zamknąć :).
P-13193
« 1 »
  Strona 1 z 1