# Cassiopeia - Brettspiel ähnlich wie Carcassonne



## Lim_Dul (5. Dez 2005)

Ich hab ein Brettspiel in Java Programmiert, dass ähnlich wie Carcassonne ist.

Zu finden ist die Version 0.1 unter Cassiopeia0.1.jar

Das ganze Ding steht unter einer CC Lizenz:
Lizenzhinweise:



This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.0 Germany License

Kommentare, Bug Reports etc. sind gerne erwünscht


----------



## Manfred (6. Dez 2005)

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


----------



## Lim_Dul (6. Dez 2005)

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 (6. Dez 2005)

```
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 (6. Dez 2005)

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 (6. Dez 2005)

Jop,

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

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

Gruß
Mag1c


----------



## Lim_Dul (6. Dez 2005)

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 (7. Dez 2005)

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 (7. Dez 2005)

Insgesamt ca. 7 Monate, allerdings immer unterschiedlich stark.

Zum Spielfeld werde ich nacher was schreiben.


----------



## simon_m (7. Dez 2005)

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 (7. Dez 2005)

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 (8. Dez 2005)

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 (8. Dez 2005)

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 (8. Dez 2005)

Um das ganze vielleicht noch was weiter zu erklären, hier mal etwas gekürzter Source 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 (12. Dez 2005)

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 (19. Jan 2007)

Mal einen Zwischenstand aus der aktuellen Entwicklung:


----------



## Zunera (19. Jan 2007)

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 (19. Jan 2007)

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 (19. Jan 2007)

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 (31. Jan 2007)

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


----------

