Generator für Fantasienamen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Generator für Fantasienamen

Beitrag 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
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag 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.
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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
Zuletzt geändert von MLK am 13.11.2004 18:26, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag 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 :-)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Namen-Maschine

Beitrag von Hroudtwolf »

Entfernt. Out of date.
Zuletzt geändert von Hroudtwolf am 05.03.2008 02:28, insgesamt 1-mal geändert.
Antworten