# Problem beim Programmieren Von Mühle



## Black_Divil (28. Sep 2007)

Hi,

Habe vor längerer Zeit angefangen Mühle zu Programmieren und bin nun an einen kleinen(für mich großen) Problem angekommen. Das Spiel an sich ist so gut wie Fertig allerdings hab ich das Spielbrett etwas unschön beschrieben.

Hab mittels Integer Array das spielbrett an sich gespeichert
sprich 0 = kein stein, 1 = stein von Spieler1, 2 = stein von Spieler2
wenn nun alle steine von beiden spielern gesetzt sind kann ja nur noch ein feld weiter gezogen werden. 
Nachdem mein spiel Drag&Drop fähig ist zieh ich mir mein stein nun zu dem nächsten punkt auf dem spielbrett.
wenn ich nun mein stein mit der maus nehm und zieh in an die neue position passiert folgendes:
Die alte position wird durch die X,Y koordinaten des MousePressed Events gespeichert und das geht nur wenn nicht schon eine Position ermittelt wurde.
Das geht auch prima. Leider nur nicht immer. 
die positionen sind alle von der Linken oberen Ecke aus durch nummeriert
so wie hier

```
/** 
	 *   0          1          2
	 *   O----------O----------O
	 *   |   3     4|      5   |
	 *   |   O------O------O   |
	 *   |   |   6 7|  8   |   |
	 *   |   |   O--O--O   |   |
	 *  9| 10| 11|   12| 13| 14|    
	 *   O---O---O     O---O---O
	 *   |   |   | 16  |17 |   |
	 *   |   | 15O--O--O   |   |
	 *   |   |    19|    20|   |
	 *   | 18O------O------O   |
	 *   |        22|        23|
	 * 21O----------O----------O
	 */
```

aus unerklärlichen gründen gibt mein Programm gerne auch mal die pos 10 durch wenn ich mich von der 7 zur 4 bewegt hab... allerdings auch nicht immer.

Nachdem mich das ganze jetzt schon fast 1 monat ärgert, ich den fehler immernoch nicht gefunden hab und ich meine Lösung auch nicht so schick find bin ich bereit einen anderen Weg zu gehen...

Mir ist aber noch keiner eingefallen.... Hier kommt ihr ins Spiel.
Hat von euch jemand eine Idee wie man das schicker Lösen könnte?


----------



## Marco13 (28. Sep 2007)

Black_Divil hat gesagt.:
			
		

> Hi,
> Die alte position wird durch die X,Y koordinaten des MousePressed Events gespeichert und *das geht nur wenn nicht schon eine Position ermittelt wurde.*


Was bedeutet das? D.h. WAS passiert denn WANN bei deinem Drag/Drop?


----------



## Black_Divil (28. Sep 2007)

Also,
hab mir ja schon gedacht das ich das ein bisschen doof geschrieben hab...

Habe eine eigene Klasse für die Figuren für Spieler 1, und auch eine Eigene für die figuren von Spieler 2.
beide Reagieren auf
Mouse_Pressed
Mouse_Released
Mouse_Dragged(MouseMotion)

Diese Events werden dann von mein Spielfeld Verabeitet.

Bei Pressed Passiert weiter nix... auser das die alte Position gespeichert wird...

ich musste nur ein kleines Problem umgehen, da mouse_Dragged ja erst den Event Meldet wenn die Maus gedrückt gehalten und gezogen wird... 


um die Punkte die die genaue ablageposition bestimmen, definier ich ein bereich von 20px X 20px.
in diesen bereich werden steine auf die richtige position gezogen wenn sie losgelassen aber noch nicht ganz richtig liegen... 

dazu vieleicht noch ein beispiel

nehmen wir an das feld 1 sitzt auf pos 100,100
dann werden die figuren noch akzeptiert die zwischen 90,90 und 110,110 liegen.

wird die Maus also losgelassen prüf ich wo sie abgelegt wurde... wurde sie falsch abgelegt lass ich sie einfach da wieder erscheinen wo sie vorher war...
Ist sie richtig bzw. im bereich kommen die Regeln ins spiel...

Mouse_Dragged sorgt einfach nur dafür das die figur sich auch auf den bildschirm bewegt...

ich hoffe das ich damit deine Frage beantworte, fals noch mehr fragen sind... ich lauf nicht weg ;-)


----------



## Marco13 (30. Sep 2007)

OK. Es geht also NICHT um das "echte" Drag&Drop - wäre mir hier auch seltsam vorgekommen. 

Jetzt hast du aber immernoch nicht gesagt, WO und WANN etwas falsches passiert.

```
class XXX
{
    Point startPos = null;
    mousePressed(event)
    {
         startPos = computFrom(event);
    }

    mouseDragged(event)
    {
         setPieceLocation(event);
         repaint();
    }

    mouseReleased(event)
    {
        Point endPos = computFrom(event);
        if (valid(startPos, endPost) doMove(startPos, endPos);
        else kreisch();
    }
}
```


