Hjælp til "fstream"

Tags:    c++

Hey alle


Jeg har skrevet et lille snake program. Det er ret enkelt, man starter med at se en mindre menu hvor man kan starte spillet og hvor man kan se hi-score listen. Det hele virker indtil nu, undtagen hi-score systemet. Her er koden:

Fold kodeboks ind/udKode 


Spørgsmålet er hvordan jeg får den til at skrive hi-score ud til en fil vha. fstream. Når den skriver det ud, skal man også kunne læse hi-score listen når man åbner "hi-score" funktionen i hoved menuen.
Jeg har derfor et andet lille program her som skriver til en fil med hi-score og navn:

Fold kodeboks ind/udKode 


Jeg vil have kombineret denne kode med mit snake program, hvor jeg har en top 5 liste over højeste score. Den skal erstatte den højeste score hver gang der kommer en ny som er højere. Jeg har prøvet forskellige metoder, men det virker ikke. Et andet krav er at man skal kunne skrive et navn ved sin score.

Håber virkerlig at der er nogle der kan hjælpe. Mange tusinder tak på forhånd.



Indlæg senest redigeret d. 23.04.2006 12:26 af Bruger #8784
Jeg lavede en lille hurtig highscore funktion, med tilhørende test program:

Fold kodeboks ind/udKode 




Et par kommentarer:

Det bør være muligt at lave snake spillet uden at den skal tegne hele skærmen hvergang. Hvis du vil gøre det kan du bruge funktionen ClearScreen fra:

http://home20.inet.tele.dk/midgaard/snip/pacman.html

Den giver mindre flimmer.

Man må ikke kalde main fra et C++ program, g++ ser ud til at tillade det.



Okay, det var ikke helt det jeg ville! Men prøv lige at kigge på denne kode nu! Det virker næsten, der er kun en ting tilbage som ikke gider helt! Kopier koden til din compiler og se hvad der sker:

Kig især på "spil_snake" og "hi_score" funktionerne!

Fold kodeboks ind/udKode 


Variablen "min" står for minimum. Det er meningen at "min" skal være den sidste score man har fået, så når man får en ny, skal den gamle erstattes med den nye. Men den sidder fast ved 2. Gad vide hvorfor. Man skal jo ikke komme på hi-score listen hvis man har fået under 2 point!



Indlæg senest redigeret d. 23.04.2006 20:22 af Bruger #8784
I linie 189 åber du filen for at læse.

I Linie 207 åbner du den igen, denne gang for at skrive, men det går galt fordi filen allerede er åbnet. Så du skal lukke den inden.

For at få vist hele listen og få indsat den nye highscore på den rette plads er du nødt til at læse hele filen og skrive hele filen.

Mit eksempel var et forsøg på at vise hvordan det kan gøres.

Funktionen spil_snake er på ca 160 linier, og så bliver det svært at overskue (specielt for andre der skal læse koden), så du kan med fordel putte highscore opdatering i en funktion for sig selv.



Okay, men hvordan vil du kombinere dit eksempel med mit program??
Problemet er at jeg ikke forstår så meget af dit eksempel! Jeg burde forstå det godt, så jeg selv kan forklare det til andre!



Indlæg senest redigeret d. 23.04.2006 21:26 af Bruger #8784
ElememtClass bliver brugt til at gemme et navn og dennes highscore.

Denne bliver brugt når listen af high-scores skal sorteres.
bool operator < (const ElememtClass& aLhs, const ElememtClass& aRhs)

Her laves en dynamisk "array" af highscores:
vector<ElememtClass >List;

Denne linie indsætter et element i high score listen:
List.push_back(Element);

Her sorteres listen:
sort(List.begin(), List.end());

begin() er der første element i listen, end() er en-efter-sidste element i listen.

Ideen i funktionen er:
Læs listen fra filen
Tilføj den ny score til listen
Sorter listen
Skriv de første 5 i listen til filen.

Du har brug for at vide om den nye score skal tilføjes til listen, da det første er der der skal spøges om navn osv.

Dette er en version der kan det:

Fold kodeboks ind/udKode 


List.back() er det sidste element i listen.



Når du har tilrettet Highscore funktionen kan du kalde den her:
Fold kodeboks ind/udKode 


Så klarer funktionen resten.



Ok tak, men hvad betyder det her:
Fold kodeboks ind/udKode 


Der er godt nok en masse ting jeg ikke har set før! Hvilken type variabel er "bool"? Og hvad er "aLhs" og "aRhs"?

Og hvad er "vector" forresten?



Koden er en operator der sammenligner to elementer af typen ElememtClass. lhs betyder Left Hand Side & rhs betyder Right Hand Side. Den bliver brugt af sort(...), men kan også bruges med:

ElememtClass A;
ElememtClass B;

if(A < B)
cout "A is smaller than B" << endl;

bool er en variabel der kan være enten true (sand) eller false (usand).

En vector kan betragtes som et dynamisk array, i dette tilfælde kunne man godt bruge et array da vi ved at der aldrig er mere end 6 elementer i array'et.



t