Einen Nutzer eigene Bedingungen erstellen lassen
Einen Nutzer eigene Bedingungen erstellen lassen
Also erstmal zur Erklärung vorne Weg...
Ich hatte gestern eine kleine Eingebung und daraus ist nun eine Idee für ein Spiel entstanden.
Das soll ein kleines RPG-Strategie-Spiel werden (weil es ja nicht sowieso schon genug davon gibt ^^).
OK... Also der Spieler soll seine Aktionen planen, bevor der Kampf gegen einen Gegner überhaupt angefangen hat.
Allerdings hapert es jetzt schon an der Umsetzung dieses Prinzips.
Als beispiel hat der Spieler einige Auswahlmöglichkeiten.
z.B.:
Wenn
[optional x % von]
Meine HP
Meine MP
Mein Level
Gegner HP
Gegner MP
Gegner Level
[<, >, =, <=, >=, !=]
[optional x % von]
Meine HP
Meine MP
Mein Level
Gegner HP
Gegner MP
Gegner Level
[und / oder]
(weitere auswahlöglichkeiten, wenn "und" oder "oder" gewählt wurde.)
dann
Heile mich
Flüchte
Greife an
...
Wie könnte ich das jetzt in einem Programm realisieren?
Ich hoffe, dass ich mich halbwegs klar ausgedrückt habe und ihr versteht, was ich meine.
Sollte das nicht der fall sein, fragt einfach nochmal nach, dann versuche ich das ein wenig genauer zu erklären. ^^
Ich hatte gestern eine kleine Eingebung und daraus ist nun eine Idee für ein Spiel entstanden.
Das soll ein kleines RPG-Strategie-Spiel werden (weil es ja nicht sowieso schon genug davon gibt ^^).
OK... Also der Spieler soll seine Aktionen planen, bevor der Kampf gegen einen Gegner überhaupt angefangen hat.
Allerdings hapert es jetzt schon an der Umsetzung dieses Prinzips.
Als beispiel hat der Spieler einige Auswahlmöglichkeiten.
z.B.:
Wenn
[optional x % von]
Meine HP
Meine MP
Mein Level
Gegner HP
Gegner MP
Gegner Level
[<, >, =, <=, >=, !=]
[optional x % von]
Meine HP
Meine MP
Mein Level
Gegner HP
Gegner MP
Gegner Level
[und / oder]
(weitere auswahlöglichkeiten, wenn "und" oder "oder" gewählt wurde.)
dann
Heile mich
Flüchte
Greife an
...
Wie könnte ich das jetzt in einem Programm realisieren?
Ich hoffe, dass ich mich halbwegs klar ausgedrückt habe und ihr versteht, was ich meine.
Sollte das nicht der fall sein, fragt einfach nochmal nach, dann versuche ich das ein wenig genauer zu erklären. ^^
- man-in-black
- Beiträge: 362
- Registriert: 21.08.2006 17:39
Re: Einen Nutzer eigene Bedingungen erstellen lassen
moin,
hab selbst schonmal damit rumgespielt. (Bloß nicht vom Spieler definieren lassen, sondern für den Worldeditor)
Das einfachste wäre, wenn du einen kleinen Interpreter schreibst, also deine Anweisungen
in einer Scriptsprache zusammenhaust. Und dann vordefinierte Aktionen ausführen lässt (evt mit Parametern).
Wenn der Spieler nicht selbst coden soll, dann kannst du auch blanko handlungsstränge vorgeben, die der spieler dann
mit Bedingungen und Reaktionen füllen kann. (zB kleine Bilderchen in Boxen für "Bedingung der handlung" und "reaktion" ziehen)
wenn man will, kann man das ganze dann noch verschachteln...
Da ich mir nicht ganz sicher bin, wo es bei dir gedanklich hapert mal n Beispiel:
1) "WENN aua DANN zurückhauen"
2) in "WENN aua" und "DANN zurückhauen" aufsplitten (Bedingung, Reaktion). Die schlüsselwörter "Wenn" "dann" fliegen nat auch raus.
3) "Wenn aua" in alle Einzelteile aufsplitten -> "aua"
3.1) select einzelteil : case "aua" : if isAua() : erfüllt+1 : endif : ........ :endselect
4) abgleichen, ob alle Bedingungen erfüllt wurden (erfüllt=anzahl(einzelteile)) --> wenn ja, dann 5) sonst 6)
5) "dann zurückhauen" aufsplitten
5.1) select einzelteil ...... zurückhauen()
6) gegner schlägt zurück, spieler tot
hab selbst schonmal damit rumgespielt. (Bloß nicht vom Spieler definieren lassen, sondern für den Worldeditor)
Das einfachste wäre, wenn du einen kleinen Interpreter schreibst, also deine Anweisungen
in einer Scriptsprache zusammenhaust. Und dann vordefinierte Aktionen ausführen lässt (evt mit Parametern).
Wenn der Spieler nicht selbst coden soll, dann kannst du auch blanko handlungsstränge vorgeben, die der spieler dann
mit Bedingungen und Reaktionen füllen kann. (zB kleine Bilderchen in Boxen für "Bedingung der handlung" und "reaktion" ziehen)
wenn man will, kann man das ganze dann noch verschachteln...
Da ich mir nicht ganz sicher bin, wo es bei dir gedanklich hapert mal n Beispiel:
1) "WENN aua DANN zurückhauen"
2) in "WENN aua" und "DANN zurückhauen" aufsplitten (Bedingung, Reaktion). Die schlüsselwörter "Wenn" "dann" fliegen nat auch raus.
3) "Wenn aua" in alle Einzelteile aufsplitten -> "aua"
3.1) select einzelteil : case "aua" : if isAua() : erfüllt+1 : endif : ........ :endselect
4) abgleichen, ob alle Bedingungen erfüllt wurden (erfüllt=anzahl(einzelteile)) --> wenn ja, dann 5) sonst 6)
5) "dann zurückhauen" aufsplitten
5.1) select einzelteil ...... zurückhauen()
6) gegner schlägt zurück, spieler tot

