Einen Nutzer eigene Bedingungen erstellen lassen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von Sunny »

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. ^^
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von man-in-black »

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 :D
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von Sicro »

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.
Bild
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
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von Sunny »

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?
Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von WPö »

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ö
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.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von Danilo »

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:

Code: Alles auswählen

Wenn [ Meine HP ]  [ > ]  [ Gegner HP ]

+ [ und / oder]


dann [ Greife an ]
[...] 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.

Code: Alles auswählen

case '>' : If Val( MeineMap("Meine HP") ) > Val( GegnerMap("Gegner HP") ) : ProcedureReturn 1 ...
Am besten die möglichen Auswahlstrings in eine MAP machen und diese auch den Comboboxen zur Auswahl hinzufügen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von Sunny »

@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.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von Danilo »

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.
Kannst Du ja mit einer Art eigenem Auswahl-/Popup-Menu machen, statt mit Comboboxen.

Oder so wie bei Scratch ;)
(Visuelles Programmieren mit Logo um Kinder anzulernen)

Bild

- 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
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von Sunny »

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.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Einen Nutzer eigene Bedingungen erstellen lassen

Beitrag von Danilo »

Sunny hat geschrieben:Auf den ersten blick würde ich mal sagen, das mir die operaturen die meisten probleme bereiten werdn.
Bei Evaluate() - Expression Parser findest Du schon mal die Operatoren:
+, -, *, /, % (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
Antworten