# GO-Spiel in Java noch fehlerhaft hoffe um hilfe



## GOAd1 (1. Jun 2009)

Hallo

also ich hab ein GO-Spiel geschrieben und das in Java das Feld is 9*9 und die Gewinnprüfung is nur auf das Standart gesetzt.
sprich das:
       schwarz
schwarz weiß schwarz
       schwarz
und umgekehrt

jetzt ist mein Problem das ich sobald ich einen weißen stein in ein solches belegtes Feld lege,..
      schwarz
schwarz    schwarz
      schwarz
kommt als ausgabe das man da nicht setzten sollte weil es selbstmord wäre und der spieler kann iwo anders seinen stein platzieren.

Nun das Problem ist wenn ich das ganze in Weiß habe,..

      weiß
weiß       weiß
      weiß

und da nen schwarzen stein reinlege erscheint dann einfach ein weißer stein....

es ist aber die genau gleiche if-abfrage nur auf die andere farbe zugeschnitten.




Ein weiteres Problem ist das mein Spielfeldgitter über den Spielsteinen liegt sprich man sieht es gut bei den Weißen steinen die somit hinter dem Gitter erscheinen. Keine Ahnung wieso das so is.

Ich hab das Programm in zwei Klassen geteilt einmal die GOGUI für die Grafische sache und die Logik für den logischen teil


```
GOGUI

import java.applet.Applet;
import java.awt.*;


public class GOGUI extends Applet
{

	private static final long serialVersionUID = 1L;
	
	private int[][][] spielfeld=new int[3][9][9];
	private int farbe=1;    
	private boolean gewonnen=false;
	private int[] anzahlsiege=new int [2];
	private boolean easteregg=false;
	private boolean infobutton=false;
	private int[] anzahlsteine=new int [2];
	

	public GOGUI()
	{
//		this.spielfeld[3][9][9] = 0;
		this.farbe = 1;
		this.gewonnen = false;
//		this.anzahlsiege[2] = 0;
		this.easteregg = false;
	}

	
	public GOGUI(int[][][] spielfeld, int farbe, boolean gewonnen)throws HeadlessException {
		super();
		this.spielfeld = spielfeld;
		this.farbe = farbe;
		this.gewonnen = gewonnen;
//		this.anzahlsiege = anzahlsiege;
//		this.easteregg = easteregg;
	}
	
	
	public int[][][] getSpielfeld() {
		return spielfeld;
	}
	public void setSpielfeld(int[][][] spielfeld) {
		this.spielfeld = spielfeld;
	}
	public int getFarbe() {
		return farbe;
	}
	public void setFarbe(int farbe) {
		this.farbe = farbe;
	}
	public boolean getGewonnen() {
		return gewonnen;
	}
	public void setGewonnen(boolean gewonnen) {
		this.gewonnen = gewonnen;
	}
	public int[] getAnzahlsiege() {
		return anzahlsiege;
	}
	public void setAnzahlsiege(int[] anzahlsiege) {
		this.anzahlsiege = anzahlsiege;
	}	
	public boolean isEasteregg() {
		return easteregg;
	}
	public void setEasteregg(boolean easteregg) {
		this.easteregg = easteregg;
	}	
	public boolean isInfobutton() {
		return infobutton;
	}
	public void setInfobutton(boolean infobutton) {
		this.infobutton = infobutton;
	}
	public int[] getAnzahlsteine() {
		return anzahlsteine;
	}
	public void setAnzahlsteine(int[] anzahlsteine) {
		this.anzahlsteine = anzahlsteine;
	}


	public void paint (Graphics stift)
	{
		setBackground(new Color (232,206,29));
				
		stift.setFont(new Font("Arial",Font.PLAIN,36));
		stift.drawString("GO", 300, 100);
							
	  for(int kx=0;kx<9;kx++)
	   for(int ky=0;ky<9;ky++)
	   {
			if(spielfeld[0][kx][ky]==0)
			{			       
		       //waagrechte Linie
		       for(int i=50;i<=450;i=i+50)
					stift.drawLine(125, i+75, 525, i+75);	
				
		       //senkrechte Linie
				for(int i=50;i<=450;i=i+50)
					stift.drawLine(i+75, 125, i+75, 525);
			} 
			else 
			{
			// bei click werden kringel da und da gemalt
				if(spielfeld[0][kx][ky]==1)
					stift.fillOval(spielfeld[1][kx][ky]+52, spielfeld[2][kx][ky]+52, 45, 45);
			    else
			    {
			    	if(spielfeld[0][kx][ky]==2)
			    	{
			    		  stift.setColor(Color.WHITE);
			 			  stift.fillOval(spielfeld[1][kx][ky]+52, spielfeld[2][kx][ky]+52, 45, 45);
			 			  stift.setColor(Color.BLACK);
			 			  stift.drawOval(spielfeld[1][kx][ky]+52, spielfeld[2][kx][ky]+52, 45, 45);
			    	}
			    }
			}
				
		
		//Info-Anzeige LINKS
		stift.drawRect(5, 125, 90, 200);
		stift.setFont(new Font("Arial",Font.PLAIN,15));
		stift.drawString("Erstellt von:", 7, 293);
		stift.setFont(new Font("Arial",Font.PLAIN,12));
		stift.drawString("Adrian Biehler", 7, 305);
		stift.drawString("2BKI2 HvDetten", 7, 317);
		
		//Spieler-Anzeige UNTEN
		stift.drawRect(125,555,400,150);
		stift.setFont(new Font("Arial",Font.PLAIN,20));
		stift.fillRect(130,630,390,2);
		stift.fillRect(324,558,2,145);
		
			//Spieler Schwarz
			stift.drawString("Spieler 1:",150,600);
			stift.drawString("Anzahl Siege:",150,660);
			stift.drawString(" "+anzahlsiege[0], 280, 660);
			stift.drawString("Anzahl Steine:",150,690);
			stift.drawString(" "+anzahlsteine[0], 280, 690);
				//Stein
			  	stift.setColor(Color.BLACK);
			  	stift.fillOval(250,570,45,45);
			 
			//Spieler Weiß
			stift.drawString("Spieler 2:",350,600);
			stift.drawString("Anzahl Siege:",350,660);
			stift.drawString(" "+anzahlsiege[1], 480, 660);
			stift.drawString("Anzahl Steine:",350,690);
			stift.drawString(" "+anzahlsteine[1], 480, 690);
				//Stein
				stift.setColor(Color.WHITE);
				stift.fillOval(450,570,45,45);
				stift.setColor(Color.BLACK);
				stift.drawOval(450,570,45,45);
		
			  
			  
	
	//Schrifterscheinung in der GUI
	
	  
	//Easteregg
	  if(easteregg==true)	
		  stift.drawString("2F9E7 hex", 288, 120);
	
	//Info
	  if(infobutton==true)
	  {
		  stift.fillRect(555, 222, 230, 265);
		  stift.setColor(Color.getHSBColor(232,206,29));
		  stift.fillRect(557, 224, 226, 261);
		  stift.setColor(Color.BLACK);
		  stift.drawString("Um dieses Spiel zu", 560, 245);
		  stift.drawString("Gewinnen, muss man", 560, 265);
		  stift.drawString("einen gegnerischen Stein", 560, 285);
		  stift.drawString("von jeder Seite sprich,", 560, 305);
		  stift.drawString("von Oben, Unten, Links", 560, 325);
		  stift.drawString("und Rechts, zusetzen.", 560, 345);
		  stift.drawString("Beispiel:", 560, 365);
		  
		  
		  //Beispiel für GewonnenBild
		  //Liniensenk
		  stift.drawLine(595, 370, 595, 480);
		  stift.drawLine(630, 370, 630, 480);
		  stift.drawLine(665, 370, 665, 480);
		  stift.drawLine(700, 370, 700, 480);
		  stift.drawLine(735, 370, 735, 480);
		  //Linienwaag
		  stift.drawLine(580, 390, 750, 390);
		  stift.drawLine(580, 425, 750, 425);
		  stift.drawLine(580, 460, 750, 460);
		  
		  
		  //Schwarz
		  stift.fillOval(650, 375, 30, 30);
		  stift.fillOval(615, 410, 30, 30);
		  stift.fillOval(685, 410, 30, 30);
		  stift.fillOval(650, 445, 30, 30);
		  //Weiß
		  stift.setColor(Color.WHITE);
		  stift.fillOval(650, 410, 30, 30); 
		  stift.setColor(Color.BLACK);
		  stift.drawOval(650, 410, 30, 30);
		   
	  }
	 	
	  
	//Gewinn setzung
	  stift.setFont(new Font("Arial",Font.PLAIN,20));
	  
	  
	  if(gewonnen==true)
		  stift.drawString("hat Gewonnen!", 650, 200); 
	  else
		  stift.drawString("ist dran", 650,200);
	  
		  if (farbe==1)
		  {
			  stift.setColor(Color.BLACK);
			  stift.fillOval(595,170,45,45);
		  }
		 
		  else 
		  {
			  stift.setColor(Color.WHITE);
			  stift.fillOval(595,170,45,45);
			  stift.setColor(Color.BLACK);
			  stift.drawOval(595,170,45,45);
		  }		  
	  }	  
	}
}
```