Re: Einen Nutzer eigene Bedingungen erstellen lassen
Erstelle eine Liste mit den Aktionen und jeweils eine Liste für die Bedingungen, die du auf die Einträge der ersten Liste verknüpfst:
Code: Alles auswählen
Structure BedingungEintragStruc
; Wenn
Variable.s ; Meine HP
Operator.s ; <
Wert.i ; 10%
EndStructure
Structure AktionEintragStruc
Aktion.s ; Dann [Aktion]
List Bedingungen.BedingungEintragStruc()
EndStructure
NewList AktionenListe.AktionEintragStruc()
AddElement(AktionenListe())
AddElement(AktionenListe()\Bedingungen())
AktionenListe()\Bedingungen()\Variable = "Meine HP"
AktionenListe()\Bedingungen()\Operator = "<"
AktionenListe()\Bedingungen()\Wert = 20 ;%
; weitere Bedingungen
; AddElement(AktionenListe()\Bedingungen())
; ...
AktionenListe()\Aktion = "Heilen"
; weitere Aktionen
; AddElement(AktionenListe())
; AddElement(AktionenListe()\Bedingungen())
; ...
Zuletzt geändert von Sicro am 13.11.2012 16:57, insgesamt 3-mal geändert.

Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Re: Einen Nutzer eigene Bedingungen erstellen lassen
Ich bedanke mich schonmal recht herzlich für eure Beiträge. Ich werde demnächst mal sehen, wie ich das am besten auf meinem Projekt umsetze. Sollte ich dann noch auf Probleme stoßen, werde ich mich nochmal melden.
Edit:
Ich konnte leider nocu nicht testen, weil ich noch auf der Arbeit bin allerdings, ist mir beim nochmaligen Überfliegen des beispielcodes folgender Gedanke gekommen. Normalerweise kann ich ja die einzelnen Listenelemente wie variablen behandeln und einfach in einer "If" anweisong vergleichen, allerdings stellt sich mir jetzt die Frage, wie ich den Operator da mit rein kriege. Sollte ich da für jeden einzelnen eine Separate If-Anweisung schreiben oder gibt es da eine bessere Möglichkeit?
Edit:
Ich konnte leider nocu nicht testen, weil ich noch auf der Arbeit bin allerdings, ist mir beim nochmaligen Überfliegen des beispielcodes folgender Gedanke gekommen. Normalerweise kann ich ja die einzelnen Listenelemente wie variablen behandeln und einfach in einer "If" anweisong vergleichen, allerdings stellt sich mir jetzt die Frage, wie ich den Operator da mit rein kriege. Sollte ich da für jeden einzelnen eine Separate If-Anweisung schreiben oder gibt es da eine bessere Möglichkeit?
Re: Einen Nutzer eigene Bedingungen erstellen lassen
Moin!
Es gibt selbstverständlich die Möglichkeit, echte Interpretierung der vom Nutzer zur Laufzeit eingegebenen Bedingungen auszurechnen. So etwas ähnliches wird ja auch von CRM-Systemen erledigt. Allerdings ist die Implementierung eines solchen Algorithmus ziemlich aufwendig und kann dazu führen, daß Du mit entsprechend weitläufigen Tests Wochen allein daran verbringst. Dafür ist diese Lösung das Optimum für Spieler, die sich in Logik ein wenig auskennen.
Solltest andererseits versucht sein, die Handlungsstränge fest vorzugeben, ist Dein Spiel ziemlich starr angelegt und verliert bald an Reiz. Das wirst Du kaum wollen.
Letzte Möglichkeit (wie ich sie sehe) ist Deine große verschachtelte Abfrageorgie. Davon nimm am besten gleich ganz schnell Abstand, denn die ist ebenfalls sehr starr in der Programmierung und erfordert von Dir Zillionen Zeilen Code. Beispiel:
1. Auswahl unter 20 Möglichkeiten (1. Operand)
2. Logische Verknüpfung aussuchen unter 3 Möglichkeiten
3. Auswahl unter 20 Möglichkeiten (2. Operand)
4. Auswahl unter 20 Möglichkeiten (Ergebnis)
ergibt 24000 mögliche Programmverläufe. Das sind wenigstens ebensoviele Zeilen Code. Schnell wird der Code schon sein, aber groß und extrem schwer zu warten.
Mein Rat: Beiß in den sauren Apfel und begebe Dich in den Zweikampf mit der Logik, damit zur Laufzeit interpretiert wird..
Gruß - WPö
Es gibt selbstverständlich die Möglichkeit, echte Interpretierung der vom Nutzer zur Laufzeit eingegebenen Bedingungen auszurechnen. So etwas ähnliches wird ja auch von CRM-Systemen erledigt. Allerdings ist die Implementierung eines solchen Algorithmus ziemlich aufwendig und kann dazu führen, daß Du mit entsprechend weitläufigen Tests Wochen allein daran verbringst. Dafür ist diese Lösung das Optimum für Spieler, die sich in Logik ein wenig auskennen.
Solltest andererseits versucht sein, die Handlungsstränge fest vorzugeben, ist Dein Spiel ziemlich starr angelegt und verliert bald an Reiz. Das wirst Du kaum wollen.
Letzte Möglichkeit (wie ich sie sehe) ist Deine große verschachtelte Abfrageorgie. Davon nimm am besten gleich ganz schnell Abstand, denn die ist ebenfalls sehr starr in der Programmierung und erfordert von Dir Zillionen Zeilen Code. Beispiel:
1. Auswahl unter 20 Möglichkeiten (1. Operand)
2. Logische Verknüpfung aussuchen unter 3 Möglichkeiten
3. Auswahl unter 20 Möglichkeiten (2. Operand)
4. Auswahl unter 20 Möglichkeiten (Ergebnis)
ergibt 24000 mögliche Programmverläufe. Das sind wenigstens ebensoviele Zeilen Code. Schnell wird der Code schon sein, aber groß und extrem schwer zu warten.
Mein Rat: Beiß in den sauren Apfel und begebe Dich in den Zweikampf mit der Logik, damit zur Laufzeit interpretiert wird..
Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Re: Einen Nutzer eigene Bedingungen erstellen lassen
Soll das als Script-Interpreter sein, oder visuell? Nach Deiner Beschreibung im 1. Beitrag dachte ich
eher an eine Auswahl mit Comboboxen in einem Dialogfenster:
[...] sind dabei Comboboxen zur Auswahl. Mit + [und/oder] fügst Du eine neue Auswahl-Zeile hinzu.
Die Auswertung hängt dann von den Werten ab. Irgendwo müssen die ja stehen, also machst Du
nur ein Select für den Operator und vergleichst so z.B.
Am besten die möglichen Auswahlstrings in eine MAP machen und diese auch den Comboboxen zur Auswahl hinzufügen.
eher an eine Auswahl mit Comboboxen in einem Dialogfenster:
Code: Alles auswählen
Wenn [ Meine HP ] [ > ] [ Gegner HP ]
+ [ und / oder]
dann [ Greife an ]
Die Auswertung hängt dann von den Werten ab. Irgendwo müssen die ja stehen, also machst Du
nur ein Select für den Operator und vergleichst so z.B.
Code: Alles auswählen
case '>' : If Val( MeineMap("Meine HP") ) > Val( GegnerMap("Gegner HP") ) : ProcedureReturn 1 ...
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: Einen Nutzer eigene Bedingungen erstellen lassen
@WPö
Bin mir nicht sicher, ob sich ein echtzeit-interpreter in pb realisieren lässt
@Danilo
So ungefähr hatte ich mir das gedacht, nur nicht mit richtigen Gadgets, sondern mit selbst gebasteltem zeugs, da ich für das game einen windowedscreen nutzen will.
Bin mir nicht sicher, ob sich ein echtzeit-interpreter in pb realisieren lässt
@Danilo
So ungefähr hatte ich mir das gedacht, nur nicht mit richtigen Gadgets, sondern mit selbst gebasteltem zeugs, da ich für das game einen windowedscreen nutzen will.
Re: Einen Nutzer eigene Bedingungen erstellen lassen
Kannst Du ja mit einer Art eigenem Auswahl-/Popup-Menu machen, statt mit Comboboxen.Sunny hat geschrieben:@Danilo
So ungefähr hatte ich mir das gedacht, nur nicht mit richtigen Gadgets, sondern mit selbst gebasteltem zeugs, da ich für das game einen windowedscreen nutzen will.
Oder so wie bei Scratch

