Botrix/Motorraum

Aus KaroWiki
Version vom 28. März 2022, 08:10 Uhr von Quabla (Diskussion | Beiträge) (→‎Analyse der Karte)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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. Checkpoints kriegen 2Checkpointnummer (also 21 bis 29 bzw. 2 bis 512), Zielfelder zählen dabei als Checkpointnummer Null (also 1), der Start kriegt -2, alle sonstigen Strassenfelder kriegen "0".
  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 (in der Richtung, in der man vom Ziel aus den Start sieht) 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, dann darf jeder Zug über ein Zielfeld nur aus der oben bestimmten Richtung erfolgen, solange nicht mindestens ein Checkpoint überfahren wurde.
  • Wenn Nein (oder F1), dann ist jeder (Ziel-)zug erlaubt.