Namensgenerator



  • Grüße,

    Ich arbeite zurzeit an einem kleinen Namensgenerator, der einfach zufalls Buchstabenkonstellationen ausgeben soll und zudem noch silbenzusammenfügen kann.

    void namensgenerator()
    {
    
        char ant;                                                                    // Fortsetzungsparameter (j/n)
    
    do                                                                              // Begin der Schleife zum generieren von Zufallsworten
    {
        int maxnames, counter=0;                                                    // Die Variablen maxnames ( Anzahl der zu erstellenden Worte )
                                                                                    // und die Zählvariable counter werden auf 0 gesetzt.
        system("cls");
    
        cout << "Wieviele Namen sollen erstellt werden?? ";
        cin >> maxnames;                                                            // Anzahl der zu generierenden Namen wird eingegeben
    
        srand(GetTickCount());
    
        strcpy(name.erster[0],"Az");                                                // Diese Felder beeinhalten die Silben die in dem Wort
        strcpy(name.erster[1],"Ze");                                                // vorkommen sollen.
        strcpy(name.erster[2],"Ad");
        strcpy(name.erster[3],"Do");
        strcpy(name.erster[4],"Ra");                                                // Es gibt 4 Blöcke mit unterschiedlichen Silben die aufeinander abgestimmt sind.
        strcpy(name.erster[5],"Ba");                                                // Wichtig ist hierbei zu beachten, dass die ersten Silben mit einem Vokal oder
        strcpy(name.erster[6],"Xo");                                                // einem Übergangskonsonanten enden um mit den anderen Silben zusammen zu passen.
        strcpy(name.erster[7],"Da");
        strcpy(name.erster[8],"Scha");
        strcpy(name.erster[9],"My");
        strcpy(name.erster[10],"Ti");
    
        strcpy(name.zweiter[0],"rin");
        strcpy(name.zweiter[1],"la");
        strcpy(name.zweiter[2],"mo");
        strcpy(name.zweiter[3],"arx");
        strcpy(name.zweiter[4],"ar");
        strcpy(name.zweiter[5],"do");
        strcpy(name.zweiter[6],"ma");
        strcpy(name.zweiter[7],"mi");
    
        strcpy(name.dritter[0],"don");
        strcpy(name.dritter[1],"dran");
        strcpy(name.dritter[2],"ban");
        strcpy(name.dritter[3],"na");
        strcpy(name.dritter[4],"es");
        strcpy(name.dritter[5],"leth");
        strcpy(name.dritter[6],"ran");
        strcpy(name.dritter[7],"al");
    
        strcpy(name.vierter[0],"or");
        strcpy(name.vierter[1],"ar");
        strcpy(name.vierter[2],"ir");
        strcpy(name.vierter[3],"lor");
        strcpy(name.vierter[4],"kir");
        strcpy(name.vierter[5],"des");
        strcpy(name.vierter[6],"del");
        strcpy(name.vierter[7],"mos");
    
        cout << "\n";
    
        while(counter<maxnames)                                                     // Unterschleife die die Variable counter anhebt um sich der vorher eingegebenen
                                                                                    // Variable maxnames zu naehern. Die Schleife läuft solange wie die variable counter
                                                                                    // kleiner ist als die Variable maxnames. Ist sie gleich gross endet die Schleife
                                                                                    // und die gewählte Anzahl der Namen wird ausgegeben.
        {
    
         cout <<"\t\t°" << name.erster[rand()%11]                                   // Ausgabe des ersten Zufallswortes. Aus den Silben des ersten Feldes wird per Zufallswurf
                                                                                    // eine Silbe gewählt.
                        << name.zweiter[rand()%8]                                   // Zufallswurf für die zweite Silbe
                        << name.dritter[rand()%8];                                  // Zufallswurf für die dritte Silbe
    
    // Um nicht immer alle 4 Silbenfelder zusammen auszugeben wird mit einer if-Anweisung eine Bedingung
    // deklariert die die Anhängung einer 4ten Silbe erlaubt wenn bei einem Zufallswurf von 0-4 die Zahl 0
    // "erwürfelt" wird. Somit werden permenante übergrosse Worte vermieden.
    
        if(rand()%4==0)                                                             // wenn Zufallszahl = 0 dann kommt eine 4te Silbe zum bestehenden Wort
        {
         cout << name.vierter[rand()%8];                                            // Zufallswurf für die vierte Silbe
        }
    
         cout<< "\n";
    
         counter=counter++;                                                         // Erhöhung des Counters. Abbruchbedingung der Schleife
    }
    
    cout << "\nGenerierung der  Namen ist abgeschlossen\n\n";
    
    cout << "\nNochmal? ( j / n )";
    
    cin >> ant;
    
    system("cls");
    
    }
    while(ant=='j' || ant =='J');                                                   // Ende der Schleife des Programmteils für Wort/Namensgenerierung
    
    cin.get();
    
    }
    

    so sieht das derzeit aus und klappt für mich auch zufriedenstellend.
    Nur wurde mir gerade ans herz gelegt, die silben in einer Datei lieber zu haben und diese Datei dann aufzurufen bzw. die silben aus der datei random zusammenzutragen.

    Leider gottes hab ich davon keine Ahnung und irgendwie will mir meine vorhandene literatur auch nicht so recht weiterhelfen.

    Falls einer von euch schonmal etwas aehnliches gemacht hat (silben/namensgenerator aus einer .txt datei heraus ) oder sofort einen geistesblitz hat wie ein passender und funktioierender code dafür aussehen wuerde, hätte sofort meine volle aufmerksamkeit und dankbarkeit 🙂

    p.s. Bitte nicht über die Kommentare wundern im code und nicht ueber den Stil, ich bin blutigster Anfänger der sich gerade wegen Studium in C++ friemeln muss.

    LG
    Matar



  • Nimm filestreams, die sind schön zu brauchen.
    Hier ein Beispiel:

    #include <vector>
    #include <string>
    #include <fstream>
    
    void load_from_file()
    {
        std::vector<std::string> names;               // Ein dynamsiches Array von strings
        std::ifstream namefile( "names.txt" );        // Der Filestream
        if( namefile.is_open() )                      // Checken ob offen
        {
            while( !namefile.good() )                 // Solange der Stream gültig ist, 
            {                                         // dh nicht am Ende des Files (eof) ist oder andere Probleme hat
                std::string str;
                getline( namefile, str );             // Liest eine Zeile aus der Datei und speichert sie in str
                if( !str.empty() )                    // Hat das geklappt
                {
                    names.push_back( str );           // ..dann versorg den string
                }
            }
        }
        else                                          // Wenn das File nicht geöffnet werden konnte, zB Fehler ausgeben
        {
            std::cerr << "File not found: names.txt" << std::endl;
        }
        namefile.close();                             // Schliessen nicht vergessen
    }
    

    So kannst du die Einträge von names.txt in nen vector laden. Zugriff hast du dann wie gehabt über names[r].



  • vielen dank fuer die schnelle antwort, ich probiers gleich mal aus.

    LG
    Matar



  • hat leider doch nicht so geklappt, bzw. reicht da meine erfahrung mit c++ bei weitem nicht aus um mir daraus was funktionierendes zu basteln.

    in meinem code den ich gepostet habe sind ja einige silben schon vorhanden, mein problem liegt nun darin, das ich diese silben in einer datei haben möchte ( also beliebig viele silben, suffixe, prefixe die nach lust und laune manuell in einer txt datei ergänzt werden koennen. Diese Datei soll dann in das programm eingelesen werden und wie in meinem code sollen sich dann "pseudo-wörter" mit dem angebot der silben aus der txt datei bilden.

    Kennt einer einen lösungsweg für dieses spezielle programm? ich bin mit meinem latein am ende 😞

    LG
    Matar


Anmelden zum Antworten