```
Logik

import java.awt.Button;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Logik extends GOGUI implements MouseListener, ActionListener{

	private static final long serialVersionUID = 1L;

	Button info = new Button("Info");
	Button nochmal = new Button("Neues Spiel");
	
	String Spielerfarbe;
	
	
	public static void main (String[] args)
	{
	GOGUI A = new GOGUI ();
	
	A.getFarbe();
	A.getSpielfeld();
	A.getGewonnen();
	A.getAnzahlsiege();
	A.getAnzahlsteine();
	}	
	
	
	public void init()
	{		
		setSize(800,770);
		addMouseListener(this);
		
		setLayout(null);
		add(info);
		add(nochmal);
		
		nochmal.disable();//Läßt sich auch unnötig in eine Methode auslagern
		
		info.addActionListener(this);
		nochmal.addActionListener(this);

		info.setBounds(10,130,80,70);
		nochmal.setBounds(10,205,80,70);

			
		// Spielfeld leeren bzw. auf 0 setzen
		for(int kx=0;kx<9;kx++)
			   for(int ky=0;ky<9;ky++)
			      getSpielfeld()[0][kx][ky]=0;
		
		// jeweilige X-Koordinate
		for(int kx=0;kx<9;kx++)
			   for(int ky=0;ky<9;ky++)
			      getSpielfeld()[1][kx][ky]=kx*50+50;
					
		// jeweilige Y-Koordinate
		for(int kx=0;kx<9;kx++)
			   for(int ky=0;ky<9;ky++)
			      getSpielfeld()[2][kx][ky]=ky*50+50;
				   			
		if(getFarbe()==1)
			Spielerfarbe="SCHWARZ";
		else
			Spielerfarbe="WEIß";
		
	}   //init() Ende
	
	
	//Hier wird beim Klicken umgerechnet wo man den Spielstein zeichnet
	public int getSpalte(int mauskoordinate_x)						
	{																
		return ((int)(mauskoordinate_x/50)-2);						
	}																
																	
	public int getZeile(int mauskoordinate_y)						
	{																
		return ((int)(mauskoordinate_y/50)-2);						
	}																
	
	//Wechselt den Spieler
	public void wechsleSpieler()
	{
		if(getFarbe()==1)
			setFarbe(2);
		else
			setFarbe(1);
	}
	
	
	//Hier läuft die Gewinnabfrage ab
	public int Gewinnprüfung()
	{
		for(int spieler=1;spieler<=2;spieler++)
		 for(int spalte=0;spalte<=6;spalte++)
		  for(int zeile=0;zeile<=7;zeile++)
		  {
			  if((getSpielfeld()[0][spalte][zeile]==1)&&(getSpielfeld()[0][spalte+1][zeile]==spieler+1)&&(getSpielfeld()[0][spalte+2][zeile]==spieler)&&(getSpielfeld()[0][spalte+1][zeile+1]==spieler)&&(getSpielfeld()[0][spalte+1][zeile-1]==spieler))
			  		{
					   setGewonnen(true);
					   wechsleSpieler();
						   
					   if(getFarbe()==1)   
						   getAnzahlsiege()[0]++;
						   					   
					   return 1;
					 }
			  
			  if((getSpielfeld()[0][spalte][zeile]==2)&&(getSpielfeld()[0][spalte+1][zeile]==spieler-1)&&(getSpielfeld()[0][spalte+2][zeile]==spieler)&&(getSpielfeld()[0][spalte+1][zeile+1]==spieler)&&(getSpielfeld()[0][spalte+1][zeile-1]==spieler))
			  		{
					   setGewonnen(true);
					   wechsleSpieler();
						   						   
					   if(getFarbe()==2)
						   getAnzahlsiege()[1]++;
						   
					   return 2;
					 }
		  }		
		return 0;
	}	//Gewinnprüfung() Ende
	

    //Sobald man mit der Maus klickt passiert folgendes
	public void mouseClicked(MouseEvent arg0) 
	{
			
		if(isInfobutton()==true)
			setInfobutton(false);
		
		if (getGewonnen()==false) 
		{
			System.out.println("Spieler " + getFarbe() + " setzte seinen Stein auf:");
			
			int x = arg0.getX();
			int spalte = getSpalte(x);
			System.out.println("s=" + spalte);
			
			int y = arg0.getY();
			int zeile = getZeile(y);
			System.out.println("z=" + zeile);
			
				
			if(getSpielfeld()[0][spalte][zeile]==0)
	   		{
	   			getSpielfeld()[0][spalte][zeile] = getFarbe();
	   			
		   // Die Folgenden 2 if-Abfragen lösen große Probleme in der Spalte 0 sowie 8 aus. Und die Farbe Schwarz beim setzten in einen Selbstmord
	   			if(getFarbe()==1)
	   			{
	   				getAnzahlsteine()[0]++;
	   				if(getSpielfeld()[0][spalte+1][zeile]==2 && getSpielfeld()[0][spalte-1][zeile]==2 && getSpielfeld()[0][spalte][zeile+1]==2 && getSpielfeld()[0][spalte][zeile-1]==2)
	   				{
	   					setFarbe(2);
	   					setGewonnen(true);
	   				}
	   			}
	   			if(getFarbe()==2)
	   			{
	   				getAnzahlsteine()[1]++;
	   				if(getSpielfeld()[0][spalte+1][zeile]==1 && getSpielfeld()[0][spalte-1][zeile]==1 && getSpielfeld()[0][spalte][zeile+1]==1 && getSpielfeld()[0][spalte][zeile-1]==1)
	   				{
	   					setFarbe(1);
	   					setGewonnen(true);
	   				}
	   			}
	   			
	   				
	   			
	   			if (Gewinnprüfung() != 0)
	   				System.out.println("Gewonnen hat der Spieler: "+Gewinnprüfung()+" oder "+Spielerfarbe);
	   			else
   				wechsleSpieler();
	   		}
			else
				System.out.println("Zug nicht möglich");
		
			repaint();
		}	
		
		if(getGewonnen()==true)
		   {
				nochmal.enable();//Läßt sich auch unnötig in eine Methode auslagern
		   		System.out.print("Neues Spiel?");
		   }
	}	//mouseClicked() Ende

	
	public void mouseEntered(MouseEvent arg0) {}
	public void mouseExited(MouseEvent arg0) {}
	
	//Soll man net so gut sehen xD (kleinmacht)
	public void mousePressed(MouseEvent arg0){		
		int x = arg0.getX();
		int y = arg0.getY();
		if(x>=331 && x<=348 && y>=76 && y<=94){
		setEasteregg(true);
		repaint();}}	
	public void mouseReleased(MouseEvent arg0){		
		setEasteregg(false);
		repaint();}
	
	
	public void actionPerformed(ActionEvent e) 
	{
		//Aufgabe Button "Info"
		if(e.getSource().equals(info))
		{
			setInfobutton(true);
			repaint();
		}
		
				
		//Aufgabe Button "Neues Spiel"
		if(e.getSource().equals(nochmal))
		{
				// Spielfeld leeren bzw. auf 0 setzen
				for(int x=0;x<9;x++)
					   for(int y=0;y<9;y++)
					      getSpielfeld()[0][x][y]=0;
				
				// jeweilige X-Koordinate
				for(int x=0;x<9;x++)
					   for(int y=0;y<9;y++)
					      getSpielfeld()[1][x][y]=x*50+50;
							
				// jeweilige Y-Koordinate
				for(int x=0;x<9;x++)
					   for(int y=0;y<9;y++)
					      getSpielfeld()[2][x][y]=y*50+50;
				
				setGewonnen(false);
				
				setFarbe(1);
				
				getAnzahlsteine()[0]=0;
				getAnzahlsteine()[1]=0;
				
				System.out.println(" ");
				System.out.println("Das neue Spiel startet ab hier");
				System.out.println("------------------------------");
			
			repaint();
		}
	}	//actionPerformed Ende	
}	//Logik-Class 	  Ende


//Probleme
//*größtes Problem ist die Spalte 8 und manchmal die Spalte 0.*
//
//Gitter geht von rechts unten immer weiter nach links vor die steine.
//Sollte aber immer vor den steinen sein.
//
//Die Abfragen in der mouseClicked führen zu einem teilweisen nicht richtigen Umsetzten und behindern
//die Spalte 8 und ab und zu die Spalte 0.
//
//Manchmal löst sich die Gewinnabfrage von selbst aus obwohl die gegebenen Steine nicht an ihren Orten sind.
```


