logo

Programmieren oder so ähnlich


Grundgerüst für ein Game mit Java

Posted in Java, Projekt, Programmieren allgemein von admin am 9. Jul. 2008

Ein neues Projekt wurde gestartet. Ob ich es jemals vollenden werde liegt noch in den Sternen.

Ich habe mir gedacht ein primitives Spiel mit Java zu programmieren. Aussehen soll es wie ein Strategiespiel (2D-Grafik). Für den Anfang dachte ich mir ein Spielfeld zu realisieren, auf dem man Objekte - wie man sich es bei Strategiespielen gewohnt ist - irgendwo hinschicken kann. Dies wird mit einer 2D-Optik dargestellt.

Bis jetzt habe ich ein bisschen Codeschnippsel, welches zwei Objekte (”Hans” und “Peter”) erstellt und diese auf eine Koordinate auf dem Spielfeld laufen lässt. Der nächste Schritt wäre Funktionen für die grafische Darstellung zu programmieren und das Spiel danach immer mehr und mehr erweitern (Steuerung mit der Maus, Objekte die sich gegenseitig attackieren, künstliche Intelligenz, usw.).

Mein Grundgerüst kann auf eigene Gefahr übernommen werden. Falls es neuere Versionen geben wird, werde ich diese natürlich zur Verfügung stellen.

Die Klasse “Spiel”


/**
 * Die Klasse Spiel stellt das ganze Spiel dar.
 * Hier wird das Spiel gestartet, wobei ständig ein Zyklus abläuft.
 * Ein Takt ist ein Durchlauf des Zyklus, bei dem Aktionen von allen Objekten ausgeführt werden.
 * @author Klaudio Gospic (www.klajo.com)
 * @since 1.6
 * @version 1.00
 *
 */
public class Spiel {
	private Objekt[][] 			spielfeld;				//Das Spielbrett mit den Objekten drauf (sozusagen)
	private boolean 			finish;					//Kennzeichnet das Ende des Spiels
	private long 				geschwindigkeit;		//Geschwindigkeit eines Taktes in Milisekunden
	private Objekt[] 			gespielt;				//Liste mit allen Objekte, die eine Aktion hatten während eines Taktes
	private static final int 	MAXOBJEKTE 		= 100;	//Anzahl maximaler Objekte im Spiel
	private static final int 	XFELDER 		= 100;	//Anzahl X-Felder
	private static final int 	YFELDER 		= 100;	//Anzahl Y-Felder
	private static final long 	GESCHWINDIGKEIT = 1000;	//Geschwindigkeit eines Taktes in Milisekunden

	/**
	 * Konstruktor der Klasse Spiel.
	 * @param x					Anzahl X-Felder
	 * @param y					Anzahl Y-Felder
	 * @param geschwindigkeit	Geschwindigkeit eines Taktes in Milisekunden
	 */
	Spiel(int x, int y, long geschwindigkeit) {
		this.spielfeld 			= new Objekt[x][y];
		this.finish 			= false;
		this.geschwindigkeit 	= geschwindigkeit;
	}

	/**
	 * Start-Methode der Klasse Spiel. Mit dieser Methode
	 * wird ein Spiel gestartet.
	 * @param Args	-
	 */
	public static void main(String Args[]) {
		//Hier werden für den Anfang noch statisch Objekte erzeugt und je eine Aktion gesetzt.
		Spiel spiel = new Spiel(XFELDER,YFELDER, GESCHWINDIGKEIT);
		spiel.spielfeld[50][50] = new Objekt("Hans", 3, 50, 50);
		spiel.spielfeld[10][0] 	= new Objekt("Peter", 4, 10, 0);
		spiel.spielfeld[50][50].setZielX(20);
		spiel.spielfeld[50][50].setZielY(35);
		spiel.spielfeld[10][0].setZielX(1);
		spiel.spielfeld[10][0].setZielY(90);		

		while(!spiel.finish) { //Solange Spiel läuft, den Zyklus ablaufen lassen
			//Beginn des Taktes

			//Liste "gespielt" initialisieren
			spiel.gespielt = new Objekt[MAXOBJEKTE];

			spiel.finish = true;
			try {
				Thread.sleep(spiel.geschwindigkeit); //Spielgeschwindigkeit beeinflussen
			} catch(InterruptedException e) {
				//Exception abfangen
			}

			//Alle Spielfelder durchlaufen
			for(int i = 0; i < spiel.spielfeld.length; i++) {
				for(int j = 0; j < spiel.spielfeld[i].length; j++) {
					if(spiel.spielfeld[i][j] != null) {
						//Objekt nur bewegen, wenn es in diesem Takt noch keine Aktion hatte und sein Ziel noch nicht erreicht hat
						if(!spiel.arrayContainObject(spiel.gespielt, spiel.spielfeld[i][j])) {
							if(spiel.spielfeld[i][j].getXPos() != spiel.spielfeld[i][j].getZielX() || spiel.spielfeld[i][j].getYPos() != spiel.spielfeld[i][j].getZielY()) {
								spiel.spielfeld[i][j].bewegen(); //Objekt bewegen
								spiel.spielfeld[i][j].meldePosition(); //Position ausgeben
								spiel.spielfeld[spiel.spielfeld[i][j].getXPos()][spiel.spielfeld[i][j].getYPos()] = spiel.spielfeld[i][j]; //Objekt auf dem Spielfeld bewegen (zur neuen Position)
								spiel.finish = false; //Das Spiel kann noch einen Takt machen
								spiel.addGespielt(spiel, spiel.spielfeld[i][j].getXPos(), spiel.spielfeld[i][j].getYPos()); //Vermerken, dass das Objekt eine Aktion hatte
								spiel.spielfeld[i][j] = null; //Alte Position (vor der Bewegung) leeren

							}
						}
					}
				}
			}
		}
		//Ende des Taktes
		System.out.println("ENDE");
	}

	/**
	 * Prüft, ob ein Objekt in einer Liste enthalten ist.
	 * @param liste		Liste in der das Objekt vorhanden sein könnte.
	 * @param objekt	Objekt, nach welchem gesucht werden soll.
	 * @return			Boolean-Wert, ob das Objekt in der Liste vorhanden ist oder nicht.
	 */
	public boolean arrayContainObject(Objekt[] liste, Objekt objekt) {
		if(liste != null) {
			for(int i = 0; i < liste.length; i++) {
				if(liste[i] != null) {
					if(liste[i].equals(objekt)){
						return true;
					}
				}
			}
		}
		return false;
	}

	/**
	 * Ein Objekt der Liste "gespielt" hinzufügen.
	 * @param spiel	Das aktuelle Spiel
	 * @param x		X-Position des Objekts
	 * @param y		Y-Position des Objekts
	 */
	public void addGespielt(Spiel spiel, int x, int y) {
		for(int k = 0; k < spiel.gespielt.length; k++) {
			if(spiel.gespielt[k] == null) {
				spiel.gespielt[k] = spiel.spielfeld[x][y];
				break;
			}
		}
	}

	/**
	 * @return the spielfeld
	 */
	public Objekt[][] getSpielfeld() {
		return spielfeld;
	}

	/**
	 * @param spielfeld the spielfeld to set
	 */
	public void setSpielfeld(Objekt[][] spielfeld) {
		this.spielfeld = spielfeld;
	}

	/**
	 * @return the finish
	 */
	public boolean isFinish() {
		return finish;
	}

	/**
	 * @param finish the finish to set
	 */
	public void setFinish(boolean finish) {
		this.finish = finish;
	}

	/**
	 * @return the geschwindigkeit
	 */
	public long getGeschwindigkeit() {
		return geschwindigkeit;
	}

	/**
	 * @param geschwindigkeit the geschwindigkeit to set
	 */
	public void setGeschwindigkeit(long geschwindigkeit) {
		this.geschwindigkeit = geschwindigkeit;
	}

	/**
	 * @return the gespielt
	 */
	public Objekt[] getGespielt() {
		return gespielt;
	}

	/**
	 * @param gespielt the gespielt to set
	 */
	public void setGespielt(Objekt[] gespielt) {
		this.gespielt = gespielt;
	}

	/**
	 * @return the mAXOBJEKTE
	 */
	public static int getMAXOBJEKTE() {
		return MAXOBJEKTE;
	}

	/**
	 * @return the xFELDER
	 */
	public static int getXFELDER() {
		return XFELDER;
	}

	/**
	 * @return the yFELDER
	 */
	public static int getYFELDER() {
		return YFELDER;
	}

	/**
	 * @return the gESCHWINDIGKEIT
	 */
	public static long getGESCHWINDIGKEIT() {
		return GESCHWINDIGKEIT;
	}

}

und zu guter letzt die Klasse “Objekt”


/**
 * Die Klasse Objekt stellt ein Objekt auf dem Spielfeld dar.
 * Dieses Objekt kann z.B. ein Mensch,Tier, etc sein.
 * @author Klaudio Gospic (www.klajo.com)
 * @since 1.6
 * @version 1.00
 *
 */
public class Objekt {
	private String 	name;				//Name des Objekts
	private int 	xPos;				//Aktuelle Position auf der X-Achse
	private int 	yPos;				//Aktuelle Position auf der Y-Achse
	private boolean aktiv;				//Ist das Objekt gerade aktiv?
	private int 	geschwindigkeit;	//Felder pro Takt, die das Objekt vorwärts läuft
	private int 	zielX;				//Ziel-Position auf der X-Achse
	private int 	zielY;				//Ziel-Position auf der Y-Achse

	/**
	 * Konstruktor der Klasse Objekt.
	 * @param name				Name des Objekts
	 * @param geschwindigkeit	Felder pro Takt, die das Objekt vorwärts läuft
	 * @param xPos				Aktuelle Position auf der X-Achse
	 * @param yPos				Aktuelle Position auf der Y-Achse
	 */
	Objekt(String name, int geschwindigkeit, int xPos, int yPos) {
		this.name 				= name;
		this.geschwindigkeit 	= geschwindigkeit;
		this.xPos 				= xPos;
		this.yPos				= yPos;
	}

	/**
	 * Bewegt das Objekt für einen Takt
	 */
	public void bewegen() {
		//Nur bewegen wenn Ziel nicht erreicht wurde
		if(this.xPos != this.zielX || this.yPos != this.zielY) {
			this.aktiv = true;
			for(int i = 0; i < this.geschwindigkeit; i++) {
				//x-Position setzen
				if(this.xPos < this.zielX) {
					this.xPos++;
				} else if (this.xPos > this.zielX) {
					this.xPos–;
				}
				//y-Position setzen
				if(this.yPos < this.zielY) {
					this.yPos++;
				} else if (this.yPos > this.zielY) {
					this.yPos–;
				}
			}
		} else {
			this.aktiv = false;
		}
	}

	/**
	 * Gibt die aktuelle Position des Objekts aus.
	 */
	public void meldePosition() {
		System.out.println(”Objekt: ” + this.name + ” befindet sich auf der Position ” + this.xPos + “/” + this.yPos);
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the xPos
	 */
	public int getXPos() {
		return xPos;
	}

	/**
	 * @param pos the xPos to set
	 */
	public void setXPos(int pos) {
		xPos = pos;
	}

	/**
	 * @return the yPos
	 */
	public int getYPos() {
		return yPos;
	}

	/**
	 * @param pos the yPos to set
	 */
	public void setYPos(int pos) {
		yPos = pos;
	}

	/**
	 * @return the aktiv
	 */
	public boolean isAktiv() {
		return aktiv;
	}

	/**
	 * @param aktiv the aktiv to set
	 */
	public void setAktiv(boolean aktiv) {
		this.aktiv = aktiv;
	}

	/**
	 * @return the geschwindigkeit
	 */
	public int getGeschwindigkeit() {
		return geschwindigkeit;
	}

	/**
	 * @param geschwindigkeit the geschwindigkeit to set
	 */
	public void setGeschwindigkeit(int geschwindigkeit) {
		this.geschwindigkeit = geschwindigkeit;
	}

	/**
	 * @return the zielX
	 */
	public int getZielX() {
		return zielX;
	}

	/**
	 * @param zielX the zielX to set
	 */
	public void setZielX(int zielX) {
		this.zielX = zielX;
	}

	/**
	 * @return the zielY
	 */
	public int getZielY() {
		return zielY;
	}

	/**
	 * @param zielY the zielY to set
	 */
	public void setZielY(int zielY) {
		this.zielY = zielY;
	}

}

Schon mal was von Redaxo gehört?

Posted in CMS, MySQL, PHP, Web Development von admin am 25. Mai. 2008

Joomla, Wordpress, Typo3 sind für die meisten Webentwickler bekannte Begriffe.

Wie sieht es aber mit Redaxo aus? Nein? Dann will ich hier mal meine Erfahrungen und Meinungen zum CMS Redaxo preisgeben.

Einstieg in die CMS-Programmierung

Bislang habe ich nie grossartig an einem CMS rumprogrammiert. Als ich aber für einen Internetauftritt, dessen Grundstein (das installierte Redaxo CMS) bereits vorhanden war, viele Modifikationen machen und Special-Wünsche erfüllen musste, hatte ich es zum ersten mal mit der Programmierung in einem CMS zu tun.

Folgende Punkte machten mir die Hölle heiss:

  • Ich kannte das CMS gar nicht. Was ist ein Addon? Was ein Modul?
  • Objektorientiert programmieren mit PHP? Damals hatte ich es nicht mehr als ein Mal gemacht. Hab z.B. oft die Klammern bei den Methoden vergessen wie hier –> $artikel->getCategory->getId();
  • Die Klassen und Methoden, die ich benötigte waren mir vorerst alle unbekannt.
  • Redaxo gibt es bereits in der 4. Version. Trotzdem stehen Zusatzfunktionen zum Download bereit, die für ältere Versionen entwickelt wurden. Diese versuchte ich verzweifelt auf dem neuen Release lauffähig zu machen.

Ich füllte mich, als wurde ich einfach ins kalte Wasser geworfen. Stundenweise zerbrach ich mir den Kopf über Probleme, die ich glaubte nie lösen zu können. Jedoch hatte ich nach einer ganzen Woche tüfteln den Dreh langsam raus und kannte die wichtigsten Klassen und Methoden. Mit der Zeit merkte ich immer mehr und mehr, wie genial manche Sachen gelöst wurden. Heute verwende ich als CMS überwiegend Redaxo.

Homepage und Download: www. redaxo.de

Der Aufbau von Redaxo
In Redaxo gibt es Kategorien, die Artikel oder Unterkategorien enthalten.

Ein Artikel wird aus verschiedenen Modulen zusammengesetzt, wie es die folgende Grafik zeigt.

Diese Module (Blöcke) können beim Schreiben eines Artikels simpel eingefügt werden. Es gibt viele fix fertige Module, aber man kann diese auch selber programmieren.

Hier mal ein Beispiel-Modul mit dem ich eine ungeordnete Liste erstellen kann.

Nebenbei gibt es bei Redaxo noch andere wichtige Funktionen, z.B. Addons und wie bei allen gängigen CMS auch Templates/Themes.

Was mir an Redaxo gefällt?

  1. Dass ich es mittlerweile beherrsche :-)
  2. Methoden- und Klassennamen sind aussagekräftig.
  3. Schönes und schlichtes Backend.
  4. Eigene Erweiterungen (Addons, Module) können relativ einfach entwickelt werden.
  5. Die Community, die zwar klein ist, aber die Antworten auf Fragen relativ schnell bringt.
  6. Das Framework ist sauber dokumentiert, obwohl manche Dokumentationen noch unvollständig sind.
  7. Erlaubt dem Entwickler flexibel zu sein.

Ich will euch nochmals darauf hinweisen, dass ich andere CMS nicht so gut im Detail kenne. Also ich habe die Meinungen nicht aus Vergleichen zwischen Redaxo und Joomla und Co. getroffen.

Einfacher Einstieg für dich

Da ich mit diesem Beitrag auch Hilfe leisten will, schreibe ich noch die wichtigsten Links und sonstige hilfreiche Tipps zum Redaxo-Einstieg, die mir geholfen haben.
Für den Anfang:
(Forumsbeitrag) Einfachen Artikel auslesen
Einfacher SQL mit dem Redaxo-Framework

Nachschlage-Werke:
Redaxo Dokumentation und Datenbankschema
Online-Dokumentation
Doku zum Framework (aktuelle Version)
Doku zum Framework der älteren Version (Meiner Meinung nach besser dokumentiert)
Weitere Hilfe zu PHP mit Redaxo

Für spätere Probleme:
(Forumsbeitrag) Umlaute und Sonderzeichen werden nicht richtig dargestellt
(Forumsbeitrag) Doppelter Eintrag in der Datenbank
(Forumsbeitrag) Probleme beim Add-On schreiben
(Forumsbeitrag) Bildtitel und Bildbeschreibung ausgeben

Zweiten Bildschirm kaufen?

Posted in Entwicklungsumgebung, Programmieren allgemein, Allgemein von admin am 3. Mrz. 2008

Schon lange spielte ich mit dem Gedanken mir einen zweiten Bildschirm zuzulegen, um bequemer und vielleicht besser programmieren zu können. Für eine Person in Ausbildung - wie mir - ist sowas aber recht kostspielig.

Irgendwann kam mir mal in Sinn, dass es auf Suse Linux virtuelle Desktops gibt. Da ich Windows benutze machte ich mich gleich auf die Suche nach virtuellen Desktops für Windows. Nach kurzer Zeit wurde ich fündig.

Ich habe mir das Tool VirtuaWin 2.9 heruntergeladen und mir gleich vier virtuelle Desktops eingerichtet. Es ist einfach genial. Um zwischen den Desktops zu wechseln muss ich lediglich mit der Maus über den Rand des Bildschirms fahren. Das ganze Wochenende hat mich dieses Tool unterstützt, und ich muss sagen: Wer noch immer auf einem Desktop arbeitet… Lade dir das Tool runter!

Die Arbeiten konnte ich viel schneller erledigen. Z.B. hatte ich auf einem Desktop den Browser, das Mailprogramm offen und auf einen anderen den FTP Client. Nicht zu vergessen, der virtuelle Desktop mit den Codeeditoren. Da erschien mir kein Desktop zu voll und überladen. Man kann alles schön unterteilen.

Messenger waren verboten… die lenken nur ab :-)

Hier noch ein Link zu einem WinTotal-Test über virtuelle Desktop-Tools.

Woran merkst du, dass du zu lange gearbeitet hast?

Posted in Allgemein von admin am 2. Mrz. 2008

Woran merkst du, dass du zu lange gearbeitet hast?

Wenn die Vögel bereits zwitschern. :D

Farbkombinationen mit kuler

Posted in Layout, Design von admin am 18. Feb. 2008

Leider ist bei mir momentan eher stylen angesagt. Ich merke, dass irgendwie das Programmieren zu kurz kommt. Naja, wenigstens lese ich fleissig meine Elektronik-Fibel um später mal (hoffe ich :D ) Schaltungen “entwickeln” zu können.

Um mir das Stylen zu erleichtern habe ich nach Farbkombinationen im Web gesucht. Man wird bei einigen Seiten fündig. Was ich euch aber weiterempfehlen ist kuler von Adobe.

Es ist einfach zu bedienen. Vor allem müsst ihr mal versuchen eine eigene Farbkombination zu erstellen, dabei werden passende Farben “vorgeschlagen”.

Ich find kuler für mich (= nicht-so-designer-typ) echt kul :D . Probierts einfach mal aus.

Muster und Texturen

Posted in Design, Web Development von admin am 11. Feb. 2008

Bei jeder Realisierung einer Internetpräsenz gehört natürlich, neben der Entwicklung, auch das Design dazu. So musste ich letztens für eine Website ein Hintergrundmuster suchen bzw. aus einer Textur ein Hintergrundmuster erstellen.

Natürlich suchte ich nach bereits vorhandenen Mustern, bevor ich eine erstellte. Dabei bin ich auf diese Seiten gestossen, die ich euch nicht vorenthalten will.

Bitte vergesst nicht auf die Lizenz zu achten, damit ihr nicht irgendwie die Urheberrechte verletzt.

Gewinnspiel mit interessanten Preisen

Posted in Offtopic von admin am 3. Feb. 2008

selbstaendig-im-netz.de ist ein Blog den ich seit Monaten besuche, da ich immer wieder interessante Beiträge zum Thema Selbständigkeit finde.
Der Blog ist nun ein ganzes Jahr alt und veranstaltet anlässlich des Geburtstags ein Gewinnspiel. Um genauer zu sein eine Gewinnspielreihe. Die erste Runde hat bereits begonnen und es werden folgende zwei Bücher verlost:

Mir erscheint vor allem das Buch Gelungenes Webdesign äusserst interessant. In einer Bücherei konnte ich bereits ein paar Blicke rein werfen. Nur das nötige Kleingeld hatte ich damals nicht dabei um es zu erwerben.

Nichts desto trotz versuche ich es erst einmal durch das Gewinnspiel zu ergattern, indem ich einfach einen Backlink zum Gewinnspiel setze :) .

Mehr Elektronikkenntnisse

Posted in Mikrocontroller/Elektronik von admin am 3. Feb. 2008

Vor längerer Zeit schrieb ich in einem Beitrag, dass ich mich zukünftig mit Mikrocontroller beschäftigen werde.

Mein Anfangsprojekt soll ein vierrädriges Fahrzeug sein, welches lenken, Hindernisse erkennen und natürlich fahren kann :) . Das genügt für den Anfang erstmal. Das Thema ist also nicht gestorben.

Im Board von roboternetz.de erkannte ich, dass meine Elektronikkenntnisse nicht ausreichen, um mir den Einstieg in die Robotik- bzw. Mikrocontroller-Welt einfach zu machen. Zur Robotik gehören Schaltpläne auch dazu. Deswegen nahm ich mir als ersten Schritt mal vor meine Elektronikkenntnisse zu erweitern.

Da ich ein Mensch bin, der lieber Bücher anstatt Texte auf dem Bildschirm liest, habe ich mir die Elektronik-Fibel von Patrick Schnabel gekauft. Die ersten 50 Seiten des Buches habe ich bereits gelesen und muss sagen, dass es wirklich einfach beschrieben ist. Bis jetzt habe ich alles verstanden.
Das ganze kann man auch kostenlos auf Elektronik-Kompendium.de lesen. Auf jeden Fall empfehlenswert.

Website in verschiedenen Browsern testen mit Browsershots

Posted in Web Development von admin am 13. Jan. 2008

Wenn man ein Websitedesign erstellt soll es auf möglich allen Browsern gleich aussehen. Wer sich nicht damit zufrieden gibt seine Website, wie ich bisher, auf vier verschiedenen Browsern (IE, Firefox, Opera, Safari) zu testen, dem sei geholfen.

Auf Mitra.ch entdeckte ich einen Beitrag über den Onlineservice von Johann C. Rocholl. Browsershots nennt sich dieser Service, der Screenshots einer Website von verschiedenen Browsern liefert. Man trägt eine Website ein, kommt in eine Warteschlange wobei anschliessend auf verschiedenen Rechnern mit verschiedenen Browsern Screenshots von der Seite gemacht und zum Download verfügbar gestellt werden.

Auf jeden Fall ein nützliches Werkzeug.

Erstes Blogstöckchen

Posted in Allgemein von admin am 10. Jan. 2008

Ich bin nicht unbedingt der Fan von Kettenbrief-ähnlichen Blogposts, aber ja was solls. Ein Blogstöckchen kann ja auch lustig sein. Ich wurde von ricdes geblogstöckchet :D

Also, los gehts!

4 Jobs, die du in deinem Leben hattest

  • Informatiker
  • Schüler :-p
  • Tut mir Leid, dass ich noch keine 30 Jahre habe :)

4 Filme, die du immer wieder anschauen kannst

  • Jurassic Park (1. Teil) :)
  • die alten Star Wars Filme
  • The Fast and the Furious
  • Apocalypse Redux Now

4 Orte, an denen ich gewohnt habe

  • Schweizer Rheintal, Wohnblock Nr. 1
  • Schweizer Rheintal, Wohnblock Nr. 2
  • und jedes Jahr 1-2 Monate in Zadar

4 TV-Serien, die ich gerne sehe

  • Die Simpsons
  • Southpark
  • Scrubs
  • Stromberg

4 Plätze, an denen du im Urlaub warst

  • Zadar, Kroatien
  • Split, Kroatien
  • Primosten, Kroatien
  • Montpellier, Frankreich (Aufenthaltswoche)

4 Webseiten, die du täglich besuchst

4 deiner Lieblingsessen

  • Prsut (geräucherter Schinken/Rohschinken)
  • Pizza
  • Alles vom Grill
  • Kebap

4 Plätze wo du gerne im Augenblick sein möchtest

  • Zadar :)
  • Dubrovnik
  • Irgendwo in Skandinavien
  • Australien

4 Blogger, denen du das Stöckchen weitergibst

NNächste Seite »

Blogverzeichnis - Blog Verzeichnis bloggerei.de blog-o-rama.deSuchmaschinenoptimierung mit Ranking-Hits supported by www.rankingcloud.de Blog Top Liste - by TopBlogs.de Free Games

Add to Technorati Favorites Sofortkredit ohne Schufa