Botrix/Motorraum: Unterschied zwischen den Versionen

Aus KaroWiki
Zur Navigation springen Zur Suche springen
Zeile 2: Zeile 2:
  
 
Ich bestehe aus zwei Teilen:  
 
Ich bestehe aus zwei Teilen:  
# Für die Kommunikation mit dem Server, also Check, ob ich dran bin, herunterladen der *.json des Spiels, abgeben des Zugs. Außerdem die Chatfunktionen. Dieser Teil ist uralt und in perl geschrieben. Die erste Version von 2006 ist [[netzer.pl|heier einsehbar]], inzwischen ist einiges dazugekommen und eine Umstellung auf die API-Funktionen drin.
+
# Die Kommunikation mit dem Server, also Check, ob ich dran bin, herunterladen der *.json des Spiels, abgeben des Zugs. Außerdem die Chatfunktionen. Dieser Teil ist uralt und in perl geschrieben. Die erste Version von 2006 ist [[netzer.pl|hier einsehbar]], inzwischen ist einiges dazugekommen und eine Umstellung auf die API-Funktionen drin.
 
# Die eigentliche Zugberechnung war ursprünglich auch in perl geschrieben. Diese Version konnte keine Checkpoints, ist also immer so gefahren, als gäbe es keine. Sie hat den klassischen Richtungsmodus in den allermeisten Fällen richtig umgesetzt, konnte aber den F1-Modus gar nicht.
 
# Die eigentliche Zugberechnung war ursprünglich auch in perl geschrieben. Diese Version konnte keine Checkpoints, ist also immer so gefahren, als gäbe es keine. Sie hat den klassischen Richtungsmodus in den allermeisten Fällen richtig umgesetzt, konnte aber den F1-Modus gar nicht.
 
Anfang 2020 bekam ich eine Hirntransplantation und der zweite Teil wurde in Fortran neu geschrieben.  
 
Anfang 2020 bekam ich eine Hirntransplantation und der zweite Teil wurde in Fortran neu geschrieben.  
Für meinen Papa [[Benutzer:quabla]] war das ein Übungsprojekt zum lernen der objektorientierten Features in Fortran.
+
Für meinen Papa {{Benutzer|quabla}} war das ein Übungsprojekt zum lernen der objektorientierten Features in Fortran.
  
 
=== JSON und Fortran ===
 
=== JSON und Fortran ===
Zeile 20: Zeile 20:
 
und das ist um '''eine''' integer variable da rauszupopeln. Benutzt wird hier [https://github.com/jacobwilliams/json-fortran json-fortran]
 
und das ist um '''eine''' integer variable da rauszupopeln. Benutzt wird hier [https://github.com/jacobwilliams/json-fortran json-fortran]
 
Hätte man vielleicht besser in den perl-Teil gepackt und dann in einem einfacher lesbaren Format an Fortran übergeben...
 
Hätte man vielleicht besser in den perl-Teil gepackt und dann in einem einfacher lesbaren Format an Fortran übergeben...
 +
 +
==Vorbereitungen==
 +
=== Analyse der Karte ===
 +
# Es werden die von jedem Vektor überfahrenen Felder bestimmt und abgespeichert. Also das was man auch bei https://www.karopapier.de/vector.php rauskriegt.
 +
# {{Benutzer|Didi}}s mapcode wird in integer übertragen. Alle nicht befahrbaren Felder kriegen "-1", damit nicht jedes Mal auf die verschiedenen Zeichen geprüft werden muss. Checkpoint kriegen 2^Checkpointnummer (also 2 bis 512), Startfelder zählen dabei als Checkpointnummer Null (also 1), das Ziel kriegt -2.
 +
# Dann kommt der erste Durchgang durch die Karte: Anfangend bei allen Startfeldern werden alle benachbarten befahrbaren Felder gesucht bis die Karte abgegrast ist. Das passiert, weil teilweise Zielfelder und Checkpoints als Designelemente mitten im Grünen benutzt werden. Die bleiben dann übrig und werden auf nicht befahrbar, also -1 gesetzt.
 +
 +
=== Vorbereitung des Richtungsmodus' ===
 +
=== Richtungsmodus ===
 +
Der Richtungsmodus besteht aus 3 Teilen:
 +
* Wenn F1 eingestellt ist, folgt Botrix {{Benutzer|aristarch}}s Regel für den [[KaroIQ]]: dann ist das Ziel zwingend als erster Checkpoint zu überfahren. Alle Züge, die über einen Checkpoint führen werden verworfen, wenn nicht vorher bereits das Ziel überfahren wurde.
 +
* Wenn "Klassisch" eingestellt ist, wir geschaut, ob das sinnvoll umzusetzen ist.
 +
* Wenn Ja, dann wird jeder Zielzug (alle Checkpoints sind abgehakt und ich fahre über's Ziel) nur aus einer bestimmten Richtung erfolgen.
 +
* Wenn Nein (oder F1), dann ist jeder Zielzug erlaubt.

Version vom 7. Oktober 2021, 22:30 Uhr

Für Botschreiber und andere Interessierte beschreibe ich hier, wie ich intern funtioniere.

Ich bestehe aus zwei Teilen:

  1. Die Kommunikation mit dem Server, also Check, ob ich dran bin, herunterladen der *.json des Spiels, abgeben des Zugs. Außerdem die Chatfunktionen. Dieser Teil ist uralt und in perl geschrieben. Die erste Version von 2006 ist hier einsehbar, inzwischen ist einiges dazugekommen und eine Umstellung auf die API-Funktionen drin.
  2. Die eigentliche Zugberechnung war ursprünglich auch in perl geschrieben. Diese Version konnte keine Checkpoints, ist also immer so gefahren, als gäbe es keine. Sie hat den klassischen Richtungsmodus in den allermeisten Fällen richtig umgesetzt, konnte aber den F1-Modus gar nicht.

Anfang 2020 bekam ich eine Hirntransplantation und der zweite Teil wurde in Fortran neu geschrieben. Für meinen Papa quabla war das ein Übungsprojekt zum lernen der objektorientierten Features in Fortran.

JSON und Fortran

Als erstes wird die *.json des Spiels eingelesen. JSON in Fortran auszuwerten ist ein pain in the ass. Nicht umsonst steht im Code:

       ! Meine Fresse, ist das kompliziert in FORTRAN!
       call json%get(jmotion, "x", chtmp, found) 
       if (.not. found) stop 'motion.x fail'
       read (chtmp,*) this%state%x
       deallocate(chtmp, stat=ierr)
       if (ierr .ne. 0) stop 'deallo error chtmp 1 in init_player'
 

und das ist um eine integer variable da rauszupopeln. Benutzt wird hier json-fortran Hätte man vielleicht besser in den perl-Teil gepackt und dann in einem einfacher lesbaren Format an Fortran übergeben...

Vorbereitungen

Analyse der Karte

  1. Es werden die von jedem Vektor überfahrenen Felder bestimmt und abgespeichert. Also das was man auch bei https://www.karopapier.de/vector.php rauskriegt.
  2. Didis mapcode wird in integer übertragen. Alle nicht befahrbaren Felder kriegen "-1", damit nicht jedes Mal auf die verschiedenen Zeichen geprüft werden muss. Checkpoint kriegen 2^Checkpointnummer (also 2 bis 512), Startfelder zählen dabei als Checkpointnummer Null (also 1), das Ziel kriegt -2.
  3. Dann kommt der erste Durchgang durch die Karte: Anfangend bei allen Startfeldern werden alle benachbarten befahrbaren Felder gesucht bis die Karte abgegrast ist. Das passiert, weil teilweise Zielfelder und Checkpoints als Designelemente mitten im Grünen benutzt werden. Die bleiben dann übrig und werden auf nicht befahrbar, also -1 gesetzt.

Vorbereitung des Richtungsmodus'

Richtungsmodus

Der Richtungsmodus besteht aus 3 Teilen:

  • Wenn F1 eingestellt ist, folgt Botrix aristarchs Regel für den KaroIQ: dann ist das Ziel zwingend als erster Checkpoint zu überfahren. Alle Züge, die über einen Checkpoint führen werden verworfen, wenn nicht vorher bereits das Ziel überfahren wurde.
  • Wenn "Klassisch" eingestellt ist, wir geschaut, ob das sinnvoll umzusetzen ist.
  • Wenn Ja, dann wird jeder Zielzug (alle Checkpoints sind abgehakt und ich fahre über's Ziel) nur aus einer bestimmten Richtung erfolgen.
  • Wenn Nein (oder F1), dann ist jeder Zielzug erlaubt.