pls meldet euch und vllt bekommt ihr das ja hin


----------



## Marco13 (1. Jun 2009)

Habe das jetzt nicht im Detail nachvollzogen, aber ... der Grund dafür ist, dass das Schwierig ist. Bei Sachen wie

```
for(int spieler=1;spieler<=2;spieler++)
		 for(int spalte=0;spalte<=6;spalte++)
		  for(int zeile=0;zeile<=7;zeile++)
		  {
			  if((getSpielfeld()[0][spalte][zeile]==1)&&(getSpielfeld()[0][spalte+1]
[zeile]==spieler+1)&&(getSpielfeld()[0][spalte+2][zeile]==spieler)&&(getSpielfeld()
[0][spalte+1][zeile+1]==spieler)&&(getSpielfeld()[0][spalte+1][zeile-1]==spieler))
			  		{
```
rollen sich einem leicht die Fußnägel hoch. Vielleicht solltest du das ein bißchen... strukturieren.... Z.B. eine Methode anbieten wie

```
int getSpielfeld(int x, int y, int dx, int dy)
```
damit sowas wie 

```
getSpielfeld()[0][spalte][zeile+1]==1)
```
schonmal zu

```
getSpielfeld(spalte, zeile, 0, 1)==1
```
wird - und DIESE Aufrufe dann wiederum in eine Methode packen wie

