PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Highscoreliste erstellen?



baldi123
27.03.2005, 21:02
hallo,
kann mir jemand bei dieser Aufgabe helfen, eine Highscore erstellen!!


"
Highscoreliste

Erstelle ein Programm, welches den Namen eines Spielers und seine erreichten Punkte erfasst und in einer binären Datei (Name: score.bin) abspeichert. Es können von einem Spieler durchaus mehrere Einträge gespeichert sein.

Die Struktur für einen Highscore-Eintrag ist wie folgt definiert:

struct TScore
{
char name[20];
int punkte;
};

Neben der Funktion zum Erfassen von Spielern und deren Punkten sollte dein Programm auch noch folgende Funktionen implementieren:

a) Ausgabe aller gespeicherten Highscoreeinträge

Beispiel für die Ausgabe:

Hans 3433
Susi 7210
Otto 455
Susi 4556
Otto 932
Max 3333


b) Erstellen einer Top-Ten Liste

Es wird von jedem Spieler nur der Datensatz mit der höchsten Punktezahl berücksichtigt. D.h. in dieser Liste kann ein Name nicht mehrfach vorkommen. Die Liste ist nach der Punktezahl sortiert.

Beispiel für die Ausgabe:

1. Susi 7210
2. Hans 3433
3. Max 3333
4. Otto 932

c) Highscoreliste nach Punkten

Ausgabe aller gespeicherten Einträge sortiert nach Punkten.

Beispiel für die Ausgabe:

1. Susi 7210
2. Susi 4556
3. Hans 3433
4. Max 3333
5. Otto 932
6. Otto 455

d) Liste aller Namen die in der Highscoreliste vorkommen. Sortiert nach Namen

Beispiel für die Ausgabe:

Hans
Max
Otto
Susi
"

muraad
30.03.2005, 15:34
Hier ein sind deine Funktionen, nur die für alle Namen sortiert hab ich nicht gemacht. Hatt grad keine Lust O:)
Antwort ist vielleicht bisschen spät aber ich hab mir gedacht wenn bis jetzt noch niemand antwortet.....
Funktionieren müssten Sie, ist eigentlich reines ANSI-C. Also nichts Linux oder Windows spezielles, außer die Includes. Vielleicht noch ein paar kleine Tippfehler, aber die lassen sich schnell finden.


#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#ifdef __unix__
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#elif __MSDOS__ || __WIN32__ || _MSC_VER
#include <io.h>
#include <sys\stat.h>
#endif



struct TScore
{
char name[20];
int punkte;
};

// Wird für andere Funktionen gebraucht
unsigned int sizeof_datei(void)
{
int i;
struct stat attribut;
stat("score.bin", &attribut);
i = ((attribut.st_size/sizeof(TScore))-1);
if(i== -1)
return 0;
return i;
}


