Botrix/Motorraum: Unterschied zwischen den Versionen

Aus KaroWiki
Zur Navigation springen Zur Suche springen
Zeile 25: Zeile 25:
 
# Es werden die von jedem Vektor überfahrenen Felder bestimmt und abgespeichert. Also das was man auch bei https://www.karopapier.de/vector.php rauskriegt.
 
# 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.
 
# {{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.
+
# 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' ===
 
=== Vorbereitung des Richtungsmodus' ===
 
Es wird bestimmt, ob ein Richtungsmodus "Klassisch" sinnvoll umsetzbar ist und aus welcher Richtung das Ziel dann überfahren werden darf.
 
Es wird bestimmt, ob ein Richtungsmodus "Klassisch" sinnvoll umsetzbar ist und aus welcher Richtung das Ziel dann überfahren werden darf.
 
* Wenn es verstreute Ziele gibt (Kriterium: es gibt ein Zielfeld, zu dem es nicht in einer Entfernung von höchstens 10 Kästchen (horizontal oder vertikal) ein weiteres Zielfeld gibt), dann ist es eine Checkpointsammelstrecke und der Richtungsmodus wird ignoriert.
 
* Wenn es verstreute Ziele gibt (Kriterium: es gibt ein Zielfeld, zu dem es nicht in einer Entfernung von höchstens 10 Kästchen (horizontal oder vertikal) ein weiteres Zielfeld gibt), dann ist es eine Checkpointsammelstrecke und der Richtungsmodus wird ignoriert.
* Für jede Kombination von Start- und Zielfeldern wird ermittelt, ob es eine direkte Sichtlinie dazwischen gibt (ob ein Zug vom einen zum anderen möglich wäre). Falls Ja, wird der Winkel des Zugs gemerkt. Dabei wird der Vollkreis in 8 "Oktanten" zerlegt, also in 45°- Schritten zerteilt. Aber nicht 0 bis 45 etc. sondern -22.5 bis +22.5, +22.5 bis +67.5 etc.
+
* Für jede Kombination von Start- und Zielfeldern wird ermittelt, ob es eine direkte Sichtlinie dazwischen gibt (ob ein direkter Zug vom einen zum anderen möglich wäre). Falls Ja, wird der Winkel des Zugs gemerkt. Dabei wird der Vollkreis in 8 "Oktanten" zerlegt, also in 45°- Schritten zerteilt. Aber nicht 0 bis 45 etc. sondern -22.5 bis +22.5, +22.5 bis +67.5 etc.
 
* Wenn alle Oktanten erlaubt sind, wird "Klassisch" ausgeschaltet.  
 
* Wenn alle Oktanten erlaubt sind, wird "Klassisch" ausgeschaltet.  
* Es wird geschaut, wie oft eine Richtung und ihre Gegenrichtung erlaubt sind. Einmal ist OK (z.B. auf Karte 1 Ziellinie im spitzen Winkel von oben oder unten), aber wenn es mehr als einmal ist, wird "Klassisch" ausgeschaltet.  
+
* Es wird geschaut, wie oft eine Richtung und ihre Gegenrichtung möglich sind. Einmal ist OK (z.B. auf Karte 1 Ziellinie im spitzen Winkel von links oben oder links unten), aber wenn es mehr als einmal ist, wird "Klassisch" ausgeschaltet.  
 
* Wenn es genau einmal ist, werden diese Richtung und Gegenrichtung rausgeschmissen (das wäre auf Karte 1 der spitze Winkel von rechts oben oder rechts unten).
 
* Wenn es genau einmal ist, werden diese Richtung und Gegenrichtung rausgeschmissen (das wäre auf Karte 1 der spitze Winkel von rechts oben oder rechts unten).
 
* Wenn wir bis hierher gekommen sind, ist "Klassisch" sinnvoll und ein Zielzug nur im entsprechenden Winkelbereich erlaubt.
 
* Wenn wir bis hierher gekommen sind, ist "Klassisch" sinnvoll und ein Zielzug nur im entsprechenden Winkelbereich erlaubt.
* es gibt Ausnahmen, bei denen das nicht funktioniert:
+
* es gibt Ausnahmen, bei denen das nicht funktioniert und die dann hart auf "egal" gesetzt werden: Karten 93, 117, 134, 205 und 229.
**
 
  
 
=== Richtungsmodus ===
 
=== Richtungsmodus ===

Version vom 7. Oktober 2021, 23:22 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'

Es wird bestimmt, ob ein Richtungsmodus "Klassisch" sinnvoll umsetzbar ist und aus welcher Richtung das Ziel dann überfahren werden darf.

  • Wenn es verstreute Ziele gibt (Kriterium: es gibt ein Zielfeld, zu dem es nicht in einer Entfernung von höchstens 10 Kästchen (horizontal oder vertikal) ein weiteres Zielfeld gibt), dann ist es eine Checkpointsammelstrecke und der Richtungsmodus wird ignoriert.
  • Für jede Kombination von Start- und Zielfeldern wird ermittelt, ob es eine direkte Sichtlinie dazwischen gibt (ob ein direkter Zug vom einen zum anderen möglich wäre). Falls Ja, wird der Winkel des Zugs gemerkt. Dabei wird der Vollkreis in 8 "Oktanten" zerlegt, also in 45°- Schritten zerteilt. Aber nicht 0 bis 45 etc. sondern -22.5 bis +22.5, +22.5 bis +67.5 etc.
  • Wenn alle Oktanten erlaubt sind, wird "Klassisch" ausgeschaltet.
  • Es wird geschaut, wie oft eine Richtung und ihre Gegenrichtung möglich sind. Einmal ist OK (z.B. auf Karte 1 Ziellinie im spitzen Winkel von links oben oder links unten), aber wenn es mehr als einmal ist, wird "Klassisch" ausgeschaltet.
  • Wenn es genau einmal ist, werden diese Richtung und Gegenrichtung rausgeschmissen (das wäre auf Karte 1 der spitze Winkel von rechts oben oder rechts unten).
  • Wenn wir bis hierher gekommen sind, ist "Klassisch" sinnvoll und ein Zielzug nur im entsprechenden Winkelbereich erlaubt.
  • es gibt Ausnahmen, bei denen das nicht funktioniert und die dann hart auf "egal" gesetzt werden: Karten 93, 117, 134, 205 und 229.

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, wird geschaut, ob das sinnvoll umzusetzen ist.
  • Wenn Ja, dann darf 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.