-         

Ergebnis 1 bis 5 von 5

Thema: Highscoreliste erstellen?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2004
    Beiträge
    11

    Highscoreliste erstellen?

    Anzeige

    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

    "

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    30
    Beiträge
    215
    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.
    Alle sind unzufrieden - und alle machen weiter wie bisher.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    30
    Beiträge
    215
    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
    Angehängte Dateien Angehängte Dateien

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    03.12.2004
    Beiträge
    11
    hallo,

    irgendwie kenn ich mich bei diesenm code nicht überall aus.
    was bedeutet das:
    Code:
    #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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    23.05.2004
    Ort
    Untersöchering(Bayern,Alpenvorland)
    Alter
    30
    Beiträge
    215
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •