<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stageing.freitagsrunde.org//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=130.149.17.34</id>
	<title>FreitagsrundenWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stageing.freitagsrunde.org//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=130.149.17.34"/>
	<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//Spezial:Beitr%C3%A4ge/130.149.17.34"/>
	<updated>2026-11-03T05:21:48Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.6</generator>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=TechGI_4_(Bachelor)/Ged%C3%A4chtnisprotokoll_Klausur_SoSe_2009&amp;diff=16109</id>
		<title>TechGI 4 (Bachelor)/Gedächtnisprotokoll Klausur SoSe 2009</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=TechGI_4_(Bachelor)/Ged%C3%A4chtnisprotokoll_Klausur_SoSe_2009&amp;diff=16109"/>
		<updated>2011-07-19T17:12:12Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: ICH GLAUB MICH TRIFFT DER SCHLAG&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Klausur im SS2009 ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039; Transparenzen &#039;&#039;&#039; Was bedeutet Transparenz im Bezug auf verteilte Systeme? Nenne vier Transparenzen und beschreibe sie kurz&lt;br /&gt;
# &#039;&#039;&#039;TCP/UDP &#039;&#039;&#039; Grenze beides voneinander ab&lt;br /&gt;
# &#039;&#039;&#039; RPC &#039;&#039;&#039; &lt;br /&gt;
## nenne drei Möglichkeiten die ein Client hat, wenn er auf eine Anfrage keine Antwort kriegt&lt;br /&gt;
## Was bedeutet Idempotenz? &lt;br /&gt;
# &#039;&#039;&#039;Berkeley-Socket API&#039;&#039;&#039; Was bedeutet der &amp;quot;Accept&amp;quot;-Befehl?&lt;br /&gt;
# &#039;&#039;&#039; UDDI &#039;&#039;&#039; Fülle das Schema aus (1-6 + Nummerierung)&lt;br /&gt;
# &#039;&#039;&#039; Netzwerkkommunikationsverzögerung &#039;&#039;&#039; (gegeben: Größe des Pakets, Länge der Leitung, Geschwindigkeit, Bandbreite)&lt;br /&gt;
##  Wie lange braucht der Sender zum verschicken?&lt;br /&gt;
## Wann kommt das erste Bit an, wann das letzte?&lt;br /&gt;
## In Zeitverlaufsschema eintragen&lt;br /&gt;
## Berechne das Ganze für neue Werte&lt;br /&gt;
# &#039;&#039;&#039; Berkeley-Algorithmus &#039;&#039;&#039;&lt;br /&gt;
## Was sendet der Server?&lt;br /&gt;
## Was senden die Clients?&lt;br /&gt;
## Berechne die neue Zeit, die vom Server versendet wird (alte Zeiten gegeben)&lt;br /&gt;
# &#039;&#039;&#039; Webservice &#039;&#039;&#039; Zuerst Implementierung der Kernfunktionalität oder Erstellung der WSDL-Datei? Warum? Welchen Vorteil hätte die andere Variante?&lt;br /&gt;
# &#039;&#039;&#039; DNS &#039;&#039;&#039;&lt;br /&gt;
## Erkläre kurz DNS&lt;br /&gt;
## Kann man von einer &#039;&#039; Gefährdung des Internets &#039;&#039; ([[http://www.heise.de/security/Massives-DNS-Sicherheitsproblem-gefaehrdet-das-Internet--/news/meldung/110641| Artikel war genannt]]) sprechen? + Erklärung&lt;br /&gt;
# &#039;&#039;&#039; Multicast &#039;&#039;&#039;&lt;br /&gt;
## Skizziere FIFO ohne Atomic&lt;br /&gt;
## Skizziere Atomic ohne FIFO&lt;br /&gt;
## Wie nennt man beides zusammen?&lt;br /&gt;
# &#039;&#039;&#039; Synchronisation von Datenbanken &#039;&#039;&#039; Anforderung an ein Commit-Protokoll (?)&lt;br /&gt;
# &#039;&#039;&#039; Netzwerk Multicast &#039;&#039;&#039; Erläutere kurz &#039;&#039; Multicast via Unicast&#039;&#039; und &#039;&#039; Network Multicast &#039;&#039;. Nenne jeweils ein Vorteil&lt;br /&gt;
# &#039;&#039;&#039; Weighted Voting &#039;&#039;&#039; &lt;br /&gt;
## Nenne die Bedeutung von w,v und r in den zwei Formeln (gegeben)&lt;br /&gt;
## Nenne die Bedeutung der Formeln&lt;br /&gt;
# &#039;&#039;&#039; Fehlerwahrscheinlichkeit &#039;&#039;&#039;&lt;br /&gt;
## Wie groß ist die Wahrscheinlichkeit, dass ein Paket der Größe n Fehlerhaft ist ?(Fehlerwahrscheinlichkeit pro bit p gegeben)&lt;br /&gt;
## Welche Annahme wurde bei 1. getroffen? Ist diese realistisch? Begründe!&lt;br /&gt;
# &#039;&#039;&#039; GoBackN &#039;&#039;&#039;&lt;br /&gt;
## Wie groß ist der Puffer auf Sender- und Empfängerseite?&lt;br /&gt;
## Bei einer sehr sehr fehlerbehafteten Übertragungsleitung macht es Sinn, nur einzelne Pakete nochmal zu schicken. Welchen Nachteil hat das?&lt;br /&gt;
# &#039;&#039;&#039; Lamport &#039;&#039;&#039; Kann man in einem System, bei dem die Uhren mit dem Lamport-Algorithmus gestellt werden, absolute Zeitverzögerungen(?) messen? Begründe!&lt;br /&gt;
# &#039;&#039;&#039;Internet &#039;&#039;&#039;&lt;br /&gt;
## Wir viele Adressen sind mit IPv4 maximal möglich (ohne Beachtung von irgendwas)&lt;br /&gt;
## Erkläre NAT&lt;br /&gt;
# &#039;&#039;&#039;Statistische Demultiplexing &#039;&#039;&#039; Gegeben 2 Kanäle mit Bitrate C(?)&lt;br /&gt;
# &#039;&#039;&#039; Routing &#039;&#039;&#039; Nenne drei Fehler, die in einem Netzwerk auftreten können, in dem nur das Best-Effort-Prinzip verwendet wird, und jeweils die Lösung dazu.&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/Doom&amp;diff=15829</id>
		<title>Javakurs/Übungsaufgaben/Doom</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/Doom&amp;diff=15829"/>
		<updated>2011-03-22T10:17:24Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ASCII-DOOM&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
In Ascii-Doom geht es darum, ein kleines [http://de.wikipedia.org/wiki/Rogue-like rogue-like] Spiel zu implementieren. &lt;br /&gt;
&lt;br /&gt;
D.h. es wird möglich sein mittels [http://en.wikipedia.org/wiki/ASCII_art ASCII-Art], mit einer Spielfigur auf dem Spielfeld zu laufen, später könnt ihr auch&lt;br /&gt;
Items, Waffen und [http://de.wikipedia.org/wiki/Liv_Tyler Liv Tyler] einbauen! &lt;br /&gt;
&lt;br /&gt;
Wir werden Schritt für Schritt das Spiel implementieren. Wenn ihr verloren geht, keine Angst, wir können euch helfen ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Die Klasse &#039;&#039;GameMain&#039;&#039; - Der Anfang ==&lt;br /&gt;
&lt;br /&gt;
Die Klasse &#039;&#039;GameMain&#039;&#039; ist die Klasse, die die main Methode enthalten wird und somit ausführbar ist. Sie wird die Schnittstelle zur Außenwelt sein und die Ausgabe auf die Konsole tätigen.&lt;br /&gt;
&lt;br /&gt;
* Erstellt zunächst nur diese Klasse. Sobald ihr Klassen aus den späteren Aufgaben implementiert habt, könnt ihr in der &#039;&#039;main&#039;&#039;-Methode ihre Funktionalität testen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Positionen für alle Objekte ==&lt;br /&gt;
&lt;br /&gt;
Die Klasse &#039;&#039;Position&#039;&#039; repräsentiert eine Position auf einem 2D-Spielfeld. Also karthesische 2 dimensionale Koordinaten, wie ihr sie von einem kariertem Papier kennt. Des Weiteren enthält Sie private die folgende Attribute:  &#039;&#039;x&#039;&#039; und &#039;&#039;y&#039;&#039;, gekapselt mit &#039;&#039;Gettern&#039;&#039; und &#039;&#039;Settern&#039;&#039;.&lt;br /&gt;
	&lt;br /&gt;
* Schreibt diese &#039;&#039;Getter&#039;&#039; und &#039;&#039;Setter&#039;&#039;&lt;br /&gt;
* Implementiert eine equals-Methode, die 2 Objekte vom Typ &#039;&#039;Position&#039;&#039; vergleicht.&lt;br /&gt;
* Testet nun eure &#039;&#039;equals&#039;&#039;-Methode in der &#039;&#039;main&#039;&#039;. (Tested sie solange bis sie funktioniert)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repräsentation eines Gebietes ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;GameTile&#039;&#039; wird unsere Klasse sein, die ein Tile, also ein Feld, im späteren Spiel repräsentiert. Alle weiteren Felder werden von ihr erben. So wird es später ein &#039;&#039;leeres Feld&#039;&#039; geben, eine &#039;&#039;Mauer&#039;&#039;, und Alles was euch noch einfällt.&lt;br /&gt;
&lt;br /&gt;
* Es enthält außerdem eine private Variable vom Typ &#039;&#039;Position&#039;&#039;, welche die Position des GameTiles auf dem Feld speichert.&lt;br /&gt;
	&lt;br /&gt;
* Implementiert eine &#039;&#039;toString&#039;&#039;-Methode, die jedem &#039;&#039;GameTile&#039;&#039; einen &#039;&#039;String&#039;&#039; mit Länge 1 zuordnet.&lt;br /&gt;
** Diese Methode wird von allen erbenden Klassen überschrieben werden&lt;br /&gt;
&lt;br /&gt;
* Schreibt nun einige Klassen die von &#039;&#039;GameTile&#039;&#039; erben&lt;br /&gt;
** Als Namen bietet sich &#039;&#039;WallTile&#039;&#039; und &#039;&#039;EmptyTile&#039;&#039;&lt;br /&gt;
** Die &#039;&#039;toString()&#039;&#039;-Methoden sollten dann sinvolle Zeichen zurückgeben, wie &amp;quot; &amp;quot; oder &amp;quot;#&amp;quot;.&lt;br /&gt;
		&lt;br /&gt;
* Testet auch hier euere &#039;&#039;toString&#039;&#039;-Methoden, in dem ihr euch einzelne Tiles erzeugt und diese ausgeben last&#039;&#039;&#039;&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
== Das GameField ==&lt;br /&gt;
Euer &#039;&#039;GameField&#039;&#039; ist eine zentrale Klasse in diesem Spiel, sie repräsentiert das Spielfeld als Ganzes und besteht aus mehreren &#039;&#039;GameTiles&#039;&#039;.&lt;br /&gt;
	&lt;br /&gt;
* Enthält eine private Variable für das Level (2D-Array aus GameTiles). &lt;br /&gt;
	&lt;br /&gt;
* Über den Konstruktor wird ein String dieser Form übergeben(ebenso wie die Breite des Spielfeldes): 		&lt;br /&gt;
        String s = &amp;quot;########&amp;quot; +&lt;br /&gt;
 		  &amp;quot;#      #&amp;quot; +&lt;br /&gt;
 		  &amp;quot;#      #&amp;quot; +&lt;br /&gt;
 		  &amp;quot;###    #&amp;quot; +&lt;br /&gt;
 		  &amp;quot;#      #&amp;quot; +&lt;br /&gt;
 		  &amp;quot;########&amp;quot;;&lt;br /&gt;
** Es soll mit einer Schleife der String Zeichen für Zeichen ausgelesen werden und aus jedem Zeichen ein neues &#039;&#039;GameTile&#039;&#039; (Wand oder leer) erzeugt werden. Diese &#039;&#039;GameTiles&#039;&#039; werden dann in dem Array gespeichert!&lt;br /&gt;
** Wie man Strings Zeichen für Zeichen ausliest, findet ihr in der API (java.lang.String).&lt;br /&gt;
** Implementiert ein toString, dieser soll folgenden String liefern: 	&lt;br /&gt;
 		 ######## &lt;br /&gt;
 		 #      #&lt;br /&gt;
 		 #      #&lt;br /&gt;
 		 ###    #&lt;br /&gt;
 		 #      #&lt;br /&gt;
  		 ########&lt;br /&gt;
** Tipp: &amp;quot;\n&amp;quot; steht in einem String für Zeilenumbruch.&lt;br /&gt;
** Es soll also aus dem &#039;&#039;GameField&#039;&#039;-Array wieder ein &#039;&#039;String&#039;&#039; generiert werden.&lt;br /&gt;
** Die &#039;&#039;toString&#039;&#039;-Methode von &#039;&#039;GameField&#039;&#039; soll die &#039;&#039;toString&#039;&#039;-Methode der &#039;&#039;GameTile&#039;&#039;s verwenden, um diese Ausgabe zu erzeugen.&lt;br /&gt;
* &#039;&#039;&#039;TESTET euer Programm mit verschiedenen Levels&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Eine Welt aus Feldern ==&lt;br /&gt;
	&lt;br /&gt;
Die Klasse &#039;&#039;World&#039;&#039; ist die Klasse, die Alles verbinden wird, Spieler, Items, Spielfeld etc.&lt;br /&gt;
&lt;br /&gt;
Bei Java funktioniert es bei grafischen Anwendungen etwa so: Man hat ein Objekt, das eine Leinwand repräsentiert (Canvas), man darf auf diesem Objekt Sachen malen. In einem Spiel wird das Objekt in jedem Frame leer gemacht, danach werden alle beteiligten grafischen Objekte (Spieler, Spielfeld, Gegner) nacheinander auf diese Leinwand gemalt. Letzendlich wird die Leinwand auf dem Bildschirm ausgegeben. Das hat den Vorteil, dass jede Klasse die darauf Zugriff bekommt, irgendetwas malen kann ohne zu wissen, was bereits darauf ist oder noch darauf kommt. (Jedes Objekt kümmert sich selbst um seine grafische Entsprechung.)&lt;br /&gt;
Das werden wir hier auch machen, allerdings mit einem String, da uns die Grundlagen für Grafisches fehlen.&lt;br /&gt;
	&lt;br /&gt;
* Zunächst einmal gibt es nur das &#039;&#039;GameField&#039;&#039;, was wir einbinden können (später den Spieler, etc.).&lt;br /&gt;
** So muss es auch ein Variable vom Typ &#039;&#039;GameField&#039;&#039; geben.	&lt;br /&gt;
* Die &#039;&#039;Main&#039;&#039; Klasse erzeugt ab jetzt nur noch eine Instanz von &#039;&#039;World&#039;&#039; nicht mehr von &#039;&#039;GameField&#039;&#039;. Denn &#039;&#039;World&#039;&#039; selbst soll sich das &#039;&#039;GameField&#039;&#039; erzeugen (im Konstruktor).&lt;br /&gt;
	&lt;br /&gt;
* Definiert eine &#039;&#039;canvas&#039;&#039; Variable, die für die grafische Repräsentierung des Spielfelds stehen wird.&lt;br /&gt;
**  &#039;&#039;canvas&#039;&#039; ist dabei ein String der der linear das GameField speichert.&lt;br /&gt;
BSP: Diese Feld&lt;br /&gt;
 ###&lt;br /&gt;
 # ##&lt;br /&gt;
 #@ #&lt;br /&gt;
 ####&lt;br /&gt;
Entspricht dann (für eine Breite von 4)&lt;br /&gt;
 ### # ###@ #####&lt;br /&gt;
&lt;br /&gt;
Unter der Annahme das das Feld n Einheiten breit ist, kann man berechnen auf welchem Index des Strings ein Tile liegen soll. Beispiel: ein Tile hat die Koordinaten (4,7) und das Feld ist 16 Einheiten breit, dann berechnet sich der Index aus i = 4 + 7*16, also i = x + y*w.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zeichnen der Welt ==&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;World&#039;&#039; sollte sich nun selbst zeichnen können. Diese Methode sollte &#039;&#039;draw&#039;&#039; heißen. SIe muss  die &#039;&#039;toString&#039;&#039;-Methode des GameFields aufrufen. Diese Methode liefert einen linearisierte Variante des Feldes zurück und diese &#039;&#039;draw&#039;&#039;-Methode müsste dann nur die linearisierte Variante in Abhängigkeit von der Breite der &#039;&#039;Welt&#039;&#039;, 2D ausgeben.&lt;br /&gt;
&lt;br /&gt;
Dazu ein Beispiel: Angenommen &#039;&#039;GameField.toString()&#039;&#039; liefert&lt;br /&gt;
 #### ## ##@####&lt;br /&gt;
Und unter der Annahme die Welt sei 3 Einheiten breit, dann sollte die Ausgabe so aussehen:&lt;br /&gt;
 ###&lt;br /&gt;
 # #&lt;br /&gt;
 # #&lt;br /&gt;
 #@#&lt;br /&gt;
 ###&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039; TESTET nun eure Grafik Ausgabe anhand verschiedener Level&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schönheit der Ausgabe im GameMain ==&lt;br /&gt;
&lt;br /&gt;
Die Klasse GameMain enthält als einzige eine Instanz der Klasse World und kann somit das Spielfeld zeichnen. 	&lt;br /&gt;
Sofern ihr beim Testen versucht habt, das Spielfeld mehrmals auf die Konsole auszugeben, seht ihr, dass das alte Spielfeld  noch immer sichtbar ist über dem neuen. Das sieht irgendwie blöd aus.&lt;br /&gt;
	  &lt;br /&gt;
* Zählt nach, wieviele Zeilen euere Konsole hat. 	&lt;br /&gt;
* Bevor man das Level ausgibt, kann man soviele leere Zeilen ausgeben lassen, dass das alte Level nicht mehr sichtbar ist. &#039;&#039;System.out.println(&amp;quot;&amp;quot;);&#039;&#039; gibt eine leere Zeile aus. &lt;br /&gt;
* &#039;&#039;&#039;TESTEN ob das klappt und gut aussieht&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Der Spieler ==&lt;br /&gt;
&lt;br /&gt;
Der Spieler wird die Möglichkeit haben, auf dem Spielfeld rumzulaufen und je nachdem, wie weit ihr kommt, noch viel mehr. Perfekt wäre es wenn dieser Spieler auch von &#039;&#039;GameField&#039;&#039; erbt, damit ihr die Funktionalitäten eines Feldes weiter benutzen könnt (Position, etc.).&lt;br /&gt;
	  		  &lt;br /&gt;
* Der Spieler wird durch ein &amp;quot;@&amp;quot; auf dem &#039;&#039;GameField&#039;&#039; repräsentiert.&lt;br /&gt;
* Schreibt eine &#039;&#039;draw&#039;&#039;-Methode, die einen String bekommt und anhand der obigen Formel zur Indexberechnung und der Position des Spielers den übergebenen String um den Spieler selber ergänzt.&lt;br /&gt;
&lt;br /&gt;
Wenn wir das ganze als Ausgabe betrachten, könnte dies der Eingabe-String sein:&lt;br /&gt;
 ###&lt;br /&gt;
 # #&lt;br /&gt;
 # #####&lt;br /&gt;
 #     #&lt;br /&gt;
 #######&lt;br /&gt;
&lt;br /&gt;
oder linear:&lt;br /&gt;
 ###    # #    # ######     ########&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Wenn der Player jetzt eine Position von (5,4) hat, und die Welt eine Breite von 7 hat, so muss der Index 5+4*7=33 um den Spieler ergänzt werden.&lt;br /&gt;
&lt;br /&gt;
Des Weiteren wollen wir auch den Spieler bewegen können, also muss er folgende Funktionalitäten besitzen:&lt;br /&gt;
* public void moveLeft() &lt;br /&gt;
* public void moveRight()&lt;br /&gt;
* public void moveUp()&lt;br /&gt;
* public void moveDown()&lt;br /&gt;
** Welche einfach nur die X- oder Y-Position um 1 erhöhen oder verringern.&lt;br /&gt;
&lt;br /&gt;
	  &lt;br /&gt;
&lt;br /&gt;
== Der Spieler in der Welt ==&lt;br /&gt;
&lt;br /&gt;
* Im Konstruktor soll nun auch eine Spielerinstanz erzeugt werden und zunächst an einer bel. Position gesetzt werden.&lt;br /&gt;
	  &lt;br /&gt;
* Erweitert die draw-Methode so, dass nun auch der Spieler angezeigt wird. &lt;br /&gt;
	&lt;br /&gt;
* &#039;&#039;&#039;TESTET ob das funktioniert. Was passiert eigentlich, wenn man den Spieler an der Position  -1 | -1 setzt ? &#039;&#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interaktive Welt ==&lt;br /&gt;
&lt;br /&gt;
Nun ist es an der Zeit eurem Spieler das Bewegen beizubringen. Dazu solltet ihr die &#039;&#039;World&#039;&#039;-Klasse überarbeiten.&lt;br /&gt;
&lt;br /&gt;
* Implementiert eine Methode &#039;&#039;public boolean onKeyPressed( String key ){ ... }&#039;&#039;. Sie wird dann aufgerufen werden, wenn eine Taste gedrückt wurde und soll &#039;&#039;true&#039;&#039; zurückgeben, wenn der Spieler sich bewegt hat, ansonsten &#039;&#039;false&#039;&#039;. 	  &lt;br /&gt;
	  &lt;br /&gt;
* Zunächst müssen wir in &#039;&#039;onKeyPressed&#039;&#039; prüfen, ob key einer der Strings &amp;quot;a&amp;quot; (links) , &amp;quot;s&amp;quot;(unten) , &amp;quot;d&amp;quot;(rechts) , &amp;quot;w&amp;quot;(oben) ist (&#039;&#039;equals&#039;&#039; benutzen!). Falls ja, wurde schonmal eine gültige Taste gedrückt. Falls nein, können wir &#039;&#039;false&#039;&#039; zurückliefern.&lt;br /&gt;
	&lt;br /&gt;
* Wir müssen als nächstes prüfen, ob der Spieler durch die Bewegung nicht in eine Mauer reinläuft, dazu müssen wir die Spielerposition vergleichen und schauen, in welchem Tile er stehen würde, wenn wir rechts/links/hoch/runter liefen. Sofern dieses Tile leer ist, dürfen wir in diese Richtung laufen. Denkt dabei an die Getter der &#039;&#039;GameField&#039;&#039;-Klasse&lt;br /&gt;
	  &lt;br /&gt;
* Nun wo wir das alles geprüft haben, bewegen wir den Spieler mit einer der vier Bewegungsfunktionen und geben true zurück.&lt;br /&gt;
		  &lt;br /&gt;
* &#039;&#039;&#039;TESTET unbedingt manuell diese Methode, sie muss korrekt funktionieren! &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Final Touch ==&lt;br /&gt;
&lt;br /&gt;
Jetzt müsst ihr nur noch eine passende Main-Schleife schreiben, und ihr habt eure erste Sandbox zum weiteren Experimentieren fertig. &lt;br /&gt;
&lt;br /&gt;
* Für die Eingabe von der Konsole benutzt ihr am Besten die &#039;&#039;Terminal&#039;&#039;-Klasse.&lt;br /&gt;
&lt;br /&gt;
* Es muss geprueft werden ob es sich um ein gueltiges Zeichen handelt und ob es eines der Zeichen &#039;&#039;a,s,w,d&#039;&#039; ist.&lt;br /&gt;
&lt;br /&gt;
* Das eingegebene Zeichen soll dann an die &#039;&#039;World&#039;&#039;-Klasse übergeben werden und diese soll den Spieler bewegen, falls dies möglich ist!&lt;br /&gt;
		     	 &lt;br /&gt;
Das ist das Basisgerüst für ein Spiel, ihr könnt nun weitere Sachen einfügen wie z.B. Items, die man einsammeln kann. Wie könnte man das machen? Was hat Liv Tyler in diesem Spiel für eine Aufgabe?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kommentare ==&lt;br /&gt;
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf &amp;quot;bearbeiten&amp;quot; und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 pwd&lt;br /&gt;
 cd Desktop/javakurs10/DOOM/&lt;br /&gt;
 TERM_ATTRS=&amp;quot;-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -tostop -echoprt -echoctl -echoke&amp;quot;  &lt;br /&gt;
 &lt;br /&gt;
 /bin/stty $TERM_ATTRS &lt;br /&gt;
 java -cp . GameMain&lt;br /&gt;
 &lt;br /&gt;
[[Kategorie:Java]]&lt;br /&gt;
[[Kategorie:Java_Aufgaben]]&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/OOPStateCharts&amp;diff=15828</id>
		<title>Javakurs/Übungsaufgaben/OOPStateCharts</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/OOPStateCharts&amp;diff=15828"/>
		<updated>2011-03-22T10:12:06Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: /* Aufgabenstellung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Aufgabenstellung = &lt;br /&gt;
[[Bild:OOPStatechart.png|thumb|Javakurs 2011 - StateChart]]&lt;br /&gt;
Schreibe ein Programm, welches das hier gezeigte [http://de.wikipedia.org/wiki/Zustands%C3%BCbergangsdiagramm StateChart]-Diagramm in objektorientierter Weise erzeugt.&lt;br /&gt;
&lt;br /&gt;
= Hilfestellung = &lt;br /&gt;
&lt;br /&gt;
Benutze die folgende Klasse als Basis für alle weiteren Zustände:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/**&lt;br /&gt;
 * Base Class for all states&lt;br /&gt;
 */&lt;br /&gt;
class State {&lt;br /&gt;
	// ! returns a new state, if transition is correct&lt;br /&gt;
	public State transition(String signal) {&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei jeder Aufruf von transition entweder das gleiche Objekt (&#039;&#039;this&#039;&#039;) oder ein neues Objekt zurückliefert, je nach dem, ob ein Statusübergang statt findet, oder nicht. Die &#039;&#039;main&#039;&#039;-Methode könnte dann wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/**&lt;br /&gt;
 * Class file starting main loop&lt;br /&gt;
 */&lt;br /&gt;
public class StateCharts {&lt;br /&gt;
	/**&lt;br /&gt;
	 * Main class, creating the state chart&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param args&lt;br /&gt;
	 * @throws IOException&lt;br /&gt;
	 */&lt;br /&gt;
	public static void main(String[] args) throws IOException {&lt;br /&gt;
		// set the state chart to be initial at state initial&lt;br /&gt;
		State current_state = new InitialState();&lt;br /&gt;
&lt;br /&gt;
		// loop through the state till exit is reached&lt;br /&gt;
		while (current_state != null) {&lt;br /&gt;
			// print information about current class&lt;br /&gt;
			System.out.println(&amp;quot;Current state: &amp;quot;&lt;br /&gt;
					+ current_state.getClass().getName());&lt;br /&gt;
&lt;br /&gt;
			// get signal for next state&lt;br /&gt;
			System.out.print(&amp;quot;signal to be send: &amp;quot;);&lt;br /&gt;
			InputStreamReader input = new InputStreamReader(System.in);&lt;br /&gt;
			BufferedReader reader = new BufferedReader(input);&lt;br /&gt;
			String signal = reader.readLine();&lt;br /&gt;
&lt;br /&gt;
			// get next state if needed&lt;br /&gt;
			current_state = current_state.transition(signal);&lt;br /&gt;
			System.out.println();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// inform user&lt;br /&gt;
		System.out.println(&amp;quot;StateChart is at end state.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/AsciiCraft&amp;diff=15827</id>
		<title>Javakurs/Übungsaufgaben/AsciiCraft</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/AsciiCraft&amp;diff=15827"/>
		<updated>2011-03-22T10:09:49Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine Komplexe Aufgabe, die Codelesen vertiefen soll, den Kurs zusammenfasst und einen etwas größeren Umfang als andere Aufgaben bietet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aufgabe =&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird Schritt für Schritt erklärt werden, wie das Spiel AsciiCraft, eine Anlehnung an [http://www.minecraft.net/ Minecraft], geschrieben wurde. Ziel ist es in dieser Aufgabe Quellode zu lesen, diesen zu verstehen und diesen durch Erweiterungen an eigene Vorlieben anzupassen. Dazu wirde es keine Konkreten Aufgaben geben, ziel ist es eher euch einen Plattform für eigene Experimente zu geben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
[[Bild:asciicraft.png|thumb|280px|Javakurs 2011 - AsciiCraft]]&lt;br /&gt;
Um das Programm zu verstehen, ist es wichtig, dass man eine Vorstellung bekommt, was es eigentlich tun soll. Daher bietet es sich an, dieses auf seinem Rechner/Account zu installieren. Bitte ladet euch dafür&lt;br /&gt;
das [http://docs.freitagsrunde.org/Veranstaltungen/javakurs_2011/uebungen/Javakurs2011-AsciiCraft.tar.gz Archiv von unserem Server] herunter.&lt;br /&gt;
&lt;br /&gt;
In diesem Archiv (zu entpacken mittels &#039;&#039;tar -xf&#039;&#039;, oder per grafischer Oberfläche (Linkklick auf das Archiv)) findet ihr einen Ordner und drei Skripte. Die Skripte sind zum compilieren, ausführen und löschen der Kompilate da und sollten selbsterklärend sein. Der Ordner &#039;&#039;src&#039;&#039; beinhaltet den Quellcode und wird später für uns sehr interessant werden.&lt;br /&gt;
&lt;br /&gt;
Ihr solltet nun das Projekt kompilieren (&#039;&#039;./build.sh&#039;&#039;) und es dann einmal starten (&#039;&#039;./run.sh&#039;&#039;, von der Kommandozeile aus).&lt;br /&gt;
&lt;br /&gt;
Nun solltet ihr ein ähnliches Bild wie das hier abgebildete zu sehen sein. &lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Falls, solltet ihr die Ausgaben kontrollieren und eventuelle Fehler einem Tutor melden. Auch könntet ihr probieren die Kommandozeilen Optionen euch anzusehen: &lt;br /&gt;
 &lt;br /&gt;
 ./run.sh -h&lt;br /&gt;
&lt;br /&gt;
= Ziel des Spieles: ❁ =&lt;br /&gt;
&lt;br /&gt;
Nach dem ihr im letzten Abschnitt erfolgreich das Spiel installiert und kompiliert habt, ist es nun an der Zeit die Aufgabe des Spieles kennen zu lernen: Euer Ziel ist es mit dem kleinen Pfeil (meist in der Mitte der Konsole) den Diamanten aus dem Bergwerk zu fördern. &lt;br /&gt;
&lt;br /&gt;
Dieses Ziel erreicht ihr, in dem ihr mit den Tasten &#039;&#039;A&#039;&#039; und &#039;&#039;D&#039;&#039; euch nach &#039;&#039;links&#039;&#039; oder &#039;&#039;rechts&#039;&#039; bewegt. Da ihr an der Oberfläche den Diamanten nicht finden können wird, müsst ihr mit den folgen Tasten euch in den Berg eingraben:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;E&#039;&#039; .. baut das Feld direkt über dem Spieler ab&lt;br /&gt;
* &#039;&#039;R&#039;&#039; .. gräbt das Feld ein Feld über dem das ihr anschaut an.&lt;br /&gt;
* &#039;&#039;F&#039;&#039; .. gräbt in die Richtung in die ihr gerade schaut.&lt;br /&gt;
* &#039;&#039;C&#039;&#039; .. Analog zu &#039;&#039;R&#039;&#039; legt das Feld eins unter dem Feld das ihr anschaut frei.&lt;br /&gt;
* &#039;&#039;X&#039;&#039; .. Gräbt das Feld direkt unter euch ab (&#039;&#039;Achtung: Mit Vorsicht zu genießen!!!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Damit ihr auch evtl. wieder nach oben gelangen könnt, kann der Spieler mit der Leertaste (&#039;&#039; &#039;&#039;) springen, aber nur, wenn dafür genug Platz frei ist.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Pfeiltasten&#039;&#039; und &#039;&#039;Esc&#039;&#039; sorgen dafür, dass sofort das Programm beendet wird und der GameOver-Bildschirm angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald ihr euch einen Weg zum Diamanten gegraben habt, müsst ihr ihn nur noch ausgraben, um zum Ende des Spieles zu kommen.&lt;br /&gt;
&lt;br /&gt;
= Konzept des Codes =&lt;br /&gt;
&lt;br /&gt;
Um diese Aufgabe erfolgreich und sinnvoll zu bearbeiten, ist es am besten, wenn ihr diesen Aufgabentext parallel zum Code offen lasst, damit ihr schnell zwischen der Beschreibung und dem Code hin und her schalten könnt.&lt;br /&gt;
&lt;br /&gt;
Dieser Code wurde designed, damit er möglichst viele Techniken einsetzt, die ihr schon kennen solltet. Es wurde des Weiteren versucht den Code zu dokumentieren und zu kommentieren. So werdet ihr nicht nur die Vererbeung wiederfinden, sondern auch die Kapselung, Schleifen, Arrays, Ausgabe, Variablen und eigentlich Alles was ihr wissen müsst.&lt;br /&gt;
&lt;br /&gt;
Basisidee ist die der Wiederverwendung. Es wurde versucht alle Klassen die an dem Programm beteiligt sind so zu gestallten, dass sie möglichst leicht auszutauschen sind. So lässt sich ohne großen Aufwand weitere Felder hinzufügen. Doch nun zu den bereits vorhandenen Klassen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pakete ==&lt;br /&gt;
Die Klassen die an dem Spiel beteiligt sind, findet ihr unter &#039;&#039;src/...&#039;&#039; alle Klassen sind unter dem gleichen Paket gespeichert: &#039;&#039;javakurs2011.asciicraft&#039;&#039;. Wobei ein Paket eine Unterteilung von Klassen ist. So ist es möglich, dass es Klassen gibt, die gleich heißen, aber in anderen Paketen definiert wurden. &lt;br /&gt;
&lt;br /&gt;
Eine Klasse markiert man als zu einem Paket gehörend, in dem man es in einen Unterordner der Form &#039;&#039;paket/unterpaket&#039;&#039; steckt. Des Weiteren muss jede Klasse am Anfang seiner .java Datei einen Eintrag wie folgt haben: &#039;&#039;package paket.unterpaket;&#039;&#039;, welches dafür sorgt, dass die Klasse auch als zu dem Paket gehörig erkannt wird.  (bitte beachtet, dass der &#039;&#039;/&#039;&#039; in der JavaDatei durch einen Punkt (&#039;&#039;.&#039;&#039;) ersetzt wurde.) Die Technik der Pakete wird meist in größeren Produktionen eingesetzt und wird euch in eurem weiteren Studium bestimmt noch häufiger begegegen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Abstrakte Klasse &#039;&#039;Tile&#039;&#039; ==&lt;br /&gt;
[[Bild:AsciiCraftTiles.png|thumb|280px|Invisible, Player, Diamond, Coal, Iron und Dirt &#039;&#039;Tile&#039;&#039;s]]&lt;br /&gt;
&lt;br /&gt;
Jedes der Felder, die ihr im Spiel seht, ist abgeleitet von der &#039;&#039;&#039;abstrakten&#039;&#039;&#039; Klasse &#039;&#039;Tile&#039;&#039; (konkret &#039;&#039;AirTile.java  CoalTile.java  DiamondTile.java  DirtTile.java  IronTile.java&#039;&#039;, in allen steht bei der Klassendefinition die Zeile &#039;&#039;extends Tile&#039;&#039;). Der Sinn dahinter ist, dass ihr in der abstrakten Klasse Methoden angebt, die von allen Unterklassen implementiert werden &#039;&#039;müssen&#039;&#039;. Dieser Mechanismus macht es möglich, dass man im Folgenden von der genauen Implementierung der Klasse (bspw. &#039;&#039;IronTile&#039;&#039;) abstrahiert und dieses nur noch als &#039;&#039;Tile&#039;&#039; auffasst.&lt;br /&gt;
&lt;br /&gt;
Dies wird etwas deutlicher, wenn man sich vor Augen hält, wie das Spielfeld aussieht: In der Datei &#039;&#039;World.java&#039;&#039; wird in &#039;&#039;Zeile 14&#039;&#039; ein Feld von mehreren Objekten der Klasse &#039;&#039;Tile&#039;&#039; erzeugt. Das bedeutet, dass man in diesem Array alle Unterklassen, also alle Klassen, die von &#039;&#039;Tile&#039;&#039; erben, speichern kann, und alle mindestens die Funktionalitäten von &#039;&#039;Tile&#039;&#039; anbieten. In unserem Fall ist dies noch sehr wenig, da lediglich eine Methode, die &#039;&#039;toString&#039;&#039;-Methode, von Tile als zu implementieren gekennzeichnet wurde. Vorstellbar ist aber, dass in einem späteren Zeitpunkt jedes &#039;&#039;Tile&#039;&#039; einen neue Funktionalität haben soll, wie dass beim Abbauen des Tiles eine bestimmte Methode ausgeführt werden soll. Diese Methode könnte zum Beispiel &#039;&#039;mine()&#039;&#039; heißen und könnte dafür sorgen, dass das &#039;&#039;IronTile&#039;&#039; zwei Versuche braucht um abgebaut zu werden.&lt;br /&gt;
&lt;br /&gt;
== Die Welt ==&lt;br /&gt;
Wie bereits im vorherigen Kapitel erwähnt, speichert die Klasse &#039;&#039;World&#039;&#039; alles was zur Spielwelt gehört. Dies ist nicht nur die Größe des Spielfeldes, die Spielfelder selbst, sondern auch den Spieler. Der Spieler ansich ist auch nur ein klügeres &#039;&#039;Tile&#039;&#039;. So kann er zwar genau wie anderer &#039;&#039;Tiles&#039;&#039; auch angezeigt werden, siehe &#039;&#039;toString()&#039;&#039;, aber er kann auch in der Methode &#039;&#039;simulate()&#039;&#039; sich den aktuellen Gegebenheiten anpassen. So wird gegenwärtig diese Methode dazu genutzt den Spieler auf den Boden fallen zu lassen, sobald er auf einem &#039;AirTile&#039;&#039;-Feld steht. Damit das Programm diese Entscheidung treffen kann, muss es wissen auf welcher Welt er sich befindet, also wird der &#039;&#039;simulate&#039;&#039;-Methode die Welt als Parameter mit angegeben.&lt;br /&gt;
&lt;br /&gt;
Dies Welt ist des Weiteren auch für das Anzeigen und Erstellen der neuen Spielwelt zuständig. Anzeigen tut sie, indem sie zuerst durch das Feld der &#039;&#039;Tiles&#039;&#039; geht und jedes aus dem Array heraus nimmt und dessen &#039;&#039;toString()&#039;&#039;-Methode implizit aufruft. (vgl. Zeile 154 in World.java, dort wird nicht .toString() benutzt, sondern implizit das Tile in einen String durch addieren des Tiles zu einem String, aufgerufen). Das ganze passiert jedoch nur, falls das Tile überhaupt sichtbar (&#039;&#039;.isVisible()&#039;&#039; liefert &#039;&#039;true&#039;&#039;) ist. Ist dies nicht der Fall wird lediglich ein graues Viereck angezeigt. Das Tile ist nur dann nicht sichtbar, wenn es bisher noch nicht entdeckt worden ist und unterhalb der Oberfläche liegt.&lt;br /&gt;
&lt;br /&gt;
Dies führt uns zur Erstellung des Spielfeldes. Das Spielfeld wird in der Zeile 48 der Datei &#039;&#039;World.java&#039;&#039; erzeugt. Das Erstellen des Feldes basiert sehr stark auf &#039;&#039;kontrolliertem&#039;&#039; Zufall: So wird in Zeile 50 zunächst das gesamte Spielfeld auf &#039;&#039;Luft&#039;&#039; gesetzt. Dies wird erreicht, indem an jedem Index des Feldes ein neues Element vom Typ &#039;&#039;AirTile&#039;&#039; erstellt wird. Ein Teil dieser Luft-Teile wird im Folgenden durch zufällige &#039;&#039;DirtTiles&#039;&#039; ersetzt. Basis dafür ist dass innerhalb der for-Schleife in Zeile 56 an einer zufälligen Höhe nahe der Hälfte des Spielfeldes für jeden Spalteneintrag neu bestimmt wird, ob das Tile nach oben oder unten plaziert werden soll. Nachdem die Höhe des &#039;&#039;Horizontes&#039;&#039; erstellt wurde, werden alle folgenden Teile auch als &#039;&#039;DirtTiles&#039;&#039; erstellt.&lt;br /&gt;
&lt;br /&gt;
Sobald alle &#039;&#039;DirtTile&#039;&#039;s erstellt wurden, werden erneut alle &#039;&#039;DirtTiles&#039;&#039; angefasst (Zeile 72) und zufällig durch entweder ein &#039;&#039;IronTile&#039;&#039; oder ein &#039;&#039;CoalTile&#039;&#039; ersetzt.&lt;br /&gt;
&lt;br /&gt;
Nun sind prinzipiell alle &#039;&#039;normalen&#039;&#039; Tiles erstellt und die Welt ansich ist einsatzbereit. Nun der Spaß des Programmes beginnt dann, wenn man die Welt langsam anfängt zu erforschen. Daher müssen noch alle Tiles auf &#039;&#039;unsichtbar&#039;&#039; gesetzt werden, die nicht direkt an der Oberfläche liegen. Das passiert, in dem für alle Spalten des Feldes gezählt wird, wieviele nicht-&#039;&#039;AirTiles&#039;&#039; bereits gefunden wurden. Ist diese Zahl größer als eins, bedeutet dies, dass wir unterhalb der Oberfläche sind, und somit, zumindest initial alle Tiles unsichtbar sind. Diese Annahme gilt nur, wenn wir keine Überhänge in der Oberwelt zulassen.&lt;br /&gt;
&lt;br /&gt;
Nun wird der Diamant plaziert. Dies passiert auch wieder sehr zufällig, indem einfach eine zufällige Position eines &#039;&#039;DirtTile&#039;&#039;s gesucht wird, die nahe am unteren Ende des Spielfeldes liegt. &lt;br /&gt;
&lt;br /&gt;
Nach dem Der Diamant gesetzt wurde, wird versucht, den Spieler leicht mittig auf dem Feld zu plazieren, indem nach einem &#039;&#039;AirTile&#039;&#039; in der Mittleren Spalte gesucht wird. Wurde kein Leeres Tile gefunden, so wird es bei der nächsten Spalte weiter probiert. Vorstellen kann man sich dies wie bei dem alten &#039;&#039;VierGewinnt&#039;&#039;-Spiel: Der Spieler wird in einer Spalte herein geworfen und geschaut, ob er gleich wieder oben heraus fällt. Ist dies der Fall wird er einfach bei der nächsten Spalte eingeworfen und das ganze nochmal probiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interaktion == &lt;br /&gt;
&lt;br /&gt;
Nachdem nun die Welt erstellt wurde, wir nun wissen wie wir sie anzeigen können, ist das Einzige was noch fehlt die Interaktion mit ihr. Zum Anfang des Programmes wird, wie bereits bekannt, die &#039;&#039;main&#039;&#039;-Methode ausgeführt (siehe &#039;&#039;Main.java&#039;&#039;). Diese sorgt dafür, dass wir auf dem gesamten Terminal schreiben können. Siehe dazu auch die [http://jline.sourceforge.net/ benutzte Bibliothek &#039;&#039;JLine&#039;&#039;], da diese genauer beschreibt wie genau es funkioniert. Nachdem die Bibliothek JLine initialisiert wurde, werden die Variablen von Benutzer eingelesen (Mittels der Kommandozeilen Parameter) und das Spielfeld erstellt. Folgend wird die Hauptschleife, also die, die das gesamte Programm kontrolliert gestartet. Die Idee ist, dass nach dem die Methode &#039;&#039;runMainLoop(..)&#039; zurück gekommen ist, das Programm beendet werden soll. Daher ist der letzte Aufruf der &#039;&#039;main&#039;&#039;-Methode ein Reset des Terminals, damit Alles wieder auf seinen initialen Zustand zurück gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
Das eigentlich Spannende passiert in der &#039;&#039;runMainLoopMethode(..)&#039;&#039;. Hier werden zunächst einige statistische Variablen erzeugt, die speichern wieviele &#039;&#039;Tile&#039;&#039; von den unterschiedlichen Typen abgetragen worden sind. Nach der Initialisierung dieser Variablen wird die Schleife gestartet, die erst beendet wird, wenn das Spiel beendet werden soll (also, entweder wenn der Diamant gefunden wurde, oder aber sobald eine der Pfeiltasten oder ESC gedrückt wurde.)&lt;br /&gt;
&lt;br /&gt;
Zu Allererst wird die Welt aktualisiert, indem w.simulate() aufgerufen wird. Diese Methode aktualisiert zur Zeit lediglich den Player, aber könnte Theoretisch auch für allgemeinere Situationen benutzt werden. Nachdem die SpielWelt aktualisiert wurde, ist es an der Zeit die Welt anzuzeigen. Nach dem Anzeigen wird ausgewertet, ob der Benutzer einer der Tasten gedrückt hat. Ist dies der Fall, wird geschaut, ob eines der Tile gemined werden soll. Die Überprüfung passiert in der bereits erwähnten &#039;&#039;mine()&#039;&#039;-Methode, die das Tile zurück liefert, welches gerade gemined wurde (dabei kann es sich prinzipiell auch um ein &#039;&#039;AirTile&#039;&#039; handeln.) Als nächstes wird diese Tile in der runMainLoop() ausgewertet, und die loop beendet, wenn ein &#039;&#039;DiamondTile&#039;&#039; gefunden wurde. Sonst werden einfach die Zähler der passenden Typen hochgesetzt. Nun beginnt die Schleife wieder von vorne, in dem sie zuerst die Welt aktualisiert, dann sie anzeigt und letztlich erneut die Eingaben des Benutzers auswertet.&lt;br /&gt;
&lt;br /&gt;
Nach dem die Schleife verlassen wurde, wird der &#039;&#039;GameOver&#039;&#039;-Bildschirm angezeigt, der die statistischen Variablen ausgibt.&lt;br /&gt;
&lt;br /&gt;
= Ende =&lt;br /&gt;
[[Bild:asciicraft-score.png|thumb|280px|Javakurs 2011 - AsciiCraft GameOver]]&lt;br /&gt;
&lt;br /&gt;
Damit sind wir auch schon am Ende des kurzen Überblicks über das Spiel angelangt. Jetzt bleibt euch nur zu tun, das eben gelesene noch mal revue passieren zu lassen und evtl. eigenen Erweiterungen zu schreiben (Wie wäre es zum Beispiel mit einem Mehrspielermodus, oder mit Lava, welche dem Spieler Schaden zufügt). Auch könntet ihr einfach von vorne Anfangen und ein ganz eigenes Spiel schreiben.&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/AsciiCraft&amp;diff=15826</id>
		<title>Javakurs/Übungsaufgaben/AsciiCraft</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/AsciiCraft&amp;diff=15826"/>
		<updated>2011-03-22T10:09:33Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: /* Konzept des Codes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine Komplexe Aufgabe, die Codelesen vertiefen soll, den Kurs zusammenfasst und einen etwas größeren Umfang als andere Aufgaben bietet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aufgabe =&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird Schritt für Schritt erklärt werden, wie das Spiel AsciiCraft, eine Anlehnung an [http://www.minecraft.net/ Minecraft], geschrieben wurde. Ziel ist es in dieser Aufgabe Quellode zu lesen, diesen zu verstehen und diesen durch Erweiterungen an eigene Vorlieben anzupassen. Dazu wirde es keine Konkreten Aufgaben geben, ziel ist es eher euch einen Plattform für eigene Experimente zu geben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
[[Bild:asciicraft.png|thumb|280px|Javakurs 2011 - AsciiCraft]].&lt;br /&gt;
Um das Programm zu verstehen, ist es wichtig, dass man eine Vorstellung bekommt, was es eigentlich tun soll. Daher bietet es sich an, dieses auf seinem Rechner/Account zu installieren. Bitte ladet euch dafür&lt;br /&gt;
das [http://docs.freitagsrunde.org/Veranstaltungen/javakurs_2011/uebungen/Javakurs2011-AsciiCraft.tar.gz Archiv von unserem Server] herunter.&lt;br /&gt;
&lt;br /&gt;
In diesem Archiv (zu entpacken mittels &#039;&#039;tar -xf&#039;&#039;, oder per grafischer Oberfläche (Linkklick auf das Archiv)) findet ihr einen Ordner und drei Skripte. Die Skripte sind zum compilieren, ausführen und löschen der Kompilate da und sollten selbsterklärend sein. Der Ordner &#039;&#039;src&#039;&#039; beinhaltet den Quellcode und wird später für uns sehr interessant werden.&lt;br /&gt;
&lt;br /&gt;
Ihr solltet nun das Projekt kompilieren (&#039;&#039;./build.sh&#039;&#039;) und es dann einmal starten (&#039;&#039;./run.sh&#039;&#039;, von der Kommandozeile aus).&lt;br /&gt;
&lt;br /&gt;
Nun solltet ihr ein ähnliches Bild wie das hier abgebildete zu sehen sein. &lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Falls, solltet ihr die Ausgaben kontrollieren und eventuelle Fehler einem Tutor melden. Auch könntet ihr probieren die Kommandozeilen Optionen euch anzusehen: &lt;br /&gt;
 &lt;br /&gt;
 ./run.sh -h&lt;br /&gt;
&lt;br /&gt;
= Ziel des Spieles: ❁ =&lt;br /&gt;
&lt;br /&gt;
Nach dem ihr im letzten Abschnitt erfolgreich das Spiel installiert und kompiliert habt, ist es nun an der Zeit die Aufgabe des Spieles kennen zu lernen: Euer Ziel ist es mit dem kleinen Pfeil (meist in der Mitte der Konsole) den Diamanten aus dem Bergwerk zu fördern. &lt;br /&gt;
&lt;br /&gt;
Dieses Ziel erreicht ihr, in dem ihr mit den Tasten &#039;&#039;A&#039;&#039; und &#039;&#039;D&#039;&#039; euch nach &#039;&#039;links&#039;&#039; oder &#039;&#039;rechts&#039;&#039; bewegt. Da ihr an der Oberfläche den Diamanten nicht finden können wird, müsst ihr mit den folgen Tasten euch in den Berg eingraben:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;E&#039;&#039; .. baut das Feld direkt über dem Spieler ab&lt;br /&gt;
* &#039;&#039;R&#039;&#039; .. gräbt das Feld ein Feld über dem das ihr anschaut an.&lt;br /&gt;
* &#039;&#039;F&#039;&#039; .. gräbt in die Richtung in die ihr gerade schaut.&lt;br /&gt;
* &#039;&#039;C&#039;&#039; .. Analog zu &#039;&#039;R&#039;&#039; legt das Feld eins unter dem Feld das ihr anschaut frei.&lt;br /&gt;
* &#039;&#039;X&#039;&#039; .. Gräbt das Feld direkt unter euch ab (&#039;&#039;Achtung: Mit Vorsicht zu genießen!!!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Damit ihr auch evtl. wieder nach oben gelangen könnt, kann der Spieler mit der Leertaste (&#039;&#039; &#039;&#039;) springen, aber nur, wenn dafür genug Platz frei ist.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Pfeiltasten&#039;&#039; und &#039;&#039;Esc&#039;&#039; sorgen dafür, dass sofort das Programm beendet wird und der GameOver-Bildschirm angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald ihr euch einen Weg zum Diamanten gegraben habt, müsst ihr ihn nur noch ausgraben, um zum Ende des Spieles zu kommen.&lt;br /&gt;
&lt;br /&gt;
= Konzept des Codes =&lt;br /&gt;
&lt;br /&gt;
Um diese Aufgabe erfolgreich und sinnvoll zu bearbeiten, ist es am besten, wenn ihr diesen Aufgabentext parallel zum Code offen lasst, damit ihr schnell zwischen der Beschreibung und dem Code hin und her schalten könnt.&lt;br /&gt;
&lt;br /&gt;
Dieser Code wurde designed, damit er möglichst viele Techniken einsetzt, die ihr schon kennen solltet. Es wurde des Weiteren versucht den Code zu dokumentieren und zu kommentieren. So werdet ihr nicht nur die Vererbeung wiederfinden, sondern auch die Kapselung, Schleifen, Arrays, Ausgabe, Variablen und eigentlich Alles was ihr wissen müsst.&lt;br /&gt;
&lt;br /&gt;
Basisidee ist die der Wiederverwendung. Es wurde versucht alle Klassen die an dem Programm beteiligt sind so zu gestallten, dass sie möglichst leicht auszutauschen sind. So lässt sich ohne großen Aufwand weitere Felder hinzufügen. Doch nun zu den bereits vorhandenen Klassen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pakete ==&lt;br /&gt;
Die Klassen die an dem Spiel beteiligt sind, findet ihr unter &#039;&#039;src/...&#039;&#039; alle Klassen sind unter dem gleichen Paket gespeichert: &#039;&#039;javakurs2011.asciicraft&#039;&#039;. Wobei ein Paket eine Unterteilung von Klassen ist. So ist es möglich, dass es Klassen gibt, die gleich heißen, aber in anderen Paketen definiert wurden. &lt;br /&gt;
&lt;br /&gt;
Eine Klasse markiert man als zu einem Paket gehörend, in dem man es in einen Unterordner der Form &#039;&#039;paket/unterpaket&#039;&#039; steckt. Des Weiteren muss jede Klasse am Anfang seiner .java Datei einen Eintrag wie folgt haben: &#039;&#039;package paket.unterpaket;&#039;&#039;, welches dafür sorgt, dass die Klasse auch als zu dem Paket gehörig erkannt wird.  (bitte beachtet, dass der &#039;&#039;/&#039;&#039; in der JavaDatei durch einen Punkt (&#039;&#039;.&#039;&#039;) ersetzt wurde.) Die Technik der Pakete wird meist in größeren Produktionen eingesetzt und wird euch in eurem weiteren Studium bestimmt noch häufiger begegegen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Abstrakte Klasse &#039;&#039;Tile&#039;&#039; ==&lt;br /&gt;
[[Bild:AsciiCraftTiles.png|thumb|280px|Invisible, Player, Diamond, Coal, Iron und Dirt &#039;&#039;Tile&#039;&#039;s]]&lt;br /&gt;
&lt;br /&gt;
Jedes der Felder, die ihr im Spiel seht, ist abgeleitet von der &#039;&#039;&#039;abstrakten&#039;&#039;&#039; Klasse &#039;&#039;Tile&#039;&#039; (konkret &#039;&#039;AirTile.java  CoalTile.java  DiamondTile.java  DirtTile.java  IronTile.java&#039;&#039;, in allen steht bei der Klassendefinition die Zeile &#039;&#039;extends Tile&#039;&#039;). Der Sinn dahinter ist, dass ihr in der abstrakten Klasse Methoden angebt, die von allen Unterklassen implementiert werden &#039;&#039;müssen&#039;&#039;. Dieser Mechanismus macht es möglich, dass man im Folgenden von der genauen Implementierung der Klasse (bspw. &#039;&#039;IronTile&#039;&#039;) abstrahiert und dieses nur noch als &#039;&#039;Tile&#039;&#039; auffasst.&lt;br /&gt;
&lt;br /&gt;
Dies wird etwas deutlicher, wenn man sich vor Augen hält, wie das Spielfeld aussieht: In der Datei &#039;&#039;World.java&#039;&#039; wird in &#039;&#039;Zeile 14&#039;&#039; ein Feld von mehreren Objekten der Klasse &#039;&#039;Tile&#039;&#039; erzeugt. Das bedeutet, dass man in diesem Array alle Unterklassen, also alle Klassen, die von &#039;&#039;Tile&#039;&#039; erben, speichern kann, und alle mindestens die Funktionalitäten von &#039;&#039;Tile&#039;&#039; anbieten. In unserem Fall ist dies noch sehr wenig, da lediglich eine Methode, die &#039;&#039;toString&#039;&#039;-Methode, von Tile als zu implementieren gekennzeichnet wurde. Vorstellbar ist aber, dass in einem späteren Zeitpunkt jedes &#039;&#039;Tile&#039;&#039; einen neue Funktionalität haben soll, wie dass beim Abbauen des Tiles eine bestimmte Methode ausgeführt werden soll. Diese Methode könnte zum Beispiel &#039;&#039;mine()&#039;&#039; heißen und könnte dafür sorgen, dass das &#039;&#039;IronTile&#039;&#039; zwei Versuche braucht um abgebaut zu werden.&lt;br /&gt;
&lt;br /&gt;
== Die Welt ==&lt;br /&gt;
Wie bereits im vorherigen Kapitel erwähnt, speichert die Klasse &#039;&#039;World&#039;&#039; alles was zur Spielwelt gehört. Dies ist nicht nur die Größe des Spielfeldes, die Spielfelder selbst, sondern auch den Spieler. Der Spieler ansich ist auch nur ein klügeres &#039;&#039;Tile&#039;&#039;. So kann er zwar genau wie anderer &#039;&#039;Tiles&#039;&#039; auch angezeigt werden, siehe &#039;&#039;toString()&#039;&#039;, aber er kann auch in der Methode &#039;&#039;simulate()&#039;&#039; sich den aktuellen Gegebenheiten anpassen. So wird gegenwärtig diese Methode dazu genutzt den Spieler auf den Boden fallen zu lassen, sobald er auf einem &#039;AirTile&#039;&#039;-Feld steht. Damit das Programm diese Entscheidung treffen kann, muss es wissen auf welcher Welt er sich befindet, also wird der &#039;&#039;simulate&#039;&#039;-Methode die Welt als Parameter mit angegeben.&lt;br /&gt;
&lt;br /&gt;
Dies Welt ist des Weiteren auch für das Anzeigen und Erstellen der neuen Spielwelt zuständig. Anzeigen tut sie, indem sie zuerst durch das Feld der &#039;&#039;Tiles&#039;&#039; geht und jedes aus dem Array heraus nimmt und dessen &#039;&#039;toString()&#039;&#039;-Methode implizit aufruft. (vgl. Zeile 154 in World.java, dort wird nicht .toString() benutzt, sondern implizit das Tile in einen String durch addieren des Tiles zu einem String, aufgerufen). Das ganze passiert jedoch nur, falls das Tile überhaupt sichtbar (&#039;&#039;.isVisible()&#039;&#039; liefert &#039;&#039;true&#039;&#039;) ist. Ist dies nicht der Fall wird lediglich ein graues Viereck angezeigt. Das Tile ist nur dann nicht sichtbar, wenn es bisher noch nicht entdeckt worden ist und unterhalb der Oberfläche liegt.&lt;br /&gt;
&lt;br /&gt;
Dies führt uns zur Erstellung des Spielfeldes. Das Spielfeld wird in der Zeile 48 der Datei &#039;&#039;World.java&#039;&#039; erzeugt. Das Erstellen des Feldes basiert sehr stark auf &#039;&#039;kontrolliertem&#039;&#039; Zufall: So wird in Zeile 50 zunächst das gesamte Spielfeld auf &#039;&#039;Luft&#039;&#039; gesetzt. Dies wird erreicht, indem an jedem Index des Feldes ein neues Element vom Typ &#039;&#039;AirTile&#039;&#039; erstellt wird. Ein Teil dieser Luft-Teile wird im Folgenden durch zufällige &#039;&#039;DirtTiles&#039;&#039; ersetzt. Basis dafür ist dass innerhalb der for-Schleife in Zeile 56 an einer zufälligen Höhe nahe der Hälfte des Spielfeldes für jeden Spalteneintrag neu bestimmt wird, ob das Tile nach oben oder unten plaziert werden soll. Nachdem die Höhe des &#039;&#039;Horizontes&#039;&#039; erstellt wurde, werden alle folgenden Teile auch als &#039;&#039;DirtTiles&#039;&#039; erstellt.&lt;br /&gt;
&lt;br /&gt;
Sobald alle &#039;&#039;DirtTile&#039;&#039;s erstellt wurden, werden erneut alle &#039;&#039;DirtTiles&#039;&#039; angefasst (Zeile 72) und zufällig durch entweder ein &#039;&#039;IronTile&#039;&#039; oder ein &#039;&#039;CoalTile&#039;&#039; ersetzt.&lt;br /&gt;
&lt;br /&gt;
Nun sind prinzipiell alle &#039;&#039;normalen&#039;&#039; Tiles erstellt und die Welt ansich ist einsatzbereit. Nun der Spaß des Programmes beginnt dann, wenn man die Welt langsam anfängt zu erforschen. Daher müssen noch alle Tiles auf &#039;&#039;unsichtbar&#039;&#039; gesetzt werden, die nicht direkt an der Oberfläche liegen. Das passiert, in dem für alle Spalten des Feldes gezählt wird, wieviele nicht-&#039;&#039;AirTiles&#039;&#039; bereits gefunden wurden. Ist diese Zahl größer als eins, bedeutet dies, dass wir unterhalb der Oberfläche sind, und somit, zumindest initial alle Tiles unsichtbar sind. Diese Annahme gilt nur, wenn wir keine Überhänge in der Oberwelt zulassen.&lt;br /&gt;
&lt;br /&gt;
Nun wird der Diamant plaziert. Dies passiert auch wieder sehr zufällig, indem einfach eine zufällige Position eines &#039;&#039;DirtTile&#039;&#039;s gesucht wird, die nahe am unteren Ende des Spielfeldes liegt. &lt;br /&gt;
&lt;br /&gt;
Nach dem Der Diamant gesetzt wurde, wird versucht, den Spieler leicht mittig auf dem Feld zu plazieren, indem nach einem &#039;&#039;AirTile&#039;&#039; in der Mittleren Spalte gesucht wird. Wurde kein Leeres Tile gefunden, so wird es bei der nächsten Spalte weiter probiert. Vorstellen kann man sich dies wie bei dem alten &#039;&#039;VierGewinnt&#039;&#039;-Spiel: Der Spieler wird in einer Spalte herein geworfen und geschaut, ob er gleich wieder oben heraus fällt. Ist dies der Fall wird er einfach bei der nächsten Spalte eingeworfen und das ganze nochmal probiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interaktion == &lt;br /&gt;
&lt;br /&gt;
Nachdem nun die Welt erstellt wurde, wir nun wissen wie wir sie anzeigen können, ist das Einzige was noch fehlt die Interaktion mit ihr. Zum Anfang des Programmes wird, wie bereits bekannt, die &#039;&#039;main&#039;&#039;-Methode ausgeführt (siehe &#039;&#039;Main.java&#039;&#039;). Diese sorgt dafür, dass wir auf dem gesamten Terminal schreiben können. Siehe dazu auch die [http://jline.sourceforge.net/ benutzte Bibliothek &#039;&#039;JLine&#039;&#039;], da diese genauer beschreibt wie genau es funkioniert. Nachdem die Bibliothek JLine initialisiert wurde, werden die Variablen von Benutzer eingelesen (Mittels der Kommandozeilen Parameter) und das Spielfeld erstellt. Folgend wird die Hauptschleife, also die, die das gesamte Programm kontrolliert gestartet. Die Idee ist, dass nach dem die Methode &#039;&#039;runMainLoop(..)&#039; zurück gekommen ist, das Programm beendet werden soll. Daher ist der letzte Aufruf der &#039;&#039;main&#039;&#039;-Methode ein Reset des Terminals, damit Alles wieder auf seinen initialen Zustand zurück gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
Das eigentlich Spannende passiert in der &#039;&#039;runMainLoopMethode(..)&#039;&#039;. Hier werden zunächst einige statistische Variablen erzeugt, die speichern wieviele &#039;&#039;Tile&#039;&#039; von den unterschiedlichen Typen abgetragen worden sind. Nach der Initialisierung dieser Variablen wird die Schleife gestartet, die erst beendet wird, wenn das Spiel beendet werden soll (also, entweder wenn der Diamant gefunden wurde, oder aber sobald eine der Pfeiltasten oder ESC gedrückt wurde.)&lt;br /&gt;
&lt;br /&gt;
Zu Allererst wird die Welt aktualisiert, indem w.simulate() aufgerufen wird. Diese Methode aktualisiert zur Zeit lediglich den Player, aber könnte Theoretisch auch für allgemeinere Situationen benutzt werden. Nachdem die SpielWelt aktualisiert wurde, ist es an der Zeit die Welt anzuzeigen. Nach dem Anzeigen wird ausgewertet, ob der Benutzer einer der Tasten gedrückt hat. Ist dies der Fall, wird geschaut, ob eines der Tile gemined werden soll. Die Überprüfung passiert in der bereits erwähnten &#039;&#039;mine()&#039;&#039;-Methode, die das Tile zurück liefert, welches gerade gemined wurde (dabei kann es sich prinzipiell auch um ein &#039;&#039;AirTile&#039;&#039; handeln.) Als nächstes wird diese Tile in der runMainLoop() ausgewertet, und die loop beendet, wenn ein &#039;&#039;DiamondTile&#039;&#039; gefunden wurde. Sonst werden einfach die Zähler der passenden Typen hochgesetzt. Nun beginnt die Schleife wieder von vorne, in dem sie zuerst die Welt aktualisiert, dann sie anzeigt und letztlich erneut die Eingaben des Benutzers auswertet.&lt;br /&gt;
&lt;br /&gt;
Nach dem die Schleife verlassen wurde, wird der &#039;&#039;GameOver&#039;&#039;-Bildschirm angezeigt, der die statistischen Variablen ausgibt.&lt;br /&gt;
&lt;br /&gt;
= Ende =&lt;br /&gt;
[[Bild:asciicraft-score.png|thumb|280px|Javakurs 2011 - AsciiCraft GameOver]]&lt;br /&gt;
&lt;br /&gt;
Damit sind wir auch schon am Ende des kurzen Überblicks über das Spiel angelangt. Jetzt bleibt euch nur zu tun, das eben gelesene noch mal revue passieren zu lassen und evtl. eigenen Erweiterungen zu schreiben (Wie wäre es zum Beispiel mit einem Mehrspielermodus, oder mit Lava, welche dem Spieler Schaden zufügt). Auch könntet ihr einfach von vorne Anfangen und ein ganz eigenes Spiel schreiben.&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/AsciiCraft&amp;diff=15825</id>
		<title>Javakurs/Übungsaufgaben/AsciiCraft</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/AsciiCraft&amp;diff=15825"/>
		<updated>2011-03-22T10:05:16Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: /* Ende */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eine Komplexe Aufgabe, die Codelesen vertiefen soll, den Kurs zusammenfasst und einen etwas größeren Umfang als andere Aufgaben bietet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Aufgabe =&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird Schritt für Schritt erklärt werden, wie das Spiel AsciiCraft, eine Anlehnung an [http://www.minecraft.net/ Minecraft], geschrieben wurde. Ziel ist es in dieser Aufgabe Quellode zu lesen, diesen zu verstehen und diesen durch Erweiterungen an eigene Vorlieben anzupassen. Dazu wirde es keine Konkreten Aufgaben geben, ziel ist es eher euch einen Plattform für eigene Experimente zu geben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
[[Bild:asciicraft.png|thumb|280px|Javakurs 2011 - AsciiCraft]].&lt;br /&gt;
Um das Programm zu verstehen, ist es wichtig, dass man eine Vorstellung bekommt, was es eigentlich tun soll. Daher bietet es sich an, dieses auf seinem Rechner/Account zu installieren. Bitte ladet euch dafür&lt;br /&gt;
das [http://docs.freitagsrunde.org/Veranstaltungen/javakurs_2011/uebungen/Javakurs2011-AsciiCraft.tar.gz Archiv von unserem Server] herunter.&lt;br /&gt;
&lt;br /&gt;
In diesem Archiv (zu entpacken mittels &#039;&#039;tar -xf&#039;&#039;, oder per grafischer Oberfläche (Linkklick auf das Archiv)) findet ihr einen Ordner und drei Skripte. Die Skripte sind zum compilieren, ausführen und löschen der Kompilate da und sollten selbsterklärend sein. Der Ordner &#039;&#039;src&#039;&#039; beinhaltet den Quellcode und wird später für uns sehr interessant werden.&lt;br /&gt;
&lt;br /&gt;
Ihr solltet nun das Projekt kompilieren (&#039;&#039;./build.sh&#039;&#039;) und es dann einmal starten (&#039;&#039;./run.sh&#039;&#039;, von der Kommandozeile aus).&lt;br /&gt;
&lt;br /&gt;
Nun solltet ihr ein ähnliches Bild wie das hier abgebildete zu sehen sein. &lt;br /&gt;
&lt;br /&gt;
Ist dies nicht der Falls, solltet ihr die Ausgaben kontrollieren und eventuelle Fehler einem Tutor melden. Auch könntet ihr probieren die Kommandozeilen Optionen euch anzusehen: &lt;br /&gt;
 &lt;br /&gt;
 ./run.sh -h&lt;br /&gt;
&lt;br /&gt;
= Ziel des Spieles: ❁ =&lt;br /&gt;
&lt;br /&gt;
Nach dem ihr im letzten Abschnitt erfolgreich das Spiel installiert und kompiliert habt, ist es nun an der Zeit die Aufgabe des Spieles kennen zu lernen: Euer Ziel ist es mit dem kleinen Pfeil (meist in der Mitte der Konsole) den Diamanten aus dem Bergwerk zu fördern. &lt;br /&gt;
&lt;br /&gt;
Dieses Ziel erreicht ihr, in dem ihr mit den Tasten &#039;&#039;A&#039;&#039; und &#039;&#039;D&#039;&#039; euch nach &#039;&#039;links&#039;&#039; oder &#039;&#039;rechts&#039;&#039; bewegt. Da ihr an der Oberfläche den Diamanten nicht finden können wird, müsst ihr mit den folgen Tasten euch in den Berg eingraben:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;E&#039;&#039; .. baut das Feld direkt über dem Spieler ab&lt;br /&gt;
* &#039;&#039;R&#039;&#039; .. gräbt das Feld ein Feld über dem das ihr anschaut an.&lt;br /&gt;
* &#039;&#039;F&#039;&#039; .. gräbt in die Richtung in die ihr gerade schaut.&lt;br /&gt;
* &#039;&#039;C&#039;&#039; .. Analog zu &#039;&#039;R&#039;&#039; legt das Feld eins unter dem Feld das ihr anschaut frei.&lt;br /&gt;
* &#039;&#039;X&#039;&#039; .. Gräbt das Feld direkt unter euch ab (&#039;&#039;Achtung: Mit Vorsicht zu genießen!!!&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Damit ihr auch evtl. wieder nach oben gelangen könnt, kann der Spieler mit der Leertaste (&#039;&#039; &#039;&#039;) springen, aber nur, wenn dafür genug Platz frei ist.&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;Pfeiltasten&#039;&#039; und &#039;&#039;Esc&#039;&#039; sorgen dafür, dass sofort das Programm beendet wird und der GameOver-Bildschirm angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sobald ihr euch einen Weg zum Diamanten gegraben habt, müsst ihr ihn nur noch ausgraben, um zum Ende des Spieles zu kommen.&lt;br /&gt;
&lt;br /&gt;
= Konzept des Codes =&lt;br /&gt;
&lt;br /&gt;
Um diese Aufgabe erfolgreich und sinnvol zu bearbeiten, ist es am besten, wenn ihr diesen Aufgaben Text parallel zum Code offen lasst, damit ihr schnell zwischen der Beschreibung und dem Code hin und her schalten könnt.&lt;br /&gt;
&lt;br /&gt;
Dieser Code wurde designed, damit er möglichst viele Techniken einsetzt, die ihr schon kennen solltet. Es wurde des Weiteren versucht den Code zu dokumentieren und zu kommentieren. So werdet ihr nicht nur die Vererbeung wiederfinden, sondern auch die Kapselung, Schleifen, Arrays, Ausgabe, Variablen und eigentlich Alles was ihr wissen müsst.&lt;br /&gt;
&lt;br /&gt;
Basisidee ist die der Wiederverwendung. Es wurde versucht alle Klassen die an dem Programm beteiligt sind so zu gestallten, dass sie möglichst leicht auszutauschen sind. So lässt sich ohne großen Aufwand weitere Felder hinzufügen. Doch nun zu den bereits vorhandenen Klassen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pakete ==&lt;br /&gt;
Die Klassen die an dem Spiel beteiligt sind, findet ihr unter &#039;&#039;src/...&#039;&#039; alle Klassen sind unter dem gleichen Paket gespeichert: &#039;&#039;javakurs2011.asciicraft&#039;&#039;. Wobei ein Paket eine Unterteilung von Klassen ist. So ist es möglich, dass es Klassen gibt, die gleich heißen, aber in anderen Paketen definiert wurden. &lt;br /&gt;
&lt;br /&gt;
Eine Klasse markiert man als zu einem Paket gehörend, in dem man es in einen Unterordner der Form &#039;&#039;paket/unterpaket&#039;&#039; steckt. Des Weiteren muss jede Klasse am Anfang seiner .java Datei einen Eintrag wie folgt haben: &#039;&#039;package paket.unterpaket;&#039;&#039;, welches dafür sorgt, dass die Klasse auch als zu dem Paket gehörig erkannt wird.  (bitte beachtet, dass der &#039;&#039;/&#039;&#039; in der JavaDatei durch einen Punkt (&#039;&#039;.&#039;&#039;) ersetzt wurde.) Die Technik der Pakete wird meist in größeren Produktionen eingesetzt und wird euch in eurem weiteren Studium bestimmt noch häufiger begegegen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Abstrakte Klasse &#039;&#039;Tile&#039;&#039; ==&lt;br /&gt;
[[Bild:AsciiCraftTiles.png|thumb|280px|Invisible, Player, Diamond, Coal, Iron und Dirt &#039;&#039;Tile&#039;&#039;s]]&lt;br /&gt;
&lt;br /&gt;
Jedes der Felder, die ihr im Spiel seht, ist abgeleitet von der &#039;&#039;&#039;abstrakten&#039;&#039;&#039; Klasse &#039;&#039;Tile&#039;&#039; (konkret &#039;&#039;AirTile.java  CoalTile.java  DiamondTile.java  DirtTile.java  IronTile.java&#039;&#039;, in allen steht bei der Klassendefinition die Zeile &#039;&#039;extends Tile&#039;&#039;). Der Sinn dahinter ist, dass ihr in der abstrakten Klasse Methoden angebt, die von allen Unterklassen implementiert werden &#039;&#039;müssen&#039;&#039;. Dieser Mechanismus macht es möglich, dass man im Folgenden von der genauen Implementierung der Klasse (bspw. &#039;&#039;IronTile&#039;&#039;) abstrahiert und dieses nur noch als &#039;&#039;Tile&#039;&#039; auffasst.&lt;br /&gt;
&lt;br /&gt;
Dies wird etwas deutlicher, wenn man sich vor Augen hält, wie das Spielfeld aussieht: In der Datei &#039;&#039;World.java&#039;&#039; wird in &#039;&#039;Zeile 14&#039;&#039; ein Feld von mehreren Objekten der Klasse &#039;&#039;Tile&#039;&#039; erzeugt. Das bedeutet, dass man in diesem Array alle Unterklassen, also alle Klassen, die von &#039;&#039;Tile&#039;&#039; erben, speichern kann, und alle mindestens die Funktionalitäten von &#039;&#039;Tile&#039;&#039; anbieten. In unserem Fall ist dies noch sehr wenig, da lediglich eine Methode, die &#039;&#039;toString&#039;&#039;-Methode, von Tile als zu implementieren gekennzeichnet wurde. Vorstellbar ist aber, dass in einem späteren Zeitpunkt jedes &#039;&#039;Tile&#039;&#039; einen neue Funktionalität haben soll, wie dass beim Abbauen des Tiles eine bestimmte Methode ausgeführt werden soll. Diese Methode könnte zum Beispiel &#039;&#039;mine()&#039;&#039; heißen und könnte dafür sorgen, dass das &#039;&#039;IronTile&#039;&#039; zwei Versuche braucht um abgebaut zu werden.&lt;br /&gt;
&lt;br /&gt;
== Die Welt ==&lt;br /&gt;
Wie bereits im vorherigen Kapitel erwähnt, speichert die Klasse &#039;&#039;World&#039;&#039; alles was zur Spielwelt gehört. Dies ist nicht nur die Größe des Spielfeldes, die Spielfelder selbst, sondern auch den Spieler. Der Spieler ansich ist auch nur ein klügeres &#039;&#039;Tile&#039;&#039;. So kann er zwar genau wie anderer &#039;&#039;Tiles&#039;&#039; auch angezeigt werden, siehe &#039;&#039;toString()&#039;&#039;, aber er kann auch in der Methode &#039;&#039;simulate()&#039;&#039; sich den aktuellen Gegebenheiten anpassen. So wird gegenwärtig diese Methode dazu genutzt den Spieler auf den Boden fallen zu lassen, sobald er auf einem &#039;AirTile&#039;&#039;-Feld steht. Damit das Programm diese Entscheidung treffen kann, muss es wissen auf welcher Welt er sich befindet, also wird der &#039;&#039;simulate&#039;&#039;-Methode die Welt als Parameter mit angegeben.&lt;br /&gt;
&lt;br /&gt;
Dies Welt ist des Weiteren auch für das Anzeigen und Erstellen der neuen Spielwelt zuständig. Anzeigen tut sie, indem sie zuerst durch das Feld der &#039;&#039;Tiles&#039;&#039; geht und jedes aus dem Array heraus nimmt und dessen &#039;&#039;toString()&#039;&#039;-Methode implizit aufruft. (vgl. Zeile 154 in World.java, dort wird nicht .toString() benutzt, sondern implizit das Tile in einen String durch addieren des Tiles zu einem String, aufgerufen). Das ganze passiert jedoch nur, falls das Tile überhaupt sichtbar (&#039;&#039;.isVisible()&#039;&#039; liefert &#039;&#039;true&#039;&#039;) ist. Ist dies nicht der Fall wird lediglich ein graues Viereck angezeigt. Das Tile ist nur dann nicht sichtbar, wenn es bisher noch nicht entdeckt worden ist und unterhalb der Oberfläche liegt.&lt;br /&gt;
&lt;br /&gt;
Dies führt uns zur Erstellung des Spielfeldes. Das Spielfeld wird in der Zeile 48 der Datei &#039;&#039;World.java&#039;&#039; erzeugt. Das Erstellen des Feldes basiert sehr stark auf &#039;&#039;kontrolliertem&#039;&#039; Zufall: So wird in Zeile 50 zunächst das gesamte Spielfeld auf &#039;&#039;Luft&#039;&#039; gesetzt. Dies wird erreicht, indem an jedem Index des Feldes ein neues Element vom Typ &#039;&#039;AirTile&#039;&#039; erstellt wird. Ein Teil dieser Luft-Teile wird im Folgenden durch zufällige &#039;&#039;DirtTiles&#039;&#039; ersetzt. Basis dafür ist dass innerhalb der for-Schleife in Zeile 56 an einer zufälligen Höhe nahe der Hälfte des Spielfeldes für jeden Spalteneintrag neu bestimmt wird, ob das Tile nach oben oder unten plaziert werden soll. Nachdem die Höhe des &#039;&#039;Horizontes&#039;&#039; erstellt wurde, werden alle folgenden Teile auch als &#039;&#039;DirtTiles&#039;&#039; erstellt.&lt;br /&gt;
&lt;br /&gt;
Sobald alle &#039;&#039;DirtTile&#039;&#039;s erstellt wurden, werden erneut alle &#039;&#039;DirtTiles&#039;&#039; angefasst (Zeile 72) und zufällig durch entweder ein &#039;&#039;IronTile&#039;&#039; oder ein &#039;&#039;CoalTile&#039;&#039; ersetzt.&lt;br /&gt;
&lt;br /&gt;
Nun sind prinzipiell alle &#039;&#039;normalen&#039;&#039; Tiles erstellt und die Welt ansich ist einsatzbereit. Nun der Spaß des Programmes beginnt dann, wenn man die Welt langsam anfängt zu erforschen. Daher müssen noch alle Tiles auf &#039;&#039;unsichtbar&#039;&#039; gesetzt werden, die nicht direkt an der Oberfläche liegen. Das passiert, in dem für alle Spalten des Feldes gezählt wird, wieviele nicht-&#039;&#039;AirTiles&#039;&#039; bereits gefunden wurden. Ist diese Zahl größer als eins, bedeutet dies, dass wir unterhalb der Oberfläche sind, und somit, zumindest initial alle Tiles unsichtbar sind. Diese Annahme gilt nur, wenn wir keine Überhänge in der Oberwelt zulassen.&lt;br /&gt;
&lt;br /&gt;
Nun wird der Diamant plaziert. Dies passiert auch wieder sehr zufällig, indem einfach eine zufällige Position eines &#039;&#039;DirtTile&#039;&#039;s gesucht wird, die nahe am unteren Ende des Spielfeldes liegt. &lt;br /&gt;
&lt;br /&gt;
Nach dem Der Diamant gesetzt wurde, wird versucht, den Spieler leicht mittig auf dem Feld zu plazieren, indem nach einem &#039;&#039;AirTile&#039;&#039; in der Mittleren Spalte gesucht wird. Wurde kein Leeres Tile gefunden, so wird es bei der nächsten Spalte weiter probiert. Vorstellen kann man sich dies wie bei dem alten &#039;&#039;VierGewinnt&#039;&#039;-Spiel: Der Spieler wird in einer Spalte herein geworfen und geschaut, ob er gleich wieder oben heraus fällt. Ist dies der Fall wird er einfach bei der nächsten Spalte eingeworfen und das ganze nochmal probiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interaktion == &lt;br /&gt;
&lt;br /&gt;
Nachdem nun die Welt erstellt wurde, wir nun wissen wie wir sie anzeigen können, ist das Einzige was noch fehlt die Interaktion mit ihr. Zum Anfang des Programmes wird, wie bereits bekannt, die &#039;&#039;main&#039;&#039;-Methode ausgeführt (siehe &#039;&#039;Main.java&#039;&#039;). Diese sorgt dafür, dass wir auf dem gesamten Terminal schreiben können. Siehe dazu auch die [http://jline.sourceforge.net/ benutzte Bibliothek &#039;&#039;JLine&#039;&#039;], da diese genauer beschreibt wie genau es funkioniert. Nachdem die Bibliothek JLine initialisiert wurde, werden die Variablen von Benutzer eingelesen (Mittels der Kommandozeilen Parameter) und das Spielfeld erstellt. Folgend wird die Hauptschleife, also die, die das gesamte Programm kontrolliert gestartet. Die Idee ist, dass nach dem die Methode &#039;&#039;runMainLoop(..)&#039; zurück gekommen ist, das Programm beendet werden soll. Daher ist der letzte Aufruf der &#039;&#039;main&#039;&#039;-Methode ein Reset des Terminals, damit Alles wieder auf seinen initialen Zustand zurück gesetzt wird.&lt;br /&gt;
&lt;br /&gt;
Das eigentlich Spannende passiert in der &#039;&#039;runMainLoopMethode(..)&#039;&#039;. Hier werden zunächst einige statistische Variablen erzeugt, die speichern wieviele &#039;&#039;Tile&#039;&#039; von den unterschiedlichen Typen abgetragen worden sind. Nach der Initialisierung dieser Variablen wird die Schleife gestartet, die erst beendet wird, wenn das Spiel beendet werden soll (also, entweder wenn der Diamant gefunden wurde, oder aber sobald eine der Pfeiltasten oder ESC gedrückt wurde.)&lt;br /&gt;
&lt;br /&gt;
Zu Allererst wird die Welt aktualisiert, indem w.simulate() aufgerufen wird. Diese Methode aktualisiert zur Zeit lediglich den Player, aber könnte Theoretisch auch für allgemeinere Situationen benutzt werden. Nachdem die SpielWelt aktualisiert wurde, ist es an der Zeit die Welt anzuzeigen. Nach dem Anzeigen wird ausgewertet, ob der Benutzer einer der Tasten gedrückt hat. Ist dies der Fall, wird geschaut, ob eines der Tile gemined werden soll. Die Überprüfung passiert in der bereits erwähnten &#039;&#039;mine()&#039;&#039;-Methode, die das Tile zurück liefert, welches gerade gemined wurde (dabei kann es sich prinzipiell auch um ein &#039;&#039;AirTile&#039;&#039; handeln.) Als nächstes wird diese Tile in der runMainLoop() ausgewertet, und die loop beendet, wenn ein &#039;&#039;DiamondTile&#039;&#039; gefunden wurde. Sonst werden einfach die Zähler der passenden Typen hochgesetzt. Nun beginnt die Schleife wieder von vorne, in dem sie zuerst die Welt aktualisiert, dann sie anzeigt und letztlich erneut die Eingaben des Benutzers auswertet.&lt;br /&gt;
&lt;br /&gt;
Nach dem die Schleife verlassen wurde, wird der &#039;&#039;GameOver&#039;&#039;-Bildschirm angezeigt, der die statistischen Variablen ausgibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Ende =&lt;br /&gt;
[[Bild:asciicraft-score.png|thumb|280px|Javakurs 2011 - AsciiCraft GameOver]]&lt;br /&gt;
&lt;br /&gt;
Damit sind wir auch schon am Ende des kurzen Überblicks über das Spiel angelangt. Jetzt bleibt euch nur zu tun, das eben gelesene noch mal revue passieren zu lassen und evtl. eigenen Erweiterungen zu schreiben (Wie wäre es zum Beispiel mit einem Mehrspielermodus, oder mit Lava, welche dem Spieler Schaden zufügt). Auch könntet ihr einfach von vorne Anfangen und ein ganz eigenes Spiel schreiben.&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/OOPStateCharts&amp;diff=15824</id>
		<title>Javakurs/Übungsaufgaben/OOPStateCharts</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Javakurs/%C3%9Cbungsaufgaben/OOPStateCharts&amp;diff=15824"/>
		<updated>2011-03-22T10:02:41Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: /* Aufgabenstellung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Aufgabenstellung = &lt;br /&gt;
[[Bild:OOPStatechart.png|thumb|Javakurs 2011 - StateChart]].&lt;br /&gt;
Schreibe ein Programm, welches in objektorientierter Weise, das hier gezeigte Diagramm als [http://de.wikipedia.org/wiki/Zustands%C3%BCbergangsdiagramm StateChart] erzeugt.&lt;br /&gt;
&lt;br /&gt;
= Hilfestellung = &lt;br /&gt;
&lt;br /&gt;
Benutze die folgende Klasse als Basis für alle weiteren Zustände:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/**&lt;br /&gt;
 * Base Class for all states&lt;br /&gt;
 */&lt;br /&gt;
class State {&lt;br /&gt;
	// ! returns a new state, if transition is correct&lt;br /&gt;
	public State transition(String signal) {&lt;br /&gt;
		return this;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei jeder Aufruf von transition entweder das gleiche Objekt (&#039;&#039;this&#039;&#039;) oder ein neues Objekt zurückliefert, je nach dem, ob ein Statusübergang statt findet, oder nicht. Die &#039;&#039;main&#039;&#039;-Methode könnte dann wie folgt aussehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;/**&lt;br /&gt;
 * Class file starting main loop&lt;br /&gt;
 */&lt;br /&gt;
public class StateCharts {&lt;br /&gt;
	/**&lt;br /&gt;
	 * Main class, creating the state chart&lt;br /&gt;
	 * &lt;br /&gt;
	 * @param args&lt;br /&gt;
	 * @throws IOException&lt;br /&gt;
	 */&lt;br /&gt;
	public static void main(String[] args) throws IOException {&lt;br /&gt;
		// set the state chart to be initial at state initial&lt;br /&gt;
		State current_state = new InitialState();&lt;br /&gt;
&lt;br /&gt;
		// loop through the state till exit is reached&lt;br /&gt;
		while (current_state != null) {&lt;br /&gt;
			// print information about current class&lt;br /&gt;
			System.out.println(&amp;quot;Current state: &amp;quot;&lt;br /&gt;
					+ current_state.getClass().getName());&lt;br /&gt;
&lt;br /&gt;
			// get signal for next state&lt;br /&gt;
			System.out.print(&amp;quot;signal to be send: &amp;quot;);&lt;br /&gt;
			InputStreamReader input = new InputStreamReader(System.in);&lt;br /&gt;
			BufferedReader reader = new BufferedReader(input);&lt;br /&gt;
			String signal = reader.readLine();&lt;br /&gt;
&lt;br /&gt;
			// get next state if needed&lt;br /&gt;
			current_state = current_state.transition(signal);&lt;br /&gt;
			System.out.println();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// inform user&lt;br /&gt;
		System.out.println(&amp;quot;StateChart is at end state.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Diskussion:Ewoche/seidaktiv&amp;diff=15238</id>
		<title>Diskussion:Ewoche/seidaktiv</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Diskussion:Ewoche/seidaktiv&amp;diff=15238"/>
		<updated>2010-10-20T11:37:40Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bitte drückt jetzt auf das Plus, damit ihr einen Kommentar hinterlasst.  Damit wir wissen, wer diesen Kommentar geschrieben hat, schreibt bitte  das gleiche auch auf eure Abgabe. &lt;br /&gt;
&lt;br /&gt;
== Kommentar ==&lt;br /&gt;
&lt;br /&gt;
Hallo liebe &amp;lt;u&amp;gt;&#039;&#039;&#039;Erst&#039;&#039;&#039;&amp;lt;/u&amp;gt;semester  --[[Benutzer:Tkroenert|Tkroenert]] 13:56, 30. Sep. 2010 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Hallo ==&lt;br /&gt;
&lt;br /&gt;
Hallo von der Zimt gruppe.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Gruppe hat die Aufgabe 12 bearbeitet.&lt;br /&gt;
&lt;br /&gt;
Aufgabe 12 erledigt. (&amp;gt;°-°)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDF-Gruppe&lt;br /&gt;
&lt;br /&gt;
easy breazy... NEXT!&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Hallo liebe Freitagsrunde und andere Gruppen!&lt;br /&gt;
Hier ein kleiner Insiderwitz!&lt;br /&gt;
&lt;br /&gt;
Ein Informatiker, ein Elektroniker, ein Maschienenbauer und ein Elektrotechniker sitzen in einem Auto.&lt;br /&gt;
Sie fahren gemütlich über eine Landstraße,als das Auto plötzlich stehen bleibt und sich nicht mehr zum Weiterfahren bewegen lässt.&lt;br /&gt;
Der Elektrotechniker beschwert sich in der nun aufkommenden Diskussion gleich darüber, dass die Batterien einiger Hersteller einfach Katastrophürchterlich sind und das Auto sicher einen Schaden an der Batterie hat.&lt;br /&gt;
Der Maschienenbauer hingegen ist davon überzeugt, dass er kurz vor dem Schaden ein Geräsch am Motor bemerkt hat und der Defekt sicher dort zu suchen ist.&lt;br /&gt;
Der Elektroniker ist mit beidem nicht einverstanden und glaubt das Problem befindet sich in der Bordelektronik: &amp;quot;wird ja auch immer komplexer, das Zeug!&amp;quot; &lt;br /&gt;
&amp;quot;Ist ja ganz egal, an was es liegt&amp;quot;, sagt der Informatiker, &amp;quot;jetzt steigen wir kurz aus, dann steigen wir wieder ein und das Auto läuft wieder!&amp;quot;&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Diskussion:Ewoche/seidaktiv&amp;diff=15237</id>
		<title>Diskussion:Ewoche/seidaktiv</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Diskussion:Ewoche/seidaktiv&amp;diff=15237"/>
		<updated>2010-10-20T11:36:37Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bitte drückt jetzt auf das Plus, damit ihr einen Kommentar hinterlasst.  Damit wir wissen, wer diesen Kommentar geschrieben hat, schreibt bitte  das gleiche auch auf eure Abgabe. &lt;br /&gt;
&lt;br /&gt;
== Kommentar ==&lt;br /&gt;
&lt;br /&gt;
Hallo liebe &amp;lt;u&amp;gt;&#039;&#039;&#039;Erst&#039;&#039;&#039;&amp;lt;/u&amp;gt;semester  --[[Benutzer:Tkroenert|Tkroenert]] 13:56, 30. Sep. 2010 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Hallo ==&lt;br /&gt;
&lt;br /&gt;
Hallo von der Zimt gruppe.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Gruppe hat die Aufgabe 12 bearbeitet.&lt;br /&gt;
&lt;br /&gt;
Aufgabe 12 erledigt. (&amp;gt;°-°)&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDF-Gruppe&lt;br /&gt;
&lt;br /&gt;
easy breazy... NEXT!&lt;br /&gt;
&lt;br /&gt;
Hallo liebe Freitagsrunde und andere Gruppen!&lt;br /&gt;
Hier ein kleiner Insiderwitz!&lt;br /&gt;
&lt;br /&gt;
Ein Informatiker, ein Elektroniker, ein Maschienenbauer und ein Elektrotechniker sitzen in einem Auto.&lt;br /&gt;
Sie fahren gemütlich über eine Landstraße,als das Auto plötzlich stehen bleibt und sich nicht mehr zum Weiterfahren bewegen lässt.&lt;br /&gt;
Der Elektrotechniker beschwert sich in der nun aufkommenden Diskussion gleich darüber, dass die Batterien einiger Hersteller einfach Katastrophürchterlich sind und das Auto sicher einen Schaden an der Batterie hat.&lt;br /&gt;
Der Maschienenbauer hingegen ist davon überzeugt, dass er kurz vor dem Schaden ein Geräsch am Motor bemerkt hat und der Defekt sicher dort zu suchen ist.&lt;br /&gt;
Der Elektroniker ist mit beidem nicht einverstanden und glaubt das Problem befindet sich in der Bordelektronik: &amp;quot;wird ja auch immer komplexer, das Zeug!&amp;quot; &lt;br /&gt;
&amp;quot;Ist ja ganz egal, an was es liegt&amp;quot;, sagt der Informatiker, &amp;quot;jetzt steigen wir kurz aus, dann steigen wir wieder ein und das Auto läuft wieder!&amp;quot;&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Eclipsekurs_2005&amp;diff=4687</id>
		<title>Eclipsekurs 2005</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Eclipsekurs_2005&amp;diff=4687"/>
		<updated>2005-04-19T09:48:51Z</updated>

		<summary type="html">&lt;p&gt;130.149.17.34: /* Anmeldung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Kurzbeschreibung ===&lt;br /&gt;
&lt;br /&gt;
[[IBM Eclipse | Eclipse]] ist eine [[Java IDE Einleitung| IDE]], mit der sich insbesondere Java-Programme schneller und bequemer erstellen lassen. Allerdings ist Eclipse sehr komplex und insbesondere der Start könnte vielleicht dem einen oder anderen etwas schwer fallen.&lt;br /&gt;
&lt;br /&gt;
Wir veranstalten daher wie jedes Jahr einen 2-stündigen Einführungskurs, in dem die basics gezeigt werden. Es geht also um Starthilfe, nicht um die neuesten Eclipse-Tricks oder die besten Plugins. Zielgruppe sind insbesondere Hörer von [[Informatik 2]], aber auch alle anderen Interessenten sind willkommen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Zeit und Ort ===&lt;br /&gt;
Datum: &#039;&#039;&#039;Donnerstag, 21. April 2005&#039;&#039;&#039; &amp;lt;br/&amp;gt;&lt;br /&gt;
Zeit: ab 16:15 &amp;lt;br/&amp;gt;&lt;br /&gt;
Dauer: 90 Minuten (einmalig) &amp;lt;br/&amp;gt;&lt;br /&gt;
SWS: keine (studentische Veranstaltung)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Themen ===&lt;br /&gt;
* Projekte anlegen&lt;br /&gt;
* Java-Programme schreiben &amp;amp; ausführen&lt;br /&gt;
* Debugging&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Anmeldung ===&lt;br /&gt;
Habt bitte Verständnis, dass schon auf Grund der Raumsituation eine Teilnehmerbeschränkung (35 Personen) einführen müssen. Wir setzen aber wirklich viel daran, dass auch jeder teilnehmen kann, im letzten Jahr haben wir daher zwei Kurse gehalten. Bisher konnte immer jeder Interessent am Kurs teilnehmen!&lt;br /&gt;
&lt;br /&gt;
Um euch für den Kurs anzumelden, tragt euch bitte unten in der Liste ein. Für Leute, die noch nie ein Wiki benutzt haben: Auf &#039;bearbeiten&#039; klicken (neben der Anmelden-Überschrift), dann im Textfeld die gewünschte Änderung durchführen und anschließend &#039;Artikel speichern&#039;.&lt;br /&gt;
&lt;br /&gt;
Teilnehmerliste:&lt;br /&gt;
* Mein Name (cs-Userid oder emailadresse)&lt;br /&gt;
Florian Zeidler(fzeidler@cs.tu-berlin.de)&lt;br /&gt;
Thilo Schmidt (dude@cs.tu-berlin.de)&lt;br /&gt;
Alexander Oppermann (opix@cs.tu-berlin.de)&lt;br /&gt;
Nicolas Poczka (npoczka@cs.tu-berlin.de)&lt;br /&gt;
Daniel Giancaterino(italia@cs.tu-berlin.de)&lt;/div&gt;</summary>
		<author><name>130.149.17.34</name></author>
	</entry>
</feed>