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.
Gruß MuraadCode:#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; }
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.






Zitieren


Lesezeichen