String als Java Code verwenden?

Hallo,
mich würde interessieren ob es möglich ist, einen String als Java Code zu verwenden?

Weil ich habe recht oft die Situation dass ich von einem bestimmten Pixel den Farbwert einlese und wenn der bestimmte Kriterien erfüllt, tue A, ansonsten B.

Jetzt wäre es natürlich äusserst praktisch wenn ich in einer Tabelle oder Ähnlichem (ich denke da bspw. an eine .ods Datei)
eben die x und die y komponente eines pixels hinterlegen könnte sowie auch die Bedingung die es erf+llen sollte.
Also sowas wie „r>200&&g>150&&b<130“.

Und wenn ich dann so meinen Codeblock hätte wie


        Color color = bot.getPixelColor(abgelesenerxWert, abgeleseneryWert);

        int g = color.getGreen();
        int r = color.getRed();
        int b = color.getBlue();
        return (abgeleseneBedingung);

das ich da halt die eingangs als string gegebene bedingung irgendwie einbauen könnte.

Weil, auf gut deutsch geagt, wie soll ich mir sowas wie r>200&&g>150&&b<130 sinnvoll in einer tabelle speichern?
ich kann mir die 3 zahlen 200,150,130 einspeichern, aber alleine schon das > oder < einzuspeichern ist schwer.
Fällt mir nichts sinnhaftes ein,w as nich zig zeilen verbrauchen würde.

da wöre es recht nice, die ganze bedingung als string speichern zu können und dann später wieder irgenwie als bollschen ausdruck interpretieren lassen zu können.

geht sowas irgendwie?

Das kann man doch problemlos modellieren. Du hast 3 Mal:
a) einen Operator
b) einen Wert
Das kann man also sowohl als String kodiert ablegen und dann auch auslesen zum auswerten.

Operator mit Wert könnte man Check oder so nennen. Der hat halt wie oben gesagt einen operator und ein value. Und bei der check(number) Methode wird dann halt je nach Operator was bestimmtes gemacht.
Serialisiert werden als String könnte es einfach aneinander hängend. Also z,B. „<200“ oder „>150“.
Deserialisieren ist einfach: Erstes Zeichen auswerten um den Operator zu setzen, dann den Rest parsen zum wert.

Bei dem eigentlichen ColorCheck hast Du dann die 3 Check werte für die drei Farbteile. Und eine check Methode, die z.B. eine Color als Parameter bekommt. Serialisiert wird das einfach hintereinander, getrennt mit : oder so: „<200:>100:<100“, deserialisiert ist dann ein split auf das Trennzeichen um dann die drei Check Instanzen zu parsen.

Ansonsten gibt es natürlich auch die Möglichkeit, eine Script-Engine einzubinden. Aber das ist deutlich komplexer und für so eine einfache Sache schlicht overkill.

1 Like

Muss ich mal bei Gelegenheit so ausprobieren.

Dank deines Codes weiter oben habe ich auch so nebenbei mitgekriegt wie ich mir eine Art Popup bauen kann :slight_smile:

Eine allgemeine Antwort zu „Wie man einen String als Code verwendet“ hatte ich mal auf Stack Overflow geschrieben. Eine Bibliothek die das anbietet ist Janino by janino-compiler . Die hat sogar eine Klasse „ExpressionEvaluator“ um die ganze Maschinerie drumgewickelt, mit der solche Sachen herrlich einfach sind:

import org.codehaus.janino.ExpressionEvaluator;

public class Temp
{
    public static void main(String[] args) throws Exception
    {
        ExpressionEvaluator ee = new ExpressionEvaluator();
        ee.setParameters(new String[]
          { "r", "g", "b" }, new Class[]
          { int.class, int.class, int.class });
        ee.setExpressionType(boolean.class);

        ee.cook("r>100 && g<50 && b > 90");

        int r = 99;
        int g = 40;
        int b = 100;
        
        // Gibt "false" aus
        System.out.println(ee.evaluate(new Object[]{ r, g, b }));

        r = 101;

        // Gibt "true" aus
        System.out.println(ee.evaluate(new Object[]{ r, g, b }));

    }
}

Aber das ist hier tatsächlich overkill.
So gesehen ist die Frage wohl wieder ein „XY-Problem“.

Deswegen ganz vorne:

den Farbwert einlese und wenn der bestimmte Kriterien erfüllt,

Was sind das für „Kriterien“? (Lass’ mich raten: Er soll einen bestimmten Farbton haben, oder einer gegebenen Farbe „ähnlich“ sein. Ist das richtig?)

in dem Fall dürfte HSI besser als RGB sein

hand, mogel

Ja. So langsam fühle ich mich wie einer dieser Fernseh-Köche: „Ich hab’ das schonmal vorbereitet…“: image processing - Java colour detection - Stack Overflow

Marco Mälzer hier, zuerst formulieren wir die Frage etwas um, immer darauf achten die Frage genau zu formulieren, gerne könnt ihr mit Satzzeichen und Satzbau nach Belieben würzen. Wenn wir damit fertig sind, schieben wir die Frage für ca. 1 bis 2 Stunden nach Stackoverflow und lassen sie dort leicht köcheln. Ich hab das schonmal vorbereitet…

Du liegst hier aber unerwartet nahe an der Antwort :open_mouth:

Klar, ich gucke mir vorab an, welche Farbe (rgb werte) ein bestimmtes Pixel hat und insofern im laufenden Spiel dieses Pixels wieder geprüft wird und bspw. jeder der 3 Farbwete so max. ±5 vom idealwert entfernt sind, passt es. Wobei ich da je nahc Situation mals strenger und mal weniger streng bin.

Manchmal reicht es wenn bspw. blau>250 und der Rest „ziemlich klein“ (also grün und rot<80) sind.
Manchmal auch Anderes.

Weil ich halt in fast jeder Spilesituation ein „prüfpixel“ auserkore anhanddessen immer mal wieder geprüft wird „Sind wir noch auf dem alten Bildschirm aka Prüfpixel hat so grob den erwarteten Farbwert, oder wurde ein neuer Bildschirm geladen und das Prüfpüixel hat völlig andere Werte“.

Will mich damit, bisher auch recht erfolgreich, drum drücken irgendwleche Bilder gegeneinander vergleichen zu müssen :slight_smile:

Und für jedes Level oder jede Situation im Spiel lässt sich das Prüfszenario halt zusammenfassen als x,y wert des Prüfpixels und was dessen rgb wert halt erfüllen muss.

was man wieder in eienr externen Datei/Datenbank gut abspeichern könnte,
in jeder Zeile erst das bestreffende Level/spielsituation, prüfpixelposition, prüfpixelbedingung.

Damit ich das halt nicht in 20 java Klassen hardcoden muss und immer suchen muss wo ich da was ändern muss.

Edit: Und die Robot Klasse in Java , die für mich Farbprüfungen maht und Klicks durchführt, verwendet halt RGB.