# Mühle geht nicht



## dominic89 (16. Jun 2011)

Hallo zusammen, 

ich habe hier im Forum diesen Quelltext für das Spiel Mühle gefunden. Ich würde ihn gerne dazu benutzen um weiter darauf aufzubauen. Da dort ja schon die Logik enthalten ist muss ich die ja nicht nochmal selber schreiben. 

Aber hat jemand von euch eine Idee wie ich das Programm zum laufen bekomme um es mir mal anzuschauen. Irgendwie will der ja als Constructor der Klasse eine InternetAdresse und einen Port haben. Brauche ich jetzt extra nen Server dafür oder geht das auch irgendwie ohne.


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.*;
import java.util.*;
import java.io.*;
import java.net.*;

public class Main extends JComponent implements MouseMotionListener,
		MouseListener, Runnable {
	public static final char SCHWARZ = 'S', SCHWARZ_W = 's';
	public static final char WEISS = 'W', WEISS_W = 'w';
	public static final char LEER = ' ';

	public static final int AUSWAEHLEN = 0;
	public static final int ZIEHEN = 1;
	public static final int WEGNEHMEN = 2;

	static final int[] koordX = { 400, 700, 700, 700, 400, 100, 100, 100, // 0-7
			400, 600, 600, 600, 400, 200, 200, 200, // 8-15
			400, 500, 500, 500, 400, 300, 300, 300 // 16-23
	};
	static final int[] koordY = { 100, 100, 400, 700, 700, 700, 400, 100, // 0-7
			200, 200, 400, 600, 600, 600, 400, 200, // 8-15
			300, 300, 400, 500, 500, 500, 400, 300 // 16-23
	};

	static final char[] spielfeld = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 0-7
			' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 8-15
			' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // 16-23
	};

	PrintStream ps;
	Scanner scan;

	// Noch zu setzende Spielsteine
	int steineWeiss;
	int steineSchwarz;
	boolean spielModusSetzen;
	boolean spielModusZiehen;
	int ziehenZustand;

	char naechsterSpieler = WEISS;
	int gezogenerStein = -1;
	int mousePosX, mousePosY;
	char spieler;

	public Main() {
		addMouseMotionListener(this);
		addMouseListener(this);
		steineWeiss = 9;
		steineSchwarz = 9;
		spielModusSetzen = true;
		spieler = WEISS;
		try {
			ServerSocket server = new ServerSocket(0);
			System.out.println("Port: " + server.getLocalPort());
			initVerbindung(server.accept());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Main(String inetAddr, int port) {
		addMouseMotionListener(this);
		addMouseListener(this);
		steineWeiss = 9;
		steineSchwarz = 9;
		spielModusSetzen = true;
		spieler = SCHWARZ;
		try {
			initVerbindung(new Socket(inetAddr, port));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void paint(Graphics g) {
		// Bildschirmhintergrund loeschen
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, getWidth(), getHeight());

		// Spielfeld zeichnen
		paintSpielfeld(g);

		paintSteine(g);

		if (spielModusSetzen) {
			paintStein(g, mousePosX, mousePosY, naechsterSpieler);
		}
		if (ziehenZustand == WEGNEHMEN) {
			paintSteinWegnehmen(g, mousePosX, mousePosY, naechsterSpieler);
		}

		paintNichtGesetzteSteine(g);
	}

	public void paintSteine(Graphics g) {
		for (int i = 0; i < spielfeld.length; i++) {
			paintSteinPos(g, i, spielfeld[i]);
		}
	}

	public void paintSpielfeld(Graphics g) {
		((Graphics2D) g).setStroke(new BasicStroke(6));
		g.setColor(Color.BLACK);
		g.drawRect(100, 100, 600, 600);
		g.drawRect(200, 200, 400, 400);
		g.drawRect(300, 300, 200, 200);

		g.drawLine(400, 100, 400, 300);
		g.drawLine(100, 400, 300, 400);
		g.drawLine(500, 400, 700, 400);
		g.drawLine(400, 500, 400, 700);
	}

	public void paintSteinPos(Graphics g, int pos, char farbe) {
		paintStein(g, koordX[pos], koordY[pos], farbe);
	}

	public void paintSteinWegnehmen(Graphics g, int xPos, int yPos, char farbe) {
		paintStein(g, xPos, yPos, farbe);
		g.setColor(Color.BLACK);
		g.drawLine(xPos - 40, yPos - 40, xPos + 40, yPos + 40);
		g.drawLine(xPos - 40, yPos + 40, xPos + 40, yPos - 40);
	}

	public void paintStein(Graphics g, int xPos, int yPos, char farbe) {
		if (farbe == SCHWARZ || farbe == SCHWARZ_W) {
			g.setColor(Color.BLACK);
			g.fillOval(xPos - 30, yPos - 30, 60, 60);
		} else if (farbe == WEISS || farbe == WEISS_W) {
			g.setColor(Color.WHITE);
			g.fillOval(xPos - 30, yPos - 30, 60, 60);
			((Graphics2D) g).setStroke(new BasicStroke(3));
			g.setColor(Color.BLACK);
			g.drawOval(xPos - 30, yPos - 30, 60, 60);
		} else // Kein Stein gesetzt
		{
			g.setColor(Color.GRAY);
			g.fillOval(xPos - 6, yPos - 6, 12, 12);
		}
		if (farbe == WEISS_W || farbe == SCHWARZ_W) {
			g.setColor(Color.BLUE);
			g.fillOval(xPos - 10, yPos - 10, 20, 20);
		}
	}

	public void paintNichtGesetzteSteine(Graphics g) {
		for (int i = 0; i < steineWeiss; i++) {
			g.setColor(Color.WHITE);
			g.fillOval(20, 100 + i * 60, 50, 50);
			g.setColor(Color.BLACK);
			g.drawOval(20, 100 + i * 60, 50, 50);
		}
		for (int i = 0; i < steineSchwarz; i++) {
			g.fillOval(730, 100 + i * 60, 50, 50);
		}
	}

	public void mouseMoved(MouseEvent evt) {
		if ((naechsterSpieler == spieler) == (ziehenZustand != WEGNEHMEN)) {
			mousePosX = evt.getX();
			mousePosY = evt.getY();
			ps.println("MOVE " + mousePosX + " " + mousePosY);
			repaint();
		}
	}

	public void mouseDragged(MouseEvent evt) {

	}

	public void mouseClicked(MouseEvent e) {
		if ((naechsterSpieler == spieler) == (ziehenZustand != WEGNEHMEN)) {
			setzeSteinAuf(mousePosX = e.getX(), mousePosY = e.getY());
			ps.println("CLICK " + mousePosX + " " + mousePosY);
		}
	}

	public void setzeSteinAuf(int posx, int posy) {
		mousePosX = posx;
		mousePosY = posy;
		for (int i = 0; i < 24; i++) {
			int x2 = koordX[i];
			int y2 = koordY[i];
			double diff = Math.sqrt((mousePosX - x2) * (mousePosX - x2)
					+ (mousePosY - y2) * (mousePosY - y2));
			if (diff < 30) {
				if (ziehenZustand == WEGNEHMEN) {
					if (spielfeld[i] == naechsterSpieler) {
						spielfeld[i] = LEER;
						ziehenZustand = AUSWAEHLEN;
						repaint();
					}
				} else if (spielModusSetzen) {
					if (spielfeld[i] == LEER) {
						spielfeld[i] = naechsterSpieler;
						if (naechsterSpieler == WEISS) {
							steineWeiss--;
							naechsterSpieler = SCHWARZ;
						} else {
							steineSchwarz--;
							naechsterSpieler = WEISS;
						}
						if (steineWeiss == 0 && steineSchwarz == 0) {
							spielModusSetzen = false;
							spielModusZiehen = true;
						}
						ueberpruefeMuehle(i);
						repaint();
					}
				} else if (spielModusZiehen) {
					if (ziehenZustand == AUSWAEHLEN) {
						if (spielfeld[i] == naechsterSpieler) {
							spielfeld[i] = (char) (spielfeld[i] + ('a' - 'A'));
							gezogenerStein = i;
							ziehenZustand = ZIEHEN;
						}
					} else if (ziehenZustand == ZIEHEN) {
						if (spielfeld[i] == LEER) {
							spielfeld[i] = naechsterSpieler;
							spielfeld[gezogenerStein] = LEER;
							gezogenerStein = -1;
							if (naechsterSpieler == WEISS) {
								naechsterSpieler = SCHWARZ;
							} else {
								naechsterSpieler = WEISS;
							}
							ziehenZustand = AUSWAEHLEN;
							ueberpruefeMuehle(i);
						}
					}
					repaint();
				}
			}
		}
	}

	public void mouseEntered(MouseEvent e) {

	}

	public void mouseExited(MouseEvent e) {

	}

	public void mousePressed(MouseEvent e) {

	}

	public void mouseReleased(MouseEvent e) {

	}

	public void ueberpruefeMuehle(int pos) {
		int spieler = spielfeld[pos];
		if (pos % 2 == 0) // Gerade Stellen (keine Ecken)
		{
			if (pos % 8 == 0) {
				if ((spielfeld[pos + 7] == spieler)
						&& (spielfeld[pos + 1] == spieler)) {
					ziehenZustand = WEGNEHMEN; // Muehle!
				}
			} else if ((spielfeld[pos - 1] == spieler)
					&& (spielfeld[pos + 1] == spieler)) {
				ziehenZustand = WEGNEHMEN; // Muehle!
			}
			pos = pos % 8;
			if ((spielfeld[pos] == spieler) && (spielfeld[pos + 8] == spieler)
					&& (spielfeld[pos + 16] == spieler)) {
				ziehenZustand = WEGNEHMEN; // Muehle!
			}
		} else // Ungerade Stellen (Ecken)
		{
			if (pos == 7 || pos == 15 || pos == 23) {
				if ((spielfeld[pos - 7] == spieler)
						&& (spielfeld[pos - 6] == spieler)) {
					ziehenZustand = WEGNEHMEN; // Muehle!
				}
			} else {
				if ((spielfeld[pos + 1] == spieler)
						&& (spielfeld[pos + 2] == spieler)) {
					ziehenZustand = WEGNEHMEN; // Muehle!
				}
			}
			if (pos == 1 || pos == 9 || pos == 17) {
				if ((spielfeld[pos - 1] == spieler)
						&& (spielfeld[pos + 6] == spieler)) {
					ziehenZustand = WEGNEHMEN; // Muehle!
				}
			} else {
				if ((spielfeld[pos - 1] == spieler)
						&& (spielfeld[pos - 2] == spieler)) {
					ziehenZustand = WEGNEHMEN; // Muehle!
				}
			}
		}
	}

	public void initVerbindung(Socket socket) {
		try {
			ps = new PrintStream(socket.getOutputStream());
			scan = new Scanner(socket.getInputStream());
		} catch (Exception e) {
			e.printStackTrace();
		}
		new Thread(this).start();
	}

	public void run() {
		while (scan.hasNext()) {
			String cmd = scan.next();
			int xPos = scan.nextInt();
			int yPos = scan.nextInt();
			if (cmd.equals("MOVE")) {
				mousePosX = xPos;
				mousePosY = yPos;
				repaint();
			} else if (cmd.equals("CLICK")) {
				setzeSteinAuf(xPos, yPos);
			}
		}
	}

}
```

Vielen Dank schonmal für eure Mühen


----------



## Andi_CH (16. Jun 2011)

Public class Main -> GRAUS ....

Da fehlt das Hauptprogramm - nur dass die Klasse dummerweise Main heisst, reicht dazu nicht aus.

Ohne genauer einzusteigen: So wie es aussieht ist das ein Spiel das zwei gegeneinander spielen - Ich sage Klasse ab jetzt Muehle - den anderen Namen bekomme ich nicht in die Tastatur ohne Kraempfe zu kriegen. Die klasse Muehle hat zwei Konstruktoren. Wenn du den ohne Parameter verwendest ist das Ding server, wenn du den anderen startest musst du angeben wo der Server ist ...

Wo hast du denn das genau gefunden?


----------



## dominic89 (16. Jun 2011)

Ja ich weiß schön ist was anders ich wollte es halt erstmal zum laufen bekommen. den namen kann ich ja dann auch ändern also denken wir uns einfach Main == Muehle 

Und im Orginal Quelltext heißt die klasse auch Muehle nur beim Kopieren hatte ich schon die Main. 

Hm dann heißt es wohl alles selberbauen und nur die logik benutzen.


----------



## Andi_CH (16. Jun 2011)

*Woher* ist das???? ich kann kaum glauben dass jemand einen solchen Blödsinn ins Netz stellt.

Ausserdem "alles" selber bauen - das Hauptprogramm wird so aus einer - zwei Zeilen bestehen


----------



## SlaterB (16. Jun 2011)

du kannst alles zu Socket usw. rausstreichen, dann auch initVerbindung() und letzlich auch die run-Methode,
die dafür da ist, die Internet-Eingaben aufs Spielfeld zu setzen,
richtig spielbar wirds ohne Gegner dann wohl nicht mehr sein, du musst selber wissen wie der zweite arbeiten soll,
wenn auch mit Maus usw., dann wahrscheinlich noch diverser Code anzupassen, kann schwierig werden wenn du nichts davon verstehst..


----------



## Andi_CH (16. Jun 2011)

Fehlt da nicht noch ein Teil des GUI? (damit kenne ich mich bekannterweise ja nicht aus ;-) )


----------



## SlaterB (16. Jun 2011)

das mag sein, nicht getestet


----------



## dominic89 (16. Jun 2011)

Also gefunden habe ich den Code bei euch im Forum. Den hat wohl mal ein verzweifelter Student gepostet. 

Und mir kommt es halt auch so vor als würde noch die ganze GUI fehlen. 
Was die Eingaben des Gegners angeht kann man es ja über eine variable lösen die sagt ob weiß oder schwarz drann ist. 

Mich interessiert halt das Problem mit der GUI muss ich das Ding einfach nur aufrufen oder muss ich noch ein komplettes benuzerinterface schreiben. 

Java kann ich inzwischen ganz gut nur mit Javaoberflächen kann ich nicht. 

MfG Dominic


----------



## SlaterB (16. Jun 2011)

> muss ich das Ding einfach nur aufrufen oder muss ich noch ein komplettes benuzerinterface schreiben. 

wenn du diese Frage nicht selber beantworten kannst, dann fällt die zweite Möglichkeit sowieso weg!
es geht hier um Swing, Swing musst du erstmal lernen, was ist ein JFrame, was ist ein JPanel usw.,
wenn dazu Grundkenntnisse da sind, sollte der Rest klar sein


----------



## dominic89 (16. Jun 2011)

Ok also gearbeitet habe ich damit schonmal. Allerdings noch nicht so die Riesen erfahrungen. Naja dann werde ich das heute Nacht mal probieren.


----------



## SlaterB (16. Jun 2011)

nur ein Satz:
es ist eine JComponent, quasi ein JPanel wie geläufiger, was macht man mit einem JPanel?


----------

