# TicTacToe - Bitte um Feedback



## timbeau (21. Apr 2012)

Hallo zusammen, 

um den Min-Max-Algorithmus zu verstehen habe ich ein TicTacToe kreiert und dabei auch meine Swingkenntnisse vertieft. 

Da ich aber noch sehr am Anfang stehe, bitte ich um ein paar Kommentare sowohl beim Handling wie auch beim Code...falls sich da jemand reinwühlt. Ich habe versucht das MVC-Pattern einzuhalten. Allerdings habe ich z.B. die View als Observer vom Model eingetragen. Ansonsten geben 2 Listener die Kommandos an den Controller und dieser leitet die nötigen Operationen. 

Es gibt 3 KI-Gegner: sehr leicht, leicht und unbesiegbar. 
Ein Random-Spieler, ein Spieler der 1-2 Züge vorrausdenkt und der Min-Max-Spieler.

Zusätzlich kann man den "Humanplayer" auswählen und Namen und Zeichen vergeben. Zeichen die doppelt vergeben werden, sollten durch mein Programm ausgetauscht werden. Dies klappte bei meinen Tests, ich habe aber noch keine Anzeige für diesen Fall. 

So siehts aus:






Im Anhang sind auch die Source-Files, kann sein dass da noch eine Testklasse mit rumschwirrt. 

Was vll. für jemanden noch interessant ist, ist die Methode initPlayer() in der Klasse ButtonListener:

```
public Player initPlayer(String playerKlasse, String playerName,
			String playerChar) {

		Player player = null;

		if (playerKlasse.equals("HumanPlayer")) {
			/*
			 * public HumanPlayer(PlayTicTacToe controller, String
			 * playerCharPar, String playerNamePar, TicTacToe view) {
			 */
			try {
				Class<HumanPlayer> oneTmp = HumanPlayer.class;
				@SuppressWarnings("rawtypes")
				Class[] params = new Class[2];
				params[0] = String.class;
				params[1] = String.class;

				Constructor<HumanPlayer> oConstr = oneTmp
						.getConstructor(params);
				Object[] aoParams = new Object[2];
				aoParams[0] = playerChar;
				;
				aoParams[1] = playerName;

				player = oConstr.newInstance(aoParams);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			}
		} else {
			try {
				Class<?> oneTmp = Class.forName("computerPlayer."
						+ playerKlasse);
				@SuppressWarnings("rawtypes")
				Class[] params = new Class[2];
				params[0] = TicTacToeFramework.class;
				params[1] = Player.class;

				Constructor<?> oConstr = oneTmp.getConstructor(params);
				Object[] aoParams = new Object[2];
				aoParams[0] = model;
				;
				aoParams[1] = null;

				player = (Player) oConstr.newInstance(aoParams);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		return player;

	}
```

Schonmal danke für die Kommentare falls es welche gibt 

Gute Nacht


----------



## Marco13 (21. Apr 2012)

Hat es einen Grund, dass du nicht einfach
new HumanPlayer(bla, blub);
machst, sondern mit Reflection.......?


----------



## timbeau (21. Apr 2012)

Hi, 

die Methode entsprang der Idee einfach das Package auszulesen und für jede gefundene Java-Klasse die das Player Interface implementiert, einen Eintrag in der Liste zu hinterlegen. Habe ich allerdings erstmal nicht weiter verfolgt.

Dass ich den HumanPlayer dann so implementiert habe ist wohl überflüssig. Danke.


----------



## Final_Striker (21. Apr 2012)

Während der Computer "denkt" kann ich trotzdem Zeichen setzen, sogar für ihn selbst.


----------



## timbeau (21. Apr 2012)

:autsch:

Gefixed hoffe ich, sieht nicht soo toll aus. Habs gelöst indem ich alle Buttons deaktiviere.  Thx


----------