// legt neu score.bin an oder überprüft nur ob sie schon existiert, -1 bei Fehler
int score_datei(void)
{
int SCORE;

// O_BINARY wird nur unter Windowsg gebraucht
if((SCORE=open("score.bin",O_CREAT|S_IREAD|S_IWRITE|O_BINARY)) == -1)
{
close(SCORE);
return -1;
}
// printf("Datei geöffnet mit lese/schreib Rechte\n");
close(SCORE);
return 0;
}
// Fügt neuen Spieler Score an die Datei score.bin an
int score_new(struct TScore score)
{
int SCORE;
if((SCORE=open("score.bin",S_IREAD|S_IWRITE|O_APPEND|O_BINARY)) == -1)
{
close(SCORE);
return -1;
}
// printf("Datei geöffnet mit lese/schreib Rechte\n");
if((write(SCORE,&score,sizeof(score))) == -1)
{
close(SCORE);
// printf("Konnte nicht in score.bin schreiben\n");
return -1;
}
close(SCORE=;
return 0;
}
// Alle Spieler in der Highscore
int score_all(void)
{
int SCORE,i;
struct TScore all[sizeof_datei()];
if((SCORE=open("score.bin",S_IREAD|O_BINARY)) == -1)
{
close(SCORE);
return -1;
}
// printf("Datei geöffnet mit lese Rechte\n");
if((read(SCORE,&all,sizeof(all))) == -1)
{
close(SCORE);
return -1;
}
// Komplette Highscoreliste geholt
for(i=0;i<=MAXSCORE;i++)
{
printf("\nNAME: %s ",k[i].name);
printf("\nPUNKTE: %i\n",k[i].punkte);
}
close(SORE);
return all;
}
// Nur die Namen aller Spieler
int score_all_name(void)
{
int i,SCORE;
struct TScore all[sizeof_datei()];
if((SCORE=open("score.bin",S_IREAD|O_BINARY)) == -1)
{
close(SCORE);
return -1;
}
// printf("Datei geöffnet mit lese Rechte\n");
if((read(SCORE,&all,sizeof(all))) == -1)
{
close(SCORE);
return -1;
}
// printf("Komplette Highscoreliste geholt\n");

for(i=0;i<=MAXSCORE;i++)
printf("\nNAME: %s ",k[i].name);

close(SORE);
return all;
}
// Top Ten der Highscore
int score_top_ten(void)
{
char name_flag,name_flag2;
int SOCRE,i,x,y,z,a;
struct TScore all[sizeof_datei()];
struct TScore best[9];
for(x=0;x<=9;x++)
best[x]=0;
name_flag=0;
name_flag2=0;
if((SCORE=open("score.bin",S_IREAD|O_BINARY)) == -1)
{
close(SCORE);
return -1;
}
// printf("Datei geöffnet mit lese Rechte\n");
if((read(SCORE,&all,sizeof(all))) == -1)
{
close(SCORE);
return -1;
}
// printf("Komplette Highscoreliste geholt\n");
// Stellt die Top Ten zusammen
for(i=0;i<=(sizeof_datei()+1);i++)
{
for(x=0;x<=9;x++)
{
if(all[i].punkte > best[x].punkte)
{ // Überprüft ob Name schon vorhanden
for(z=0;z<=9;z++)
{ // Wenn es Name schon gibt
if(all[i].name=best[z].name)
name_flag=1;
// Wenn es Name schon gibt und neue Punkte besser sind
if((name_flag=1)&&(all[i].punkte>best[z].punkte))
{
best[z].name=" ";
best[z].punkte=0;
name_flag=0; // Name nicht mehr in der Top Ten
name_flag2=1;
}
else
name_flag=1; // Name bleibt in Top Ten
}
if(name_flag!=1)
{
if(name_flag2=1) // Wenn gleicher Name aus Top Ten gelöscht wurde
{
for(a=9;a<=0;a--)
{
if(best[a].punkte=0)
{
for(y=a;y<=x;y--)
{ // Neu ordnen
best[y+1].name=best[y].name;
best[y+1].punkte=best[y].punkte;
}
}
best[x].punkte = all[i].punkte;
x=10; // Bricht Schleife ab
}
}
else
{
for(y=8;y<=x;y--)
{ // Neu ordnen
best[y+1].name=best[y].name;
best[y+1].punkte=best[y].punkte;
}
best[x].punkte = all[i].punkte;
x=10; // Bricht Schleife ab
}
}
}
}
}
for(x=1;x<=10;x++)
printf("\n%i: %s %i",x,best[x-1].name,best[x-1].punkte);

close(SCORE);
return 0;
}




int score_all_sort(void)
{
int SCORE,i,x;
struct TScore all[sizeof_datei()];
struct TScore all_sort[sizeof_datei()];

for(i=0;i<=sizeof_datei();i++)
all_sort[i]=0;

if((SCORE=open("score.bin",S_IREAD|O_BINARY)) == -1)
{
close(SCORE);
return -1;
}
// printf("Datei geöffnet mit lese Rechte\n");
if((read(SCORE,&all,sizeof(all))) == -1)
{
close(SCORE);
return -1;
}
// Komplette Highscoreliste geholt

for(i=0;i<=sizeof_datei();i++)
{
for(x=0;x<=sizeof_datei();x++)
{
if(all[i].punkte>all_sort[x].punkte)
{
all_sort[x].punkte=all[i].punkte;
x=sizeof_datei()+1; // bricht Schleife ab
}
}
}
for(i=1;i<=sizeof_datei()+1;i++)
printf("\n i%: %s %i",i,all[i-1].name,all[i-1].punkte);

close(SCORE);
return 0;
}

Gruß Muraad

EDIT:
Hab nochmal was geändert. Vorher hat die Top Ten Funktion nicht überprüft ob der Name schon in der Top Ten vorkommt, und die Funktion hatt die Top Ten nicht neu geordnet sondern einfach die neue Punktzahl überschrieben. Also z.B. der 1 wurde nicht 2 sonder flog raus aus der Top Ten.
Das hab ich jetzt alles verbessert und falls der Name schon mal vorkommt wird überprüft ob die neue Punktzahl besser wie die alte ist.
Ne richtige Top Ten also \:D/
EDIT:
So aber jetzt. Habs nochmal geändert. Top Ten hatte noch paar logische Fehler. Sieht jetzt vielleicht bisschen kompliziert aus ist es aber eigentlich nicht.

muraad
31.03.2005, 14:24
Im Codetag oben sah es jetzt bisschen unübersichtlich aus, vor allem die score_top_ten(). Deswegen lade ich es jetzt mal als Dateianhang hoch.
Das schwierigste die Top Ten müsste jetzt eigentlich funktionieren.
Nur die Funktion score_all_sort() die die ganze Liste nach Punkten sortiert stimmt nicht ganz. Bei ihr ist es so änhlich wie am Anfang bei score_top_ten(), sie wird noch nicht, jedesmal wenn etwas verändert wird, neu sortiert. Also z.B. der 2. wird nicht 3 sondern fliegt raus.
Das würde sich schon ändern lassen, braucht nur wieder ein paar if{} Anweisungen und for() Schleifen in der score_sort_all().
Gruß Muraad

baldi123
01.04.2005, 20:47
hallo,

irgendwie kenn ich mich bei diesenm code nicht überall aus.
was bedeutet das:

#ifdef __unix__
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#elif __MSDOS__ || __WIN32__ || _MSC_VER
#include <io.h>
#include <sys\stat.h>
#endif

??

MfG

muraad
02.04.2005, 14:13
Das macht den Code portabler. Die Defines __unix__ und __MSDOS__ usw. sind globale Defines. Jenachdem was definiert ist werden verschiedene #includes genommen. Da bei Windows eben andere gebraucht werden. Ich programmier beim PC normalerweise unter Linux, und das am Anfang hab ich aus einem C Buch.
Gruß Muraad