Laden...

[erledigt] Bericht auslesen

Erstellt von MaXeM vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.792 Views
M
MaXeM Themenstarter:in
198 Beiträge seit 2007
vor 17 Jahren
[erledigt] Bericht auslesen

Hallo, habe ein kleines Problem an dem ich seit ein paar Tagen nicht weiterkomme, es geht darum einen Bericht auszulesen, genauer gesagt ein Spionagebericht in dem Browsergame Ogame.

Grund: Ich möchte die Berichte einlesen, die erhaltenen Werte in eine Datenbank schreiben und diese dann halt nach verschiedenen Kriterien ordnen können.

Beispielbericht:
Rohstoffe auf Name[1:111:11] am 01-11 11:11:11
Metall: 11.111 Kristall: 111.111
Deuterium: 1.111.111 Energie: 1111
Flotten
Schwerer Jäger 11
Verteidigung
Gebäude
Deuteriumsynthetisierer 1 Solarkraftwerk 1
Forschung
Spionagetechnik 2 Computertechnik 1
Waffentechnik 7 Schildtechnik 7
Raumschiffpanzerung 9 Energietechnik 6
Hyperraumtechnik 6 Verbrennungstriebwerk 6
Impulstriebwerk 4 Hyperraumantrieb 6
Lasertechnik 11 Ionentechnik 4
Chance auf Spionageabwehr:0%

Alle Berichte haben folgendes gemeinsam:
"Rohstoffe auf NAME[GALA:SONNENSYS:PLANET] am MONAT-TAG STUNDE:MINUTE:SEKUNDE
Metall: WERT Kristall: WERT
Deuterium: WERT Energie: WERT"
Der mittlere Teil ist sehr variabel, der Bericht endet aber auf jeden Fall mit:
"Chance auf Spionageabwehr: X%"

Was man nun in der Mitte sieht hängt von ein paar, für die Programmierung unwichtigen Faktoren ab. Die im Beispielbericht Fettgedruckten Wörter sind Einteilungen, alle können sichtbar sein, ebenso aber auch gar keiner, jedoch immer nur in dieser Reihenfolge, wenn der Gebäudeteil sichtbar ist, ist also auch der Flotten und der Verteidigungsteil sichtbar aber nicht unbedingt der Forschungsteil.

So viel erstmal zu dem Bericht, was ich nun auslesen will:
Den Namen, die Koordinaten(Gala:Sonnensys:Planet), das Datum und die Uhrzeit sowie alle Rohstoffe (Metall, Kristall, Deuterium, Energie), die gesamte Flotte, die gesamte Verteidigung, alle Gebäude (sofern vorhanden).

(Das Programm besteht bis jetzt aus einer multiline Textbox und einen Button der halt die Einlesung ausführt)

Mein erster Ansatz war: Da man unbegrenzt viele Berichte auf einmal einlesen können soll habe ich erstmal per String.Split() beim % gesplittet(Es werden z. B. 3 Berichte in dieser Form eingelesen: Be1Be2Be3, nach dem Stringsplit habe ich nun String[0] = Be1, String[1] = Be2, String[3] = Be3).
Das klappt einwandfrei, auch die einzelnen Berichte in ihre Einteilungen aufsplitten klappt, da es ja eine bestimmte Reihenfolge hat (oder halt nicht vorhanden ist).

Nur ist mein großes Problem: Die Einteilungen (Flotten, Verteidigung, Gebäude) sind innerhalb nur bist zu einem bestimmten grad fix, z. B. bei den Gebäuden: Ist eine Metallmine vorhanden ist dieses das erste Gebäude, ist dazu noch eine Kristallmine vorhanden ist sie das zweite, der Deuteriumsynthesizer der dritte usw. ist jetzt aber z. B. weder eine Kristallmine noch eine Metallmine vorhanden dafür aber ein Deuteriumsynthesizer so steht dieser an Position 1 (Die Kristall / Metallmine wird nicht aufgeführt), bei den Minen ist es im Grunde nicht so das Problem ist da jeder Spieler recht früh diese 3 Gebäude hat, dafür aber bei den Flotten / Verteidigung da dies hier sehr variabel ist.

Meine Frage ist jetzt wie liest man das am Besten aus?
Ich habe beim Buttonklick erst einmal alle Berichte getrent in einen Array gesteckt, dann jedes Element dieses Arrays in 5 Teile gesplittet(Header, Flotte, Verteidigung, Gebäude, Forschung) und in einen Temparray geschrieben, jedes Element des Temparrays wird nun einer anderen Funktion übergeben, welche den Teil auswertet und als Rückgabewert einen Array mit den Werten hat, beim Header funktioniert es auch da dieses wie bereits gesagt statisch ist.

Bei allen anderen Teilen müsste ich etwas in der Art machen das Text bis zum Anfang einer Zahl gelesen wird, dem Text ensprechent die nun folgende Zahl einer Variable zugeordnet wird (Beispiel: Text = "Metallmine ", Zahl = 17 -> int Metallmine = Zahl) dann wird der bisher eingelesene Text + Zahl gelöscht und es geht von vorne los bis das temparrayelement zu ende ist.

Nur denke(und hoffe) ich mal das es dort eine sehr viel einfachere(und vor allem auch schnellere) Lösung gibt.

Ich hoffe es war zumindest etwas verständlich was überhaupt mein Problem ist oO

Edit: Nach langem rumprobieren mit RegEx geschafft >_<

B
1.529 Beiträge seit 2006
vor 17 Jahren

Hast du schon mal die Erweiterung FoxGame für den FireFox ausprobiert? Die kann das und noch mehr.

M
MaXeM Themenstarter:in
198 Beiträge seit 2007
vor 17 Jahren

Es gibt z. B. auch oScan-Online.de, aber mir geht es nicht nur um die Funktion an sich (ist halt nützlich :p) sondern auch um bisschen praxis mit C# + Datenbanken zu bekommen ;>

M
MaXeM Themenstarter:in
198 Beiträge seit 2007
vor 17 Jahren

hab jetzt nen bisschen mit RegEx rumgespielt und zum auslesen des Headers bin ich auf das hier gekommen:

([A-Za-z0-9\s]+)((Mond))? ?[([0-9]+):([0-9]+):([0-9]+)] am ([0-1][0-9])-([0-3][0-9]) ([0-2][0-9]):([0-5][0-9]):([0-5][0-9])\nMetall:\t([0-9.]+) \tKristall:\t([0-9.]+)\nDeuterium:\t([0-9.]+) \tEnergie:\t([0-9.]+)\n

Liest halt Namen aus, ggf ob es ein Mond ist, die Koords, das Datum, die vorhandenen Ressourcen (denke / hoffe mal das es da ne einfachere Form gibt _).

Jetzt komme ich aber irgendwie nicht mehr weiter weil der rest wie gesagt nur halbstatisch ist >_<

O
778 Beiträge seit 2007
vor 17 Jahren
  1. Kürzel machen RegexPatterns oft übersichtlicher, also statt [A-Za-z] \w, statt [0-9] \d usw. (eine ziemliche nützliche Übersicht findest du z.B. auf codeproject.com)

  2. Du schreibst das doch eh in eine Datenbank, ich weiß jetzt nicht wie dein DatenbankDesign aussieht, aber du könntest ja den Spalten die gleichen Namen geben, wie den Gebäuden/Forschungen/Schiffen etc. Auf alle Fälle kannst du es dir zu Nutz machen, dass zwische den Namen und dem Wert immer genau ein Zeichen liegt und das dann mit \b(?<Name>\w.+) (?<Wert>\d.+)\b auslesen. Daraus kannst du dann in ein Dictionary schreiben und den Rest kriegst du auch so hin 🙂