Zufällige nummern?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Moin,



    Ich habe mal eine Frage und zwar, möchte ich eine Nummer generieren lassen nur gibt es da ein kleines Problemchen
    wie Überprüfe ich ob es diese Nummer schon gibt?
    Mir würde es wirklich weiter helfen wenn mir einer, ein kleinen Code posten würde wie es so auszusehen hat.
    Mein Dateisystem basiert auf DINI.



    Grüße

  • Du könntest in einer Datei (z.B. Nummern.txt) alle Nummern abspeichern, und vorher abfragen ob einer dieser zufälligen Nummern bereits in der Datei existiert!
    EDIT: Ich glaube es geht nicht anders, da es Dini ist, und nicht MySQL oder sonst was ;)

  • Du kannst es auch anders machen..
    Was speicherst du alles in der Datei? ( wofür du nun eine zufällige Nummer usw brauchst )


    //E: Und wie lässt du es im Script laden?


    //->
    Ich gebe dir schon mal ein Beispiel..


    Das steht in der Datei:
    ID=0
    Name=Hallo
    Level=1


    So, dann generierst du eine zufällige Zahl, beispiel 67

    new datei[16]; format(datei,sizeof(datei),"/67.txt");
    if(!dini_Exists(datei))return dini_Create(datei);//Existiert nicht, Datei erstellen
    else ...//Datei existiert, neue Zahl generieren


    Wenn du aber alles in einer Datei hast:

    new datei[16]; format(datei,sizeof(datei),"/Zahlen.txt");
    if(dini_Int(datei,ZAHL) <= 0)//Zahl noch nicht belegt
    else //Zahl belegt



    Es kommt ganz drauf an, was und wie du es in der Datei speicherst.. Poste am besten mal, wie du es speicherst

    Mit freundlichen Grüßen
    ErikSon



    Scripte kleine Systeme auf Anfrage umsonst!
    Per PN könnt ihr mir gerne Scriptingfragen stellen.

    Einmal editiert, zuletzt von ErikSon ()

  • Du kannst es auch anders machen..
    Was speicherst du alles in der Datei? ( wofür du nun eine zufällige Nummer usw brauchst )


    //E: Und wie lässt du es im Script laden?

    Ich brauche nur eine Nummer bzw Mehrere aber halt 1Nr für mein Crew System, um später zuzuordnen welcher Spieler in welcher Crew ist.


    so schaut es derzeit aus, mit Erstellen/Laden aus, speichern habe ich auch noch nicht gemacht:



    stock CrewCreate(playerid, name[])
    {
    new Crewdatei[64];
    for(new crewid=1;crewid<MAX_CREWS;crewid++)
    {
    format(Crewdatei,50,"/Crews/%s.ini",name);
    format(CrewInfo[crewid][Crewname],32,"%s",dini_Get(Crewdatei,"CrewNR"));
    if(!fexist(Crewdatei))
    {
    dini_Create(Crewdatei);
    dini_Set(Crewdatei,"Crewname",name);
    dini_Set(Crewdatei,"Crewleiter", SpielerName(playerid));
    dini_Set(Crewdatei,"CrewNR", randnr);
    return LoadCrew(crewid, name);
    }
    }
    return 1;
    }


    stock LoadCrew(crewid, name[])
    {
    new Crewdatei[64];
    format(Crewdatei,50,"/Crews/%s.ini",name);
    {
    if(!fexist(Crewdatei))return 0;
    {
    format(CrewInfo[crewid][Crewname],32,"%s",dini_Get(Crewdatei,"Crewname"));
    format(CrewInfo[crewid][CrewLeader],32,"%s",dini_Get(Crewdatei,"Crewleiter"));
    {


    }
    }
    }
    return 1;
    }


  • Du benötigst dafür den Filemanager


    Ungetestet und aus dem Kopf geschrieben ( paar Erklärungen stehen dahinter )
    stock CrewCreate(playerid, name[]){
    new Crewdatei[64];
    for(new crewid=1;crewid<MAX_CREWS;crewid++){
    format(Crewdatei,50,"/Crews/%s.ini",name);
    if(dini_Exists(Crewdatei))return printf("Fehler beim Erstellen der Crew '%s'. Datei existiert bereits!",name);
    dini_Create(Crewdatei);
    //dini_Set(Crewdatei,"Crewname",name); -> Unnötig, da die Datei bereits den Crewnamen beinhaltet
    dini_Set(Crewdatei,"Crewleiter", SpielerName(playerid));
    if(AvailableNR(randnr))dini_IntSet(Crewdatei,"CrewNR", randnr); //Checkt ob die Zahl verfügbar ist ( sehe Funktion unten )
    else //Neue Nummer generieren und abfragen
    return LoadCrew(crewid, name);
    }
    return 1;
    }


    stock LoadCrew(crewid, name[])
    {
    new Crewdatei[64]; format(Crewdatei,50,"/Crews/%s.ini",name);
    if(!fexist(Crewdatei))return 0;
    format(CrewInfo[crewid][Crewname],32,"%s",name);
    format(CrewInfo[crewid][CrewLeader],32,"%s",dini_Get(Crewdatei,"Crewleiter"));
    return CrewInfo[crewid][CrewNR] = dini_Int(Crewdatei,"CrewNR");
    }


    stock AvailableNR(nr){
    new dir:dHandle = dir_open("./scriptfiles/Crews/");
    new item[40], type,datei[20];
    while(dir_list(dHandle, item, type)){
    if(type == FM_FILE){
    format(datei,20,"/Crews/%s",item);
    if(dini_Int(datei,"CrewNR") == nr)return false;
    else return true;
    }
    }
    return dir_close(dHandle);
    }


    PS: Wo wird denn die "randnr" eigentlich erstellt? :o


    //Edit: Sry, etwas vergessen ;)
    //Edit²: Veränderung beim Laden

    Mit freundlichen Grüßen
    ErikSon



    Scripte kleine Systeme auf Anfrage umsonst!
    Per PN könnt ihr mir gerne Scriptingfragen stellen.

    Einmal editiert, zuletzt von ErikSon ()

  • randnr habe ich noch nicht erstellt gehabt ^^
    Und der Filemanager funktioniert nicht. Ich hab das Include + Plugin in die jeweiligen ordner gepackt,
    und auch im Script Included, aber bekomme diese Fehlermeldung:


    fatal error 100: cannot read from file: "filemanager"

  • Hast du die Include auch in den richtigen Pawno-Ordner -> Includes gepackt?
    Du musst es in den Pawno-Ordner packen, welches Pawno du auch benutzt..


    //Edit: Goldkiller: Naja, mit den Zahlen wärs einfacher, ist mir auch eingefallen, jedoch dachte ich, er wills so haben..

    Mit freundlichen Grüßen
    ErikSon



    Scripte kleine Systeme auf Anfrage umsonst!
    Per PN könnt ihr mir gerne Scriptingfragen stellen.

    Einmal editiert, zuletzt von ErikSon ()

  • Hast du die Include auch in den richtigen Pawno-Ordner -> Includes gepackt?
    Du musst es in den Pawno-Ordner packen, welches Pawno du auch benutzt..

    Gut ich danke dir erstmal!


    So es funktioniert jetzt alles soweit ich habe jetzt mal die Zufalls Funktion eingefügt,
    und es scheint zu funktionieren, nur ist das auch wirklich sicher? das es nur 1x die gleiche Zahl geben kann?


    CODE:



    stock CrewCreate(playerid, name[])
    {
    new Crewdatei[64];
    for(new crewid=1;crewid<MAX_CREWS;crewid++)
    {
    new randnr = random(100);
    format(Crewdatei,50,"/Crews/%s.ini",name);
    if(dini_Exists(Crewdatei))
    dini_Create(Crewdatei);
    dini_Set(Crewdatei,"Crewleiter", SpielerName(playerid));
    if(AvailableNR(randnr))dini_IntSet(Crewdatei,"CrewNR", randnr); //Checkt ob die Zahl verfügbar ist ( sehe Funktion unten )
    else //Neue Nummer generieren und abfragen
    return LoadCrew(crewid, name);
    }
    return 1;
    }


    stock LoadCrew(crewid, name[])
    {
    new Crewdatei[64]; format(Crewdatei,50,"/Crews/%s.ini",name);
    if(!fexist(Crewdatei))return 0;
    format(CrewInfo[crewid][Crewname],32,"%s",name);
    format(CrewInfo[crewid][CrewLeader],32,"%s",dini_Get(Crewdatei,"Crewleiter"));
    return CrewInfo[crewid][CrewID] = dini_Int(Crewdatei,"CrewNR");
    }


    stock AvailableNR(nr){
    new dir:dHandle = dir_open("./scriptfiles/Crews/");
    new item[40], type,datei[20];
    while(dir_list(dHandle, item, type))
    {
    if(type == FM_FILE)
    {
    format(datei,20,"/Crews/%s",item);
    if(dini_Int(datei,"CrewNR") == nr)return false; // Hier steht 'nr' müsste da nicht hin 'randnr' ?
    else return true;
    }
    }
    return dir_close(dHandle);
    }


    Grüße

  • Viel zu kompliziert was ihr dort macht.
    Wäre einfacher, wenn der Dateiname die Nummer + ".txt" o.Ä. ist.


    zB.
    /Crews/1043.cfg
    /Crews/3423.cfg
    Das sind dann die Crew Dateien. Zu prüfen ob eine Nummer dann noch frei ist, reicht über fexist().


    /Crews/maps.cfg:

    Zitat

    1043 = breadfish Crew
    3423 = MÖP Crew


    Für den Fall, man möchte wissen hinter welcher Nummer welche Crew steckt.


    Gibt natürlich noch genug andere Möglichkeiten sowas umzusetzen, man sollte es aber nicht unnötig kompliziert gestalten.



    Bei AvailableNR(nr) hast du übrigens ein Memory Leak.
    stock AvailableNR(nr){
    new dir:dHandle = dir_open("./scriptfiles/Crews/");
    new item[40], type,datei[20];
    while(dir_list(dHandle, item, type))
    {
    if(type == FM_FILE)
    {
    format(datei,20,"/Crews/%s",item);
    if(dini_Int(datei,"CrewNR") == nr)return false; // <--- dir_close fehlt wenn du hier return'st
    else return true; // <--- dir_close fehlt wenn du hier return'st
    }
    }
    return dir_close(dHandle);
    }



    - - - - - - - - - -


    //Edit: Ich wäre mir auch nicht sicher,dass "return dir_close(dHandle)" so klug ist.


    Steht zwar "nothing", dass geht aber gar nicht. Sollest lieber "return false" machen und dir_close() davor.
    dir_close(dHandle);
    return true;// muss true sein


    Noch etwas:
    stock AvailableNR(nr){
    new dir:dHandle = dir_open("./scriptfiles/Crews/");
    new item[40], type,datei[20];
    while(dir_list(dHandle, item, type))
    {
    if(type == FM_FILE)
    {
    format(datei,20,"/Crews/%s",item);
    if(dini_Int(datei,"CrewNR") == nr)return false;
    else return true; // <--- das ist falsch. Das muss dort weg. Würde ja bedeuten, sobald die Zahl in einer (von X Vielen) Dateien nicht steht, ist sie frei. Das stimmt aber nicht
    }
    }
    return dir_close(dHandle);
    }
    Gefixt wäre es dann so:


    stock AvailableNR(nr){
    new dir:dHandle = dir_open("./scriptfiles/Crews/");
    new item[40], type,datei[20];
    while(dir_list(dHandle, item, type))
    {
    if(type == FM_FILE)
    {
    format(datei,20,"/Crews/%s",item);
    if(dini_Int(datei,"CrewNR") == nr)
    {
    dir_close(dHandle);
    return false;
    }
    }
    }
    dir_close(dHandle);
    return true;
    }

    Spoiler anzeigen
    Ein break + bool:variable geht natürlich auch :-0