HIGHSCORE, BITTE JEDER DER AHNUNG HAT KURZ MAL REIN SCHAUEN, BRAUCHE DAS MEGA SCHNELL



  • Vileicht mit Huffman irgentwie verschluseln?. Damit du eine lange string mit 1 und 0 bekommst das keiner lessen kan.



  • mantiz schrieb:

    hm, also, ich will ja jetzt nix sagen, gerade weil ich auch noch sehr neu auf dem Gebiet C/C++ bin und auch ziemlich neu hier im Forum, aber für mich sieht das ziemlich so aus, dass Du nen komplett fertigen Code haben willst, den Du dann am Ende wahrscheinlich noch nicht einmal verstehst. Du bist noch am Anfang, ist ja auch OK, aber frag' doch dann nicht nach einer kompletten Lösung.

    Master-of-Scare schrieb:

    ... das man entweder übernehmen oder daraus lernen (Anm.: oder teilweise klauen?) kann ...

    ... Falls ihr was habt könnt ihr auch gerne mailen: ...

    ... zeig lieber mal das du es besser kannst, ich lerne erst seit paar wochen c...

    Wie gesagt, will mich nicht zu weit aus dem Fenster lehnen, aber für mich liest sich das so ziemlich nach einer Forderung (einem Wunsch) nach einer Komplettlösung und nicht nach einer Lösung eines Problems, wo man durch Tips (passiert ja immer wieder, dass man nicht alles weiß (mir auch sehr, sehr häufig)) das Problem selbst in den Griff bekommt.

    Nope, so war das absolut net gemeint, hatte nur das verdammte problem das ich egal wie ich das durchgedacht hatte nie ne schleife rein bekommen hab. die lösung von konfusius hab ich erst mal studiert, hab daran jedoch noch einiges dann geändert da ich das mit einigen anderen ideen noch verbunden habe, mit kopieren war das so gemeint, falls ich das dann absolut net hin bekomm...



  • Master User schrieb:

    Vileicht mit Huffman irgentwie verschluseln?. Damit du eine lange string mit 1 und 0 bekommst das keiner lessen kan.

    jemand der noch nicht mal arrays einsetzen kann, sollte auf dem teppich bleiben, einfaches xor ist angesagt glaub ich. sonst wird die highscore komplizierter als das programm 😉



  • anstatt die highscoredaten gleich mit fprintf() in die datei zu schreiben, kannst du sie erst mit sprintf() in einen char-puffer schreiben. dort verschlüsselst du sie dann und schreibst das ergebnis in die datei.

    zum verschlüsseln würde ich auch xor nehmen. mache einfach buf[i]=buf[i]^0xAA für jedes zeichen im puffer. anstelle von 0xAA kannst du auch eine andere zahl von 0 bis 255 nehmen. du mußt aber aufpassen die zahl so zu wählen, daß kein reguläres zeichen dabei null wird. sonst wird das als stringende interpretiert und das wird dir beim anschließenden schreiben mit fputs() probleme machen. am besten nimm zahlen >127.

    das entschlüsseln geht übrigens genauso. xor ist nämlich selbstinvers. wenn du eine zahl zwei mal mit der selben zahl xor'st, dann kommt wieder das selbe raus wie am anfang.

    am besten schreibst du dir eine verschlüsselungs-funktion, die als argument den zu verschüsselnden string bekommt. die kannst du dann überall da aufrufen, wo du sie brauchst.

    @alle
    ich gebs ja zu. ich bin zu noob-freundlich. das fertigcode-posten ist vielleicht doch nicht die beste idee. nem alten c-programmierer wie mir fällts halt leichter, sich in code auszudrücken als in natürlicher sprache. ich gelobe hiermit, mich zu bessern.

    aber jeden noob anzuschnauzen, er solle erst mal informatik studieren bevor er die unverschämtheit hat sich in diesem forum zu melden, ist auch nicht der weisheit letzter schluß.

    Master-of-Scare schrieb:

    naja, groß töne spucken kannst ja, aber auch was anderes? zeig lieber mal das du es besser kannst

    daran, daß er es besser könnte als du, besteht kein zweifel. und daß hier nicht jeder fertigen code posted, liegt daran, daß noobs ja auch was lernen sollen.



  • ich werde den code ja auch net so übernehmen, aber auf die art und weiße habe ich auch schon HTML gelernt, ich brauche Quellcode um das zeug zu lernen, die highscore muss ich eh noch um einiges dann umschreiben da ich ganz ehrlich nicht die arbeit von einem anderen möchte... nur ich muss sehen wie das funktioniert um es dann selber zu machen... THX A LOT

    PS mir ist auch klar das er es besser kann, aber dafür das ich c erst seit etwa 8 oder 9 wochen etwas genauer behandel ist auch klar das ich net das vernetzte denken bisher habe, jedoch will ich das schnell lernen. Und ich bleibe auch net bei c, will noch java, java script, php, flash und sql sowie cgi im verlauf dieses jahres lernen, was nicht so viel ist...



  • @Konfusius
    Ich glaube es gibt eine günstiger Lösung. Mach eine union mit 2 elementen, das eine ist die Struct das andere eine array of byte mit der gleichen Länge wie die struct.
    Die Daten in die Struct kopieren und als Array of Byte abholen. ich spreche hier von einem Array of Byte und nicht von einem String alle alle Zeichen auch die \0 an jeder Stelle möglich sind. Die Länge ist fest und bekannt.
    Auf dies Array of Byte kann ich jedes beliebige schleierverfahren (siehe oben) anwenden und es dann anschließend mit write binaer in eine File schreiben.

    Lesen geht dann genau andersrum.
    read aus dem file
    entschleiern
    in union kopieren
    als struct abholen

    Das array of byte wird genauso angelegt wie ein string am besten mit

    unsigned char Testarry[24];

    Alles weiter kann man hier erfragen oder in jedem C-Buch nachlesen. :p



  • PAD schrieb:

    Ich glaube es gibt eine günstiger Lösung.

    ich finde deinen ansatz auch gut. er ließe sich aber noch weiter vereinfachen. anstatt eine union zu verwenden kann man den zeiger auf die struktur einfach auf (char*) casten.

    bliebe nur noch, eine funktion *verschluesseln(char daten, int anz) zu schreiben. dabei muß aber unbedingt darauf geachtet werden, daß keine bytes !=0 auf 0 abgebildet werden und umgekehrt. sonst würde die ende-markierung der strings in der struktur zertört werden und sie könnte nicht mehr mit fprintf() gespeichert werden. das ließe sich beim xor-algorithmus erreichen, indem man nur bytes xor't die sowohl !=0 als auch !=schlüssel sind.

    ich kanns nicht lassen und muß jetzt doch wieder mal code posten 😃

    const int schluessel=0xAA;
    
    void
    verschluesseln (char *daten, int anz)
    {
      while(anz--)
        if(daten[anz]!=0 and daten[anz]!=schluessel)
          daten[anz]=daten[anz]^schlüssel;
    }
    

    der algorithmus ist selbstinvers, dh das entschlüsseln erfolgt durch einen weiteren aufruf von verschluesseln().

    Master-of-Scare schrieb:

    mir ist auch klar das er es besser kann

    eigentlich war mein post auch ein bißchen selbstkritisch gemeint. ich wollte damit sagen, daß ich mich nicht für einen besseren programmierer halte, nur weil ich mehr code poste als andere. mir macht das coden einfach nur spaß. und wenn andere weniger code posten, dann deshalb, weil sie wollen, daß die anfänger hier im forum was lernen. ich denke aber auch, daß ein stück code einem anfänger häufig mehr sagt als seitenlanges fachchinesisch 🙂



  • @Konfusius
    Das ist der Grund warum ich hier nicht mit einem null Terminierten C-String
    sondern mit einem Array of Byte wie in Pascal da gehört nämlich noch die Länge dazu.

    verschluesseln (char *daten, int anz)
    {
    for (i=0;i<anz;i++)
    daten[i]=daten[i]^schlüssel;
    }

    MfG
    PAD



  • @PAD
    hmmm... das haut aber nicht hin. denn mit der ganzen struktur verschlüsselst du ja auch die längenangabe!



  • ok, das:

    const int schluessel=0xAA; 
    
    void 
    verschluesseln (char *daten, int anz) 
    { 
      while(anz--) 
        if(daten[anz]!=0 and daten[anz]!=schluessel) 
          daten[anz]=daten[anz]^schlüssel; 
    }
    

    klingt echt super und ist unkompiziert, eine kurze frage dazu, was ist in dem fall wo du mir zb die eine highscore geschrieben hast daten und was anz?



  • also darauf könntest du auch von selber kommen 😃

    daten ist ein zeiger auf den zu verschlüsselnden speicherbereich. in deinem falle ist das logischerweise das, was du verschlüsseln willst, nämlich ein feld von highpl[].

    anz ist die länge des speicherbereichs in bytes, auf den daten zeigt, also sizeof(struct highpl).



  • axo ^^ 😃



  • @Konfusius.

    Missverständlich ausgedrückt von mir. Die Länge des array of bytes ist nicht bestandteil der Struktur und wir nicht mitverschlüsselt. In unserem Fall ist die Länge eines Records ja immer gleich lang.
    Allerdings hast du mich damit auf einen guten Gedanken für andere Sachen gebracht.
    Um aber array of char´s unterschiedlicher Länge verschlüsselt zu speichern ginge folgendes Konstrukt.

    WriteCoded(char *daten)
    {
    unsigned int len;
    len=strlen(daten); // hier nicht ein uncoded string somit funktioniert strlen;
    verschluesseln (daten,len) ; // jetzt verschlüsselt
    write(fp,len,sizeof(unsigned int));
    write(fp,daten,len*(sizeof(char)));
    }
    
    ReadCoded(char *daten)
    {
    read(fp,len,sizeof(unsigned int));
    read(fp,daten,len*(sizeof(char)));
    verschluesseln (daten,len) ; // jetzt entschlßsselt
    }
    


  • @PAD
    wie waers mit:

    WriteCoded(char *daten){
       unsigned int len;
       len=strlen(daten); // hier nicht ein uncoded string somit funktioniert strlen;
       verschluesseln (daten,len) ; // jetzt verschlüsselt
       write(fp,len,sizeof(unsigned int));
       write(fp,daten,len*(sizeof(char)));
    }//end WriteCoded
    
    ReadCoded(char *daten){
       read(fp,len,sizeof(unsigned int));
       read(fp,daten,len*(sizeof(char)));
       verschluesseln (daten,len) ; // jetzt entschlßsselt
    }//end ReadCoded
    

    jetzt den Stil betreffend
    ach ja weil jemand auf der 1.Seite über goto geschimpft hat ich find goto schon genial da kann man so schön brutal sein findet ihr nicht
    🙂 🙂 🙂 🙂 🙂 🙂 🙂
    goto 4 ever
    rülps--- tschuldigung 😮



  • volkardus schrieb:

    Master-of-Scare schrieb:

    sollte jedoch dabei auch noch kurz sein...

    keine bange, die wird sehr kurz. schau in dein c-buch unter dem stichwort arrays nach. das vereinfacht die lange variablenliste, und du kannst dich dann auf's wesentliche kondensieren.

    LOL *scnr* *duckundweg*



  • Dann müsste das etwa doch so aussehen, oder? :

    void WriteCoded(char *);
    void ReadCoded(char *);
    void verschluesseln(char *, int);
    const int schluessel=0xAA; 
    
    void verschluesseln (char *daten, int anz) 
    { 
      while(anz--) 
        if(daten[anz]!=0 and daten[anz]!=schluessel) 
          daten[anz]=daten[anz]^schluessel; 
    }
    
    void WriteCoded(char *highpl) 
    { 
    unsigned int len; 
    len=strlen(highpl); // hier nicht ein uncoded string somit funktioniert strlen; 
    verschluesseln (highpl,len) ; // jetzt verschlüsselt 
    write(fp,len,sizeof(unsigned int)); 
    write(fp,highpl,len*(sizeof(char))); 
    } 
    
    void ReadCoded(char *highpl) 
    { 
    read(fp,len,sizeof(unsigned int)); 
    read(fp,highpl,len*(sizeof(char))); 
    verschluesseln (highpl,len) ; // jetzt entschlßsselt 
    } 
    
    struct highpl 
    { 
      int  punkt; 
      char name[4]; /* der name soll nur 3 zeichen lang sein, */ 
    }; 
    
    void 
    highscore_lesen (struct highpl *highpl) 
    { 
    
      FILE *pfile; 
      int i;
    
      pfile=fopen("C:\\system.zrx","r"); 
    
      for(i=0; i<8; i++) 
        fscanf(pfile,"%i %s",&highpl[i].punkt,highpl[i].name); 
    
      fclose(pfile); 
    } 
    
    void 
    highscore_schreiben (struct highpl *highpl) 
    { 
      FILE *pfile; 
      int i; 
    
      pfile=fopen("C:\\system.zrx","w"); 
    
      for(i=0; i<8; i++) 
        fprintf(pfile,"%i %s\n",highpl[i].punkt,highpl[i].name); 
    
      fclose(pfile); 
    } 
    
    void 
    highscore_einfuegen (struct highpl *highpl, int punkt, char *name) 
    { 
      int pos,i; 
    
      /* bestimme position, an der der neue highscore eingefügt werden soll */ 
      for(pos=0; pos<8; pos++) 
        if(punkt>highpl[pos].punkt) 
          break; 
    
      if(pos==8) return; /* highscore kleiner als letzter platz => keine änderung */ 
    
      /* schiebe highscores nach unten */ 
      for(i=7; i>pos; i--) 
      { 
        highpl[i].punkt=highpl[i-1].punkt; 
        strcpy(highpl[i].name,highpl[i-1].name); 
      } 
    
      /* füge neuen highscore ein */ 
      highpl[pos].punkt=punkt; 
      strcpy(highpl[pos].name,name); 
    } 
    
    void 
    highscore_eingeben (int punkte) 
    { 
      struct highpl highpl[8]; 
      char name[256];
    
      highscore_lesen(highpl); 
    
      if(punkte>=highpl[7].punkt) 
      { 
        printf("NEUER HIGHSCORE!\n\n"); 
        printf("Ihre Punktzahl ist: %i\n",punkte); 
    
        printf("Ihr Name (max. 3 Zeichen): "); 
        scanf("%s",name); 
        name[3]='\0'; /* auf 3 zeichen kürzen */ 
        printf("\n\n"); 
    
        highscore_einfuegen(highpl,punkte,name);
    
        WriteCoded(highpl);
    
        highscore_schreiben(highpl); 
      } 
    } 
    
    void 
    highscore_ausgeben (void) 
    { 
      struct highpl highpl[8]; 
      int i; 
    
      highscore_lesen(highpl); 
    
      ReadCoded(highpl);
    
      for(i=0; i<7; i++) 
        printf(" %i. %i Pkt %s\n",i+1,highpl[i].punkt,highpl[i].name); 
    
      printf(" 7,5. %i Pkt\n",highpl[8].punkt);
    }
    

    PS: Der Text ist bisher nur leicht verändert, gerade beim ausgeben, da ich bisher net groß zeit hatte.



  • brav hast du das gemacht 😃

    so waere das aber NOCH besser:

    void WriteCoded(char *);
    void ReadCoded(char *);
    void verschluesseln(char *, int);
    const int schluessel=0xAA;
    
    void verschluesseln (char *daten, int anz)
    {
      while(anz--)
        if(daten[anz]!=0 and daten[anz]!=schluessel)
          daten[anz]=daten[anz]^schluessel;
    }
    
    void WriteCoded(char *highpl)
    {
    unsigned int len;
    len=strlen(highpl); // hier nicht ein uncoded string somit funktioniert strlen;
    verschluesseln (highpl,len) ; // jetzt verschlüsselt
    write(fp,len,sizeof(unsigned int));
    write(fp,highpl,len*(sizeof(char)));
    }
    
    void ReadCoded(char *highpl)
    {
    read(fp,len,sizeof(unsigned int));
    read(fp,highpl,len*(sizeof(char)));
    verschluesseln (highpl,len) ; // jetzt entschlßsselt
    }
    
    struct highpl
    {
      int  punkt;
      char name[4]; /* der name soll nur 3 zeichen lang sein, */
    };
    
    void
    highscore_lesen (struct highpl *highpl)
    {
    
      FILE *pfile;
      int i;
    
      pfile=fopen("C:\\system.zrx","r");
    
      for(i=0; i<8; i++)
        fscanf(pfile,"%i %s",&highpl[i].punkt,highpl[i].name);
    
      fclose(pfile);
    }
    
    void
    highscore_schreiben (struct highpl *highpl)
    {
      FILE *pfile;
      int i;
    
      pfile=fopen("C:\\system.zrx","w");
    
      for(i=0; i<8; i++)
        fprintf(pfile,"%i %s\n",highpl[i].punkt,highpl[i].name);
    
      fclose(pfile);
    }
    
    void
    highscore_einfuegen (struct highpl *highpl, int punkt, char *name)
    {
      int pos,i;
    
      /* bestimme position, an der der neue highscore eingefügt werden soll */
      for(pos=0; pos<8; pos++)
        if(punkt>highpl[pos].punkt)
          break;
    
      if(pos==8) return; /* highscore kleiner als letzter platz => keine änderung */
    
      /* schiebe highscores nach unten */
      for(i=7; i>pos; i--)
      {
        highpl[i].punkt=highpl[i-1].punkt;
        strcpy(highpl[i].name,highpl[i-1].name);
      }
    
      /* füge neuen highscore ein */
      highpl[pos].punkt=punkt;
      strcpy(highpl[pos].name,name);
    }
    
    void
    highscore_eingeben (int punkte)
    {
      struct highpl highpl[8];
      char name[256];
    
      highscore_lesen(highpl);
    
      if(punkte>=highpl[7].punkt)
      {
        printf("NEUER HIGHSCORE!\n\n");
        printf("Ihre Punktzahl ist: %i\n",punkte);
    
        printf("Ihr Name (max. 3 Zeichen): ");
        scanf("%s",name);
        name[3]='\0'; /* auf 3 zeichen kürzen */
        printf("\n\n");
    
        highscore_einfuegen(highpl,punkte,name);
    
        WriteCoded(highpl);
    
        highscore_schreiben(highpl);
      }
    }
    
    void
    highscore_ausgeben (void)
    {
      struct highpl highpl[8];
      int i;
    
      highscore_lesen(highpl);
    
      ReadCoded(highpl);
    
      for(i=0; i<7; i++)
        printf(" %i. %i Pkt %s\n",i+1,highpl[i].punkt,highpl[i].name);
    
      printf(" 7,5. %i Pkt\n",highpl[8].punkt);
    }
    


  • kann es sein oder finde ich da keinen unterschied?



  • Formatierung.
    Gute Gelegenheit für den längsten Spam-Post 2k5 😃



  • naja, bei mir tut der quellcode so absolut net, da sind ewig viele fehlermeldungen


Anmelden zum Antworten