Seite 1 von 2

Generator für Fantasienamen

Verfasst: 13.11.2004 16:06
von Kiffi
Hallo,

für ein Spiel benötige ich einen Generator, der Fantasienamen erstellt. Im
INet gibt es sehr viele Beispiele, die mir auf Knopfdruck mehr oder minder
gelungene Ergebnisse liefert (bei einstellbarer Option, ob die Spielfigur nett,
niedlich, böse oder sonstwas ist). Leider ohne Source, den ich portieren
könnte.

Leider habe ich momentan überhaupt keinen Ansatz, wie so was in PureBasic
zu realisieren ist.

Hat jemand von Euch einen Tipp für mich?

Danke & Grüße ... Kiffi

Verfasst: 13.11.2004 16:10
von Lars
Ich würde ggf. einfach Listen von männlichen und weiblichen Vornamen
machen und dazu noch eine Liste mit Nachnamen. Diese Listen müsste
man sicherlich irgendwo klauen können, je nach deinem Vorhaben solltest
du dir aber natürlich ein Paar Gedanken zum Copyright machen :wink:

Aus diesen Listen kannst du dann einfach mit einem Zufallsgenerator
Namen zusammenstellen.

Verfasst: 13.11.2004 17:32
von Kaeru Gaman
wenn es wirklich 'Fantasienamen' sein können und keine wirklichen, gäbe es noch folgende möglichkeit:

- erstelle ein Liste von Silben.

- setze in einer Proc jeweils 1-3 Silben für den vornamen und 2-4 Silben für den Nachnamen zusammen.

[Edit] ...du könntest dann jeden erzeugten namen mit einer kennzahl versehen (die sich aus den laufenden nummern der verwendeten silben zusammensetzt), um zu vermeiden, dass in einem programmlauf ein name doppelt erzeugt wird...

[Edit2] ...den silben könnte noch ein flag zugeordnet werden, um zu deklarieren, ob sie für gut u/o böse u/o niedlich etc. verwendet werden können...

Verfasst: 13.11.2004 17:44
von MLK
das hier wäre doch schon mal ne anregung:

Code: Alles auswählen

vokal.s="aeiou"
Doppelvokal.s="aeo"
Konsonant.s="bcdfghjklmnpqrstvwxyz"
Doppelkonsonant.s="bcfklmnprstz"

For x=1 To 1000
    Laenge=3+Random(3)
    ;erster buchstabe - vokal oder konsonant
    If Random(1)
        Name.s+Mid(Konsonant,Random(Len(Konsonant)-1)+1,1)
    Else
        Name.s+Mid(vokal,Random(Len(vokal)-1)+1,1)
    EndIf
    
    ;einer geht noch..
    While Laenge>1
        ;letzter buchstabe ist ein vokal
        If CountString(vokal,Right(Name,1))
            ;einen konsonanten dazu
            Name+Mid(Konsonant,Random(Len(Konsonant)-1)+1,1)
            Laenge-1
            ;wenn dieser ein möglicher doppelkonsonant und der zufall es will
            If CountString(Doppelkonsonant,Right(Name,1)) And doppel=#True And Laenge>1 And Random(4)=0
                ;verdoppeln
                Name+Right(Name,1)
                Laenge-1
            EndIf
        ;letzter buchstabe ist ein konsonant
        Else
            ;einen vokal dazu
            Name+Mid(vokal,Random(Len(vokal)-1)+1,1)
            Laenge-1
            ;wenn dieser ein möglicher doppelvokal und der zufall es will
            If CountString(Doppelvokal,Right(Name,1)) And doppel=#True And Laenge>1 And Random(4)=0
                ;verdoppeln
                Name+Right(Name,1)
                Laenge-1
            EndIf
        EndIf
        ;wenn die letzten beiden buchstaben gleich sind
        If Right(Right(Name,2),1)=Left(Right(Name,2),1)
            ;verhindern dass noch zwei doppelte dazu kommen
            doppel=#False
        Else
            ;ansonsten ist es erlaubt
            doppel=#True
        EndIf
    Wend
    Name+"|"
    Debug StringField(Name,x,"|")
Next

Verfasst: 13.11.2004 17:50
von Kaeru Gaman
@MLK

klasse idee, mit buchstaben zu arbeiten...
...liest sich gut, der code, leider kann ich ihn noch nicht testen (V3.30)...wird nächste woche besser :wink:

...btw: super-lustiges pic, George&Saddam, find ich einfach klasse :mrgreen:

Verfasst: 13.11.2004 18:02
von MLK
meinen namen findet der code (unter angeben der richtigen länge) in zwischen 3 und 10 sekunden, oder 50000 und 2600000 versuchen raus :-)

Verfasst: 13.11.2004 18:44
von Kiffi
Hallo,

erstmal vielen Dank für Eure rege Teilnahme! :allright:

hier habe ich auch mal einen kleinen Code zusammengebastelt:

Code: Alles auswählen

NewList sVokal.s() 
NewList sKonsonant.s()
NewList sSilbe.s()

; Vokale
AddElement(sVokal()):sVokal()="a"
AddElement(sVokal()):sVokal()="e"
AddElement(sVokal()):sVokal()="i"
AddElement(sVokal()):sVokal()="o"
AddElement(sVokal()):sVokal()="u"

; Konsonanten
AddElement(sKonsonant()):sKonsonant()="b"
AddElement(sKonsonant()):sKonsonant()="c"
AddElement(sKonsonant()):sKonsonant()="d"
AddElement(sKonsonant()):sKonsonant()="f"
AddElement(sKonsonant()):sKonsonant()="g"
AddElement(sKonsonant()):sKonsonant()="h"
AddElement(sKonsonant()):sKonsonant()="j"
AddElement(sKonsonant()):sKonsonant()="k"
AddElement(sKonsonant()):sKonsonant()="l"
AddElement(sKonsonant()):sKonsonant()="m"
AddElement(sKonsonant()):sKonsonant()="n"
AddElement(sKonsonant()):sKonsonant()="p"
AddElement(sKonsonant()):sKonsonant()="q"
AddElement(sKonsonant()):sKonsonant()="r"
AddElement(sKonsonant()):sKonsonant()="s"
AddElement(sKonsonant()):sKonsonant()="t"
AddElement(sKonsonant()):sKonsonant()="v"
AddElement(sKonsonant()):sKonsonant()="w"
AddElement(sKonsonant()):sKonsonant()="x"
AddElement(sKonsonant()):sKonsonant()="y"
AddElement(sKonsonant()):sKonsonant()="z"

; Jetzt jeden Konsonanten mit einem Vokal zu einer Silbe verknüpfen

ResetList(sKonsonant())

While NextElement(sKonsonant())
  ResetList(sVokal())
  While NextElement(sVokal())
    AddElement(sSilbe()):sSilbe()= sKonsonant() + sVokal()
  Wend
Wend

; Maximale Anzahl Silben ermitteln
MaxCount.l=CountList(sSilbe())

For intU = 1 To 10 ; 10 Namen im Debugger ausgeben

  sName.s = ""
  For intI = 1 To 4 ; Jeder Name besteht aus 4 Silben
    SelectElement(sSilbe(),Random(MaxCount))
    sName = sName + sSilbe()
  Next 

  ; Namen ausgeben (1. Buchstabe groß)
  Debug UCase(Left(sName,1)) + Mid(sName, 2, Len(sName)-1)
  
Next
to be continued...

Grüße ... Kiffi

Verfasst: 13.11.2004 18:54
von Kaeru Gaman
schon echt schick :D

a) wie wäre es , per zufall (oder ähnlich) einen teil der silben auf konsonant enden zu lassen ? oder ohne konsonant anfangen ?
... schau dir nochmal MLK's Beispiel bezüglich Doppelvokal + Doppelkonsonant durch...

b) eine alternative methode zur listen erstellung wäre eine schleife mit READ und unten dann DATA (wenn man sowas mag, deine lösung ist durchaus ok)

Verfasst: 13.11.2004 19:17
von Kiffi
> eine alternative methode zur listen erstellung wäre eine schleife
> mit READ und unten dann DATA

danke für den Tipp! Habe mir schon gedacht, daß es sowas in Purebasic
geben muss, habe ich aber auf die Schnelle nicht gefunden.

So sieht das schon etwas übersichtlicher aus.

Mit dem Doppelkonsonanten muss ich noch ein wenig knobeln.

Grüße ... Kiffi

Namen-Maschine

Verfasst: 14.11.2004 03:48
von Hroudtwolf
Entfernt. Out of date.