Startseite
23. Juli 2014, 15:57:09 *
Willkommen Gast. Bitte einloggen oder registrieren.
Haben Sie Ihre Aktivierungs E-Mail übersehen?

Einloggen mit Benutzername, Passwort und Sitzungslänge
News: Alle Final-Fanatsy-Beiträge befinden sich nun in einer Unterkategorie des Spieleforums.
 
   Übersicht   Hilfe Suche Kalender Einloggen Registrieren  
Seiten: [1]   Nach unten
  Drucken  
Autor Thema: Synonyme erkennen  (Gelesen 1350 mal)
fire
Paladin
***
Offline Offline

Beiträge: 223



« am: 25. Mai 2007, 18:54:36 »

Hallo, ich hab mal wieder ne frage:
Wie kann man in FB synonyme erkennen, damit sie alle gleich behandelt werden.
Also wenn ich "nehme"/"nimm"/....usw. eingebe soll das programm erkennen dass damit das selbe gemeint ist.

Bisher hab ich das alles so gelöst:
if instr(txt$,"nimm")<>0 then txt$="nehme"+mid$(txt$,instr(txt$,"nimm"+4))
...
das funktioniert zwar, ist aber total umständig.

Bisher hab ich so einn ding noch nicht gebraucht, daher tue ich mich gerade etwas schwer den richtigen lösungs ansatz zu finden.
Gespeichert

Pi=3,1415926535897932384626433832795028841971693993...
Jojo
Moderator
Ultimo Lv.9
*******
Offline Offline

Beiträge: 7.354


BBQ?


WWW
« Antworten #1 am: 25. Mai 2007, 19:24:08 »

Eine Idee wäre sicherlich, eine synonym-liste in form einer Textdatei anzulegen. Beispiel einer mögliche Datei:
Code:

/Hallo/Hi/Hallöle/Tach/Yo/
/Tschüss/Tschö/Tschüß/Cya/
...

diese liste könntest du in ein array einlesen und per instr() überprüfen. die wirst dich sicher über die schrägstriche am anfang und ende des textes wundern. das folgende beispiel ist natürlich "dreckig" programmiert, aber es ist die schnellste methode!
Code:

begriff1 = "hallo"
begriff1 = "yo"
if instr(lcase(liste), "/" + lcase(begriff1) + "/") and instr(lcase(liste), "/" + lcase(begriff2) + "/") then 'ist synonym

ich hoffe, ich konnte helfen Smiley
Gespeichert

Dummes Posting!Besucht doch mal die Saga-Games-Homepage!
"Man läuft rum, trifft Leute, kämpft...Ein Rollenspiel!"
"Werden Sie auch zum Pudding!"
"Blau statt weiß"
fire
Paladin
***
Offline Offline

Beiträge: 223



« Antworten #2 am: 25. Mai 2007, 20:22:05 »

naja nicht ganz.

Ich hab mal wieder vor ein neues Textadventure zu proggen, aber diesmal wollte ich das so machen das man anstatt 'nehme Buch' auch 'nimm das Buch' oder 'verdammt noch mal, jetzt nimm doch endlich dieses Scheiß Buch!' usw. eingeben kann.
Daher müsste man den String von unwichtigen Sachen reinigen und anschließend das Synonym herausfinden, also heraus finden zu welcher kategorie es gehört(nehmen, geben, reden...) und anschließend das Synonym zusammen mit dem Objekt übergeben um es weiterzuverarbeiten.
Also:
eingabe:
'Nimm dieses Blöde Buch oder es gibt ärger'

Filtern:
Kategorie='nehmen'
Objekt='Buch'

Verarbeiten:
if kategorie='nehmen' then
if objekt='buch' then ................
if objekt="brief" then ....
end if
...........

Also stellt sich mir nun die Frage wie ich das alles Filtere.
Das Synonym (die Kategorie) kann ich ja einigermaßen gut filtern, aber wie soll ich das Objekt von dem unwichtigen Rest trennen?
Gespeichert

Pi=3,1415926535897932384626433832795028841971693993...
Jojo
Moderator
Ultimo Lv.9
*******
Offline Offline

Beiträge: 7.354


BBQ?


WWW
« Antworten #3 am: 25. Mai 2007, 22:29:54 »

ich würde mir eine funtkion dazu schreiben, die nur nach relevaten wörtern sucht:

Code:

declare function istDrin(text as string, wort as string) as integer 'Wort ist ein STANDARD-AUSDRUCK von dir, nicht der des Spielers. wenn also nach einer Lauf-Aktion gefragt wird, nimm als wort z.B. "geh" (muss in der liste sein!)
screen 13
Const Satzzeichen = " ,.;!?-_""'/\<>()[]{}^#*|°§$%&=+´`"
dim shared listen(1 to 4) as string
'in listen musst du jetzt eine liste wie meine einlesen, der aufbau pro zeile ist also z.B: /geh/lauf/renn/
listen(1) = "/gehen/geh/lauf/renn/"
listen(2) = "/rufen/rufe/sage/sag/flüstere/"
listen(3) = "/nehmen/nehme/nimm/"
listen(4) = "/nicht/nöt/net/"

dim as string text = "geh heim und nimm eine taschenlampe. rufe dabei zu hause an."
print "gehen: " & istDrin(text, "gehen")
print "rufen: " & istDrin(text, "rufen")
print "singen: " & istDrin(text, "singen")
sleep

function istDrin(text as string, wort as string) as integer 'Wort ist ein STANDARD-AUSDRUCK von dir, nicht der des Spielers. wenn also nach einer Lauf-Aktion gefragt wird, nimm als wort z.B. "geh" (muss in der liste sein!)
    dim as integer i, j, gefunden = 0, start
    dim as string gefwort
    'der folgende schritt wird alle "satzzeichen" in schrägstriche umwandeln
    for i = 1 to len(text)
        if instr(Satzzeichen, mid(text, i, 1)) then mid(text, i, 1) = "/"
    next i
    text = "/" + lcase(text) + "/"
    for i = lbound(listen) to ubound(listen)
        if instr(lcase(listen(i)), "/" + lcase(wort) + "/") then 'richtige liste!
            'Okay, original-String nach einem ersatzwort durchsuchen
            start = 1
            for j = 1 to len(text)
                if mid(text, j, 1) = "/" then 'wort zu ende
                    gefwort = mid(text, start, j - start) + "/"
                    if instr(lcase(listen(i)), gefwort) then
                        gefunden = 1
                    end if
                    start = j
                end if
            next

        end if
    next i
    return gefunden
end function



tipp: immer noch auf "nicht" prüfen, damit klar ist, dass der spieler nicht das gegenteil meint!
Gespeichert

Dummes Posting!Besucht doch mal die Saga-Games-Homepage!
"Man läuft rum, trifft Leute, kämpft...Ein Rollenspiel!"
"Werden Sie auch zum Pudding!"
"Blau statt weiß"
Jiko
Administrator
Ultimo Lv.10
*********
Offline Offline

Beiträge: 9.237



WWW
« Antworten #4 am: 25. Mai 2007, 23:52:31 »

Also soll es auch mit:
"nehmen buch" funktionieren? Interessant - ist mal interessant... könnte aber ziemlich komplex sein mit so manchen Wortvariationen - da wünsche ich dann mal viel Glück  Wink
Gespeichert

Jojo
Moderator
Ultimo Lv.9
*******
Offline Offline

Beiträge: 7.354


BBQ?


WWW
« Antworten #5 am: 26. Mai 2007, 00:18:07 »

solange man eine große liste hat, geht's gut Wink
Gespeichert

Dummes Posting!Besucht doch mal die Saga-Games-Homepage!
"Man läuft rum, trifft Leute, kämpft...Ein Rollenspiel!"
"Werden Sie auch zum Pudding!"
"Blau statt weiß"
fire
Paladin
***
Offline Offline

Beiträge: 223



« Antworten #6 am: 26. Mai 2007, 07:58:21 »

also so weit war ich auch schon, aber die objekte wie buch/brief/... bereiten mir probleme.
Meine einzige Idee wäre auch diese in eine Liste zu packen, aber mit der idee kann ich mich nicht so richtig anfreunden.
Naja, aber wenns sonst nicht möglich ist würde ich das so machen, dass erst alle kategorien wie nehme/nimm im Text gesucht werden und in einem String gespeichert werden, und anschließend die Objekte wie Buch/Brief im Text gesucht werden und in einem weiteren String gespeichert wird. Danach würde ich das ganze einfach abfragen.

So das mit der Liste der Kategorien ist bereits beschlossenene Sachen, ich muss nur überlegen ob ich das so:
Dim liste(100)
liste(1)="/nehme/nimm...."
liste(2)="/rede/spreche/..."
...

oder so mache:

dim liste(10,100)
liste (0,0)="nehme"
liste (0,1)="nimm"
...
liste (1,0)="rede"
liste (1,1)="spreche"
...


Des Weiteren fragt sich ob ich die Kategorien fest eincoden soll oder mit einer Textdatei einlese.



so viele fragen.
Ich hoffe ihr könnt mir trotzdem helfen.
Gespeichert

Pi=3,1415926535897932384626433832795028841971693993...
Jojo
Moderator
Ultimo Lv.9
*******
Offline Offline

Beiträge: 7.354


BBQ?


WWW
« Antworten #7 am: 26. Mai 2007, 13:12:25 »

also textdatei wäre sehr zu empfehlen Wink ich habe die nur als beispiele direkt in den code eingefügt.
außerdem habe ich die "/wort/wort" variante statt 2-dimensionale arrays verwendet, weil du einen string per instr() viel schneller durchsuchen kannst als ein array von 1 bis 100 durchlaufen zu lassen Wink
Gespeichert

Dummes Posting!Besucht doch mal die Saga-Games-Homepage!
"Man läuft rum, trifft Leute, kämpft...Ein Rollenspiel!"
"Werden Sie auch zum Pudding!"
"Blau statt weiß"
Seiten: [1]   Nach oben
  Drucken  
 
Gehe zu:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS