Cassiopeia - Brettspiel ähnlich wie Carcassonne

Status
Nicht offen für weitere Antworten.

Manfred

Bekanntes Mitglied
Hmm, ich starte, sage lokales Spiel starten und gebe 2 Spieler ein, dann passiert nix....!?
 

Lim_Dul

Top Contributor
Rein garnichts?

Was steht in der Datei cassiopeia.log? (Nur die letzten Zeilen, alles drüber ist irrelevant)

Edit: Hast du vorher irgendwelche Spieloptionen ausgewählt? Sonst gehts nicht.
 

Mag1c

Top Contributor
Code:
Exception in thread "EventHandler (Server)" java.lang.NullPointerException
        at de.limdul.cassiopeia.control.tcpip.commands.TCPCommand.validString(TCPCommand.java:289)
        at de.limdul.cassiopeia.control.tcpip.commands.AddSet.<init>(AddSet.java:30)
        at de.limdul.cassiopeia.control.servermodus.ServerConnecting.parseRegisterPlayer(ServerConnecting.java:161)
        at de.limdul.cassiopeia.control.servermodus.ServerConnecting.parseTCPCommand(ServerConnecting.java:68)
        at de.limdul.cassiopeia.control.EventHandler.realDistributeCommand(EventHandler.java:288)
        at de.limdul.cassiopeia.control.EventHandler.run(EventHandler.java:254)
        at java.lang.Thread.run(Thread.java:595)

Gruß
Mag1c
 

Lim_Dul

Top Contributor
Danke, ja das ist wenn keine Spieloptionen ausgewählt sind.

Ich bau da für die nächste Version eine Abfrage ein. Versuch mal mindestens die Basisregeln zu aktivieren.
 

Mag1c

Top Contributor
Jop,

funktioniert und sieht klasse aus ! Gute Arbeit ! :applaus:

Nur schade, daß ich dann doch lieber das Brettspiel spiele.

Gruß
Mag1c
 

Lim_Dul

Top Contributor
Ich auch. Ist einfach kommunikativer. Aber man hat ja nicht immer Zeit dafür und so kann ich abends auch mal eine Runde über das Netz mit meinen Freunden spielen :)
 

simon_m

Mitglied
Ich hab es mir erst kurz angeguckt und auch nur mit den Grundregeln. Aber ich finde es sehr gut! Zwei Dinge interessieren mich besonders:
Wie lange haste daran gesessen?
Wie hast du das mit dem Spielfeld gemacht? Das ist doch wohl ein 2D-Array, oder? Mich interessiert, wie du den Zoom gemacht hast, da ich sowas in meinem Spiel auch machen will.
 

Lim_Dul

Top Contributor
Insgesamt ca. 7 Monate, allerdings immer unterschiedlich stark.

Zum Spielfeld werde ich nacher was schreiben.
 

simon_m

Mitglied
Eine sinnvolle Ergänzung für das Spiel wäre, dass man das laufende Spiel beenden kann. So eine Funktion habe ich nicht gefunden. Wenn es eine gibt, besser platzieren!
 

Lim_Dul

Top Contributor
Gibt es noch noch. Das ganze fehlt mit unter die Behandlung von Netzwerkfehlern, die noch nicht sauber implementiert sind.

Zum Thema Spielfeld:

Die Karten-Daten werden in einer Hash-Map gespeichert, der Schlüssel ist dabei die Position der Karte auf dem Spielfeld. (x/y)

Die Darstellung des Spielfeldes erfolgt auf einem Panel, dass ein null-Layout hat. Die Karten werden dabei von dem Spielfeld-Panel absolut positioniert.
Sollte dann gezoomt werden, so geschieht folgendes:
a) Die Karten werden vom Spielfeld entfernt.
b) Die Darstellung jeder einzelnen Karte wird angepasst (Die Bilder werden skaliert, die Figuren etc. neu positioniert)
c) Die Karten werden auf den neuen Positionen eingefügt
d) Die Größe des Panels wird neu gesetzt.
 

simon_m

Mitglied
Noch ne Frage:
Was genau steht in dem Log-Bericht? Das sind doch Meldungen aus dem Progg. Wie bindest du die da ein?
 

Lim_Dul

Top Contributor
Das geht über die Klasse CassiopeiaLogger bei mir.

Die hat eine statische Methode names log(int level, Categorie categorie, String message)

Die Klasse hält die verschiedenen Logger in einem statischen Vector vor und geht die dann alle durch. Jede Klasse hat ein Level, ab dem sie logt. Wie sie logt, hängt dann von der Klasse ab.
 

Lim_Dul

Top Contributor
Um das ganze vielleicht noch was weiter zu erklären, hier mal etwas gekürzter Source Code:

Code:
	protected static final void log(Categorie cat, int level, String message,) {
		boolean willLog = false;
		for (int i=0;i<loggers.size();i++) {
			if (loggers.get(i).willLog(level)) {
				willLog = true;
				break;
			}
		}
		if (!willLog) return;
                // Lese weitere Status Infos aus, die eventuell Kostenintensiv sind
		for (int i=0;i<loggers.size();i++) {
			if (loggers.get(i).willLog(level)) {
				loggers.get(i).saveLog(cat, level, message);
			}
		}
	}

Und jeder Logger muss halt die Funktion saveLog implementieren.

Ich habe bei mir dann als Logger definiert:

  • ScreenLogger: Der gibt die LogMeldungen auf dem Bildschirm aus
  • FileLogger: Loggt in die Datei cassiopeia.log
  • ExceptionLogger: Schmeisst eine Exception, wenn er was loggt
  • WindowLogger: Loggt in ein TableModell, dass über Tools/Log Window angesehen werden kann.

Der FileLogger und der WindowLogger loggen standardmässig alles. Die Datei ist dazu da, um hinterher Debug Infos zu haben, während der WindowLogger meiner Bequemlichkeit dient.

Der ScreenLogger logt normalerweise nur Meldungen, die das Level WARNING oder höher habe. Also alles, was auf nicht korrekten Ablauf hindeutet. Dadurch sieht man auf der Konsole, wenn irgendwas schiefgeht.

Der ExceptionLogger loggt normalerweise nur Meldungen des Levels CRITICAL. Dieses Level bedeutet, dass irgendwas schiefgelaufen ist, was mit der Programmlogik zu tun hat. Das Programm würde weiterlaufen (Also kein NPE oder ähnliches werfen), aber nur noch Müll machen. Da will ich dann mit dem Logger einen "kontrollierten" Absturz erzeugen.

Weiterhin wird der ExceptionLogger temporär während der JUnit-Tests auf WARNING gesetzt, so dass ein Unit-Test auch dann fehltschlägt, wenn es LogMeldung des Levels WARNING oder höher gibt.



Jetzt bleibt noch die Frage zu klären, warum ich ein eigenes Logging-Framework genommen habe, und kein vorhandes.

Zum einen macht es mir Spaß sowas zu programmieren, zum andern mag ich fremde Frameworks nicht so sehr.
Die Logging Funktionen von java.util.Logger gefallen mir nicht wirklich, die fand ich für meine Zwecke zu kompliziert zu nutzen. log4j kenne ich bis heute nicht, dass scheint aber besser zu sein. Aber wenn man es selber schreibt, dann macht die Klasse genau das, was man will und nicht mehr.
 

Lim_Dul

Top Contributor
Update:

Version 0.1.1 ist drausen :)

Neue Features/Bugfixes:
  • Komplette Englische Übersetzung (Außer dem Regelbuch, das gibts nur in Deutsch)
  • Spiele lassen sich abbrechen
  • Über Netzwerkfehler wird man informiert
  • Die Toolbar an der Seite lässt sich nun verschieben
  • Diverse kleinere Bugfixes

Eine relativ genau Liste der Änderungen bekommt man hier: http://bugs.lim-dul.de/changelog_page.php
 

Lim_Dul

Top Contributor
Mal einen Zwischenstand aus der aktuellen Entwicklung:

botgame.png
 

Zunera

Aktives Mitglied
Hi,
jetzt da ich den Screenshot sehe wollt ich mal fragen, sind das eingescannte Teile von Carcassone? Hab nämlich auch nen Brettspiel umgesetzt und direkt Brettspielvorlagen eingescannt... Darf man das Spiel veröffentlichen und verbreiten, vor allem wenn es Freeware ist bzw. man keine kommerziellen Absichten verfolgt? Wer kennt sich da genau aus? (Hoffe, es ist nicht zu Off-Topic...)
 

EgonOlsen

Bekanntes Mitglied
Zunera hat gesagt.:
Darf man das Spiel veröffentlichen und verbreiten, vor allem wenn es Freeware ist bzw. man keine kommerziellen Absichten verfolgt? Wer kennt sich da genau aus? (Hoffe, es ist nicht zu Off-Topic...)
Nein, darf man nicht. Kann natürlich sein, dass es niemanden kratzt, aber bei sowas wie Carcassone würde ich es nicht darauf ankommen lassen.
 

Lim_Dul

Top Contributor
Jepp, darfst du nicht.
Das ist der Grund, warum in der Versionen in den Posts vorher auch andere Graphiken sind.
Das Spiel kann zwar die Orginalgraphiken nutzen, wie man auch an dem Screenshot sieht, aber ich werden einen Teufel tun und diese herausgeben.
 

Lim_Dul

Top Contributor
So, nun gibt es eine neue Version, eine neue URL und viele Verbesserungen. Der Umfang des Codes ist gegenüber der letzten Version um fast 60% gewachsen.

Zu finden ist das ganze jetzt hier: http://www.cassiopeia-game.de/

Es würde mich freuen, wenn das der eine oder andere testen würde und seine Meinung sagen würde :)
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben