Wichtiges Update zum zweiten Programmierwettbewerb

Update 19.10.2009: Eine vierte Version wurde hochgeladen.

Aufgrund mehrerer Fehler in der Engine und der GUI wird hiermit eine neue Version der Spieledateien zum zweiten Programmierwettbewerb veröffentlicht. Wenn Sie eine Version vor dem heutigen Tage heruntergeladen haben, laden Sie bitte die neue Version herunter und nutzen nur noch diese.

Quellcode vom 19.10.2009: per FTP oder per HTTP.

Wir bitten diese Umstände zu entschuldigen und hoffen, dass nun alles fehlerfrei funktioniert.

Ihre freiesMagazin-Redaktion


Änderungen in der Version vom 19.10.2009:

  • einige private Klassenzugriffe in protected geändert
  • neuer Konstruktor für Bot-Klasse
  • eigene Library für Game-Engine
  • Bug behoben beim Laden einer Stats-Datei

Änderungen in der Version vom 14.10.2009:

  • Engine um Statistikausgabe erweitert

Änderungen in der Version vom 07.10.2009:

  • Bug behoben, dass nachfolgenden Karten verworfen werden, wenn keine Bewegung stattfindet

Änderungen in der Version vom 04.10.2009:

  • Bug behoben bei Abfrage auf Wände am Rand des Spielbrettes
  • Bug behoben bei Abfrage, ob Roboter das Ziel erreicht hat
  • Bug behoben in GUI beim Auslesen der Spielbrettgröße
  • Spielbrett einlesen verbessert mit genauerer Fehlerausgabe bei Problemen
  • Trennzeichen "----" in Sequenzdatei eingefügt, die Karten trennt
  • Anzeige in GUI, welche Karte zur aktuellen Sequenz gespielt wird

Bei der Behebung der alten

Bei der Behebung der alten Bugs hat sich, fürchte ich, ein neuer Fehler eingeschlichen: Wenn eine Karte zu keiner Bewegung führt, z.B. weil der Roboter vor einer Wand steht und eine Move Forward Karte gewählt wurde, dann verwirft die Spiel-Engine alle nachfolgenden Karten der selben Runde.

Der Fehler befindet sich wohl in der game.cpp in der Funktion generateAndStoreSequence() bei der Ausgabe des Trennzeichens "----" in die Sequenzdatei.

Re: Bei der Behebung der alten

Ah, das ist natürlich ärgerlich. Ich habe den Fehler behoben und eine neue Version hochgeladen. Vielen Dank für den Hinweis.

Dominik Wagenführ
freiesMagazin-Redaktion

Hilfe für "Missbrauch" der libgame

Hallo,

ich habe jetzt einen Tag lang vergebenes versucht, die libgame (also die Klasse "Game") sinnvoll für meine Zwecke zu benutzen und hoffe vielleicht einen kleinen Tipp zu erhalten, wo mein Denkfehler liegt.

Mein grundsätzliches Anliegen ist, mit Hilfe der Game-Klasse einen Spielzug zu simulieren.
Ich habe dazu sowohl eine abgeleitete Klasse, als in einem zweiten Versuch, auch eine mit Copy&Paste erstellt. Und diese so erweitert, dass ich das GameBoard, CardDeck und den Bot manuell setzen kann und diese nicht zwingen aus einer Datei gelesen werden müssen.

Danach habe ich, gewählten Karten an

generateAndStoreSequence( const CardDeck& choosenCards )

zu übergeben.

Ich war nun der Meinung, dass getBot().getPos() und getBot().getViewDirection() mir die Position des Bots nach den 5 Karten und den Zügen des Spielbretts ermitteln kann.
Leider scheint es immer nur die Startposition zurückzugeben.

Ich hoffe das war verständlich genug erklärt.

Die Frage ist nun, mache ich in der Anwendung etwas grundsätzlich verkehrt, gibt es eine einfache Erklärung oder ist es besser, ich implementiere die Spielfeld/Bot regeln selbst nochmals neu?

(P.S.: Natürlich programmiere ich auch in C++)

Vielen Dank
Frank

Re: Hilfe für "Missbrauch" der libgame

Hallo Frank,

also die Anwendung ist so korrekt und der Bot sollte nach dem Funktionsaufruf von generateAndStoreSequence an der richtigen Stelle stehen. Denn genau dies macht die Engine ja auch und speichert dann getBot().getPos() und getBot().getViewDirection(). Hier einmal mit Ausgabe:

Bot neu: 7 3 8 0 0
Bot: 7 3 8 Deck: MF 3 MF 2 RR MF 3 MF 2 RU MF 1 MF 1 Choosen: MF 3 MF 2 RR MF 3 MF 2 
generateAndStoreSequence(CardDeck)
generateAndStoreSequence(CardDeck, Bot)
Bot neu: 11 11 8 1 0

Es gibt auch schon Implementierungen (z.B. von mir selbst), die auf diese Art und Weise eine KI programmiert haben. Bei denen funktioniert es auch. Ich bin also unsicher, wo Dein Fehler liegt.

Du könntest uns maximal den Quellcode schicken und wir schauen mal drauf. Hilfe bei solchen Programmierthemen haben wir ja angeboten.

Dominik Wagenführ
freiesMagazin-Redaktion

Also es ging doch. Es gab

Also es ging doch. Es gab ein Problem mit dem Copy Constructor ... vermutlich, weil in der Game-Klasse von virtuellen Methoden kein Gebrauch gemacht wird, ist wohl eine vererbte Methode aufgerufen worden und nicht die überschriebene. Ganz so sicher bin ich mir allerdings selbst nicht, da ich dass manchmal nicht 101% durchschaue ;-)

Jedenfalls geht es jetzt, vielen Dank nochmal für die sichere Aussage, dass es gehen muss.

Viel Grüße
Frank

Re: Also es ging doch. Es gab

Ja, virtual habe ich in der Klasse "vergessen", weil die libgame erst nach Start des Wettbewerbs reingekommen ist, als ich erkannt habe, dass es ganz nützlich wäre, diese nutzen zu können. Jede weitere Code-Änderung zu diesem späten Zeitpunkt könnte aber Probleme machen, weswegen ich es auch nicht mehr ändern kann/werde.

Schön aber, dass es nun doch geht. :)

Dominik Wagenführ
freiesMagazin-Redaktion