(Visuelles Programmieren mit Logo um Kinder anzulernen)

- Scratch: a programming language for everyone
Zum auswerten von mathematischen Ausdrücken könntest Du vielleicht EvaluateExpression.zip verwenden.
Damit kannst Du z.B. das Ergebnis für "12 > 17 And 5 = 5" bekommen, wenn Du "Meine_HP > Gegner_HP und Mein_Level = Gegner_Level" in Zahlen übersetzt (z.B. Werte aus Map holen).
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: Einen Nutzer eigene Bedingungen erstellen lassen
Das ist ein gutes Beispiel, ich hatte da immer den RPG-Maker im Hinterkopf. Da konnte man sich auch immer seine eigenen kleinen Scripts zurecht basteln. Am besten ich werd einfach mal drauf los Coden, wenn ich die Zeit dazu finde und dann werde ich ja sehen, auf was für Probleme ich dann noch stoße. Auf den ersten blick würde ich mal sagen, das mir die operaturen die meisten probleme bereiten werdn.
Re: Einen Nutzer eigene Bedingungen erstellen lassen
Bei Evaluate() - Expression Parser findest Du schon mal die Operatoren:Sunny hat geschrieben:Auf den ersten blick würde ich mal sagen, das mir die operaturen die meisten probleme bereiten werdn.
+, -, *, /, % (modulo), ^ (power of), <<, >>, =, <>, <, >, <=, =<, >=, =>, ( ) , &, |, !, ~, NOT, OR, AND, XOR
Sonst einfach fragen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck