Hier ein sind deine Funktionen, nur die für alle Namen sortiert hab ich nicht gemacht. Hatt grad keine Lust
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.
Code:
#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 \/
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.
Lesezeichen