----------



## Black_Divil (30. Sep 2007)

Tja, tut mir leid darauf kann ich dir auch keine antwort geben...
Ich weis nicht wo der fehler auftritt...

Es kommt vor das die alte position nicht richtig erkannt wird...
das ist natürlich verherend aber am code der das prüft kann ich kein fehler feststellen.

```
public int positionVonFigurErmitteln(Point p)
{
	int posnr = -1;
	
	for (int j=0; j<pos.length; j++)
	{
		if(pos[j].x-kulanzwert <= p.x & pos[j].x+kulanzwert >= p.x)
		{
			if(pos[j].y-kulanzwert <= p.y & pos[j].y+kulanzwert >= p.y)
			{
				posnr = j;
			}
		}
	}
		
        return posnr;
}
```
in pos[] sind alle positionen des Spielbretts p ist die position von Event.
kulanzwert steht derzeit auf 11 dadurch werden die positionen leichter erkannt wenn die figur daneben gelegt wird...
da die felder aber teilweise nur 20 px auseinander sind kommt es so schon leicht zu fehlern...

aber wie gesagt... 
ich würde es auch anders schreiben ...
dachte auch schon daran eine Feld klasse zu schreiben die dann die sich dann merkt welche figur da gesessen war und wo sie sich dann hin bewegt hat... darüber hinnaus könnte ich dann abfragen auf welches feld abgelegt wurde...
nur weis ich nicht obs was bringt... darüber hinnaus müsste ich dann c.a. 80 % von der Klasse umstricken...(ob danach noch was geht ???:L )

Gibts vieleicht noch ne bessere Idee wie mann das relativ einfach schreiben könnte?

Ich denk ich werd bald das ganze teil neu schreiben...
Finde es eh nicht so gut die Spielfeld klasse hat knapp 900 Zeilen. kommt aber auch davon das da alles drin hängt... sogar die regeln...

P.S. Warum nicht das echte Drag&Drop ... das ist doch denke ich das selbe ich drück die maus auf ein object halte es damit fest und kann es wo anders ablegen... ich bin der meinung nichts anderes ist drag&drop ... oder seh ich das falsch?


----------



## Marco13 (30. Sep 2007)

Mit "echtem" Drag and Drop meinte ich das
http://java.sun.com/docs/books/tutorial/uiswing/dnd/intro.html
wie wenn man z.B. eine Datei vom Windows-Explorer auf den Desktop zieht ... 

Zum eigentlichen Problem: Ein paar Debug-Ausgaben sollten schon helfen.


```
public int positionVonFigurErmitteln(Point p)
{
   System.out.println("Ermittle position für "+p);

   int posnr = -1;
   
   for (int j=0; j<pos.length; j++)
   {
      int x0 = pos[j].x-kulanzwert;
      int x1 = pos[j].x+kulanzwert;
      int y0 = pos[j].y-kulanzwert;
      int y1 = pos[j].y+kulanzwert;

      if(x0 <= p.x & x1 >= p.x && y0 <= p.y & y1 >= p.y)
      {
         System.out.println("Grenzen von Position "+j+" sind "+x0+" "+y0+" - "+x1+ " "+y1+" und da ist "+p+" drin");
         posnr = j;
      }
   }

   System.out.println("Position für "+p+" is "+posnr);
   return posnr;
}
```

Dann kreigst du mit, WANN die Methode aufgerufen wird, und es wird genau mitgetrackt, wie die (fehlerhafte?!) position zustande gekommen ist.


----------



## Black_Divil (1. Okt 2007)

Gut, ... das hab ich ja auch schon mal versucht.
Hat mich leider nicht weiter gebracht... 

Bin nun selbst aber auf ein paar ungereimtheiten in meinen Code gestoßen.
Das lag zum teil daran das ich alle spielsteine gelöscht und danach wieder gesetzt hab wenn sich was auf dem spielfeld getan hat. Das hatte auch einen grund warum ich das so gemacht hab... (tieferen sinn hatte das nicht!) 
es war ein test da manche steine einfach nicht verschwinden wollten... (es hat geholfen - aber der fehler blieb)
nun sind aber endlich einige fehler drausen und der stein der entfernt werden soll wird nun unabhängig von den anderen entfernt. 

Leider blieb der lern effekt aus da ich mir es nicht genau erklären kann woran nun letztendlich der fehler lag. vermute aber viele MouseListener auf dem selben object.

naja...
nun hoffe ich das ich mein Projekt ohne größeren hindernissen zu ende bringen kann.
viel fehlt ja nicht mehr... trotzdem danke für die mithilfe/unterstützung..


----------