```
boolean istEingeschlossen(int x, int y)
{
    ....
    getSpielfeld(x, y,  0, 1) != getSpielfeld(x, y, 0, 0) &&
    getSpielfeld(x, y, -1, 1) != getSpielfeld(x, y, 0, 0) &&
    ...
}
```
oder so...


----------



## GOAd1 (1. Jun 2009)

hm tut mir leid aber wenn ich das so anschaue is es mir lieber es bei einem Array zu belassen, und eben so wie es ist.

Ich weiß eh nicht ganz wie das letztlich aussehen soll so wie du es mit einer Methode machen würdest.

Und im grunde hab ich den überblick auf das momentan schon eher als auf deine Methodenmethode^^


----------



## Marco13 (1. Jun 2009)

Nun gut, vielleicht liest sich das noch jemand anderes durch.
Mir jetzt die Antwort auf die Frage zu erarbeiten, warum hier

if(getSpielfeld()[0][spalte+1][zeile]!=2 && getSpielfeld()[0][spalte-1][zeile]==2...

auf !=2 und ==2 geprüft wird, und hier

if(getSpielfeld()[0][spalte+1][zeile]==1 && getSpielfeld()[0][spalte-1][zeile]==1...

NUR auf ==1, ist mir etwas zu mühsam, sorry...


----------



## GOAd1 (1. Jun 2009)

oh ja xD das is ein kleiner fehler x_X da sollte ==2 tut mir leid. Das hab ich schon lange hier in meinem jetztigen quelltext korigiert.


----------



## Marco13 (1. Jun 2009)

Oh ja 

Btw: Überleg' mal, ob man solche "Probleme"...
_// Die Folgenden 2 if-Abfragen lösen große Probleme in der Spalte 0 sowie 8 aus_
... nicht vielleicht durch geeignete Methoden verhindern kann. Wie würden deine If-Abfragen jetzt aussehen, wenn du dort überall noch die 4 Sonderfälle (x=0, y=0, x=8, y=8) behandeln wolltest?


----------



## GOAd1 (1. Jun 2009)

naja ka wie du das genau meinst

hab den Quelltext jetzt mal so neu reingesetzt wie er grad bei mir im Eclispe steht.

Sprich es geht nun eig. alles ausser das Problem in der Spalte 8. Dort wechselt er mir den Spieler nicht automatisch was sehr bedenklich ist x_X und naja ich hab keine Ahnung wieso die Steine unter das Spielgitter gezeichnet werden.

Ach und weiß vllt jemand wie ich sobald ich einen Button klicke (hier wäre es der Button "info") eine art PoP-UP aufbekomme oder einfach ein anderes Applet indem ich zum Beispiel nur die Spielregeln als String drinstehen hab mit einem Beenden Button.

Wobei ich auch keine Ahnung hab wie man ein Applet mit einem Button schließen kann denn die Methode close() gibts ja nicht nur stop() und destroy() aba ka wie ich die anwenden muss da passiert nie was^^


----------



## Quurks (7. Jun 2009)

Popup:

```
JOptionPane.showMessageDialog(null, "Hier steht die Nachricht, sogar mit \nZeilenumbrüchen");
```
Nach dem OK-Klick gehts im Programm weiter


----------

