# Hilfe bei Programmierung von Abalone



## Aynami (10. Jan 2006)

Hallo! 


Ich möchte gerne das Speil Abalone programmieren. Allerdings bereitet mir die Programmierung des Spielbrettes einige Problem. 
Das Spielbrett hat die Form eines 6ecks. 

Hier könnt ihr euch ein Bild dazu ansehen.

Ich habe mit einer for Schleife versucht, die Kreise mittels "Paintmethode" zu zeichnen, bekomme allerdings nur die obere Hälfte richtig hin.

Hier der Testquelltext:


```
public class Kreise extends  Canvas {

	
   	public Kreise(){
		
	
		
	}

	
	public void paint(Graphics g){
		
		  int r = 8;
		  int i, j;
		  int x, y;
		
		  for (i=5; i<10; ++i) {
		     x = 150 - r * i;
		     y = (int) (40 + (i - 1) * 1.7321 * r);
		     for (j=1; j<=i; ++j) {
		       g.setColor(Color.RED);
		       g.drawOval(x,y,2*r,2*r);
		       g.fillOval(x,y,2*r,2*r);
		       
		       x += 2 * r;
		
		     }	
		
		  }
		  
		  for (i=9; i>7; --i) {
			     x = 150 - r * i;
			     y = (int) (67 + (i - 1) * 1.7321 * r);
			     for (j=1; j<=i; ++j) {
			       g.setColor(Color.RED);
			       g.drawOval(x,y,2*r,2*r);
			       g.fillOval(x,y,2*r,2*r);
			       
			       x += 2 * r;
			
			     }	
			
			  }
		  
	}
	
	
	
	
	public static void main(String[] args) {
	
		
		final Frame f = new Frame("GraphicsExample");
		f.setSize(800, 480);
		f.add(new Kreise());
		
		f.addWindowListener(
				new WindowAdapter() {
					public void windowClosing(WindowEvent e)
					{
						f.setVisible(false);
						f.dispose();
						System.exit(0);
					}
				}
			);
		
		f.setVisible(true);
	}

}
```

Vielleicht kann mir einer von euch weiter helfen.
Wäre über jede Hilfe dankbar!


----------



## MPW (13. Jan 2006)

hm....also normaler Weise wuerde man einfach ein Bildnehmen, und es da hinhaengen, aber wenn du es umbedingt zeichnen willst... versuch mal den Algorithmus von der oberen Haelfte einfach umzudrehen...


----------



## André Uhres (13. Jan 2006)

```
private final int R = 20;
    public void paint(Graphics g){
        boolean draw = false;
        int y = 50;
        for (int i = 0; i < 9; i++) {
            int x = 50;
            for (int j = 0; j < 17; j++) {
                draw = !draw;
                boolean skip = false;
                if(((i==0 || i==8) && (j< 3 || j>13)) ||
                   ((i==1 || i==7) && (j< 2 || j>14)) ||
                   ((i==2 || i==6) && (j< 1 || j>15)))
                    skip=true;
                if(draw && !skip)
                    g.drawOval(x,y,R,R);
                x += R;
            }
            y += R*1.7321 ;
        }
    }
```


----------



## Aynami (24. Jan 2006)

Wow super, damit klappts! 
Ich hatte es auch noch anders realisiert, in dem ich ein Zahlenarray gebaut hatte und dieses mit Hilfe von einer doppelten for-schleife und if Anweisungen mit Kreisen gefüllt hatte.
Aber vielen vielen Dank für die Antwort!


----------



## Gast (26. Jan 2006)

Hallo, das ist meine Version

public void paint(Graphics g){

      int r = 8;
      int i, j;
      int x, y;
      int x_offset=150;
      int y_offset=100;
      int f=20;
      int max=8;
      for (i=0; i<=4; ++i) {
    	  y=y_offset+(int)(i*f*0.9); 
    	  for (j=0; j<=max-i; ++j) {
    		  x=x_offset+(int)((j+0.5*i)*f);
    		  g.setColor(Color.RED);
    		  g.drawOval(x,y,2*r,2*r);
    		  g.fillOval(x,y,2*r,2*r);
          }   
       }

      for (i=1; i<=4; ++i) {
    	  y=y_offset-(int)(i*f*0.9); 
    	  for (j=0; j<=max-i; ++j) {
    		  x=x_offset+(int)((j+0.5*i)*f);
    		  g.setColor(Color.RED);
    		  g.drawOval(x,y,2*r,2*r);
    		  g.fillOval(x,y,2*r,2*r);
          }   
       }

 }


----------



## Aynami (29. Jan 2006)

Nach einigem Rumprobieren habe ich mich jetzt entschieden, dass Feld mit JPanel zu füllen, denn diese kann ich ja mit einem MouseListener ansprechen und so z.B. die Farbe der Kugeln ändern oder einen anderen Zustand erzeugen.

Die Erzeugung des Panelfeldes sieht so aus:


```
final static  int RAND=1;
    final static int SPIELRAND=4;
    final static int LUECKE =5;
    final static int FELD=6;
	
	
    static int array_leer[][]={
			 
			 {4,4,4,4,4,1,1,1,1,1,1,1,1,1,4,4,4,4,4},
			 {4,4,4,4,1,6,5,6,5,6,5,6,5,6,1,4,4,4,4}, 
			 {4,4,4,1,6,5,6,5,6,5,6,5,6,5,6,1,4,4,4}, 
			 {4,4,1,6,5,6,5,6,5,6,5,6,5,6,5,6,1,4,4}, 
			 {4,1,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,1,4}, 
			 {1,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,1}, 
			 {4,1,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,1,4}, 
			 {4,4,1,6,5,6,5,6,5,6,5,6,5,6,5,6,1,4,4},
			 {4,4,4,1,6,5,6,5,6,5,6,5,6,5,6,1,4,4,4}, 
			 {4,4,4,4,1,6,5,6,5,6,5,6,5,6,1,4,4,4,4}, 
			 {4,4,4,4,4,1,1,1,1,1,1,1,1,1,4,4,4,4,4}, 
		 };

         
            // Erzeugung eines JPanel Arrays
          JPanel[][] panel = new JPanel[11][19];

          // Füllen des Zahlenarrays mit den JPanel
          for (int i = 0; i < a.array_leer.length; i++) {
			
			for (int j = 0; j < 19; j++) {
   
				  
				
				if (a.array_leer[i][j] == a.FELD) {

				panel[i][j] = new JPanel();
				panel[i][j].setBackground(Color.RED);
				panel[i][j].setBounds(j*18+50,i*35+50,30,30);
				
						
				this.add(panel[i][j]);
				
				
				}
			
		}
```


Soweit so gut! Wenn ich jetzt meine MouseClicked Methode Fülle, komme ich aber zu einem neuen Problem, wo ich gerade bei der Lösung festhänge und nicht vorwärts komme.
Ich habe mir erstmal zum Test die Position des ersten Panel gemerkt und wenn ich dort klicke, wird die Hintergrundfarbe auf Grün gesetzt und ein Kreis gemalt. Das schaut so aus :


```
public void mouseClicked(MouseEvent e) {

		// dient nur zur Bestimmung der x,y Position der Maus
                                System.out.println("x=" + e.getX() + "y=" + e.getY());

		for (int i = 0; i < panel.length; i++) {
			for (int j = 0; j < 19; j++) {

				
	                    if ((e.getX() > 140 && e.getX() < 170) && (e.getY() > 85 && e.getY() < 115)) 
                                        {
			panel[1][5].setBackground(Color.GREEN);
			Graphics g = panel[1][5].getGraphics();
			g.fillOval(0,0,30,30);
		        }	
		}
	             }

		if (e.getButton() == MouseEvent.BUTTON3) {

			repaint();
		}

	}
```

Mein Problem ist jetzt folgendes: Wenn ich jedes JPanel einzeln ansprechen will, dann müsste ich mir von jedem JPanel die Position merken. Wenn man das per Hand macht, hat man später in der MouseClicked Methode sehr viele if - Anweisungen, was nicht so sonderlich effizient ist. 
Mir ist aber auch noch kein passender mathematischer Algorythmus dazu eingefallen um das Ansprechen der verschiedenen JPanel zu verallgemeinern.
Weiß einer von Euch weiter? 
Ich hatte noch versucht jedem JPanel einen MouseListener zuzufügen, denn dann müsste ich mir die Koordinaten nicht merken. Aber mit der Variante kam ich auch nicht weiter ....  :cry: 

Ich würd mich über eure Antworten freuen!  :lol:


----------



## MPW (29. Jan 2006)

Also so sonderlich performant ist das nicht, was du da fabrizierst, mach das besser mal so:

 - 1 Panel
 - MouseListener
 - Bei Klick Position rauskriegen, und das entsprechende Quadrat einfaerben....das wurde ich machen, in dem du bis bei den x und y Positionen des Clicks jeweils bis zum naechsten 10/100 vorwaerts oder zurueck springst oder Arrays machst und eine kleine Kollisionsmethode schreibst.


----------

