# Tetris - Spielfeldgröße



## JavaKüken (24. Jan 2009)

hallo ihr lieben java-experten.

ich programmier für ein uni-projekt das spiel tetris. wie kann ich es schaffen, dass geprüft wird, bevor der stein bewegt wird, ob er überhaupt bewegt werden darf oder ob er schon den rand vom spielfeld erreicht hat?


```
private boolean canBeMoved(int newX, int newY) {
		int x;
		int y;
		
		board.getWidth();
		board.getHeight();
```


Hier hol ich mir mal die Breite bzw. die Höhe vom Spielfeld. 

Bitte um schnelle Hilfe!!!

Danke.


----------



## Fu3L (24. Jan 2009)

Du prüfst einfach, ob die Position x + die Breite des Objekts + die angestrebte Bewegung einen größeren Zahlenwert als die Breite des Spielfelds hat oder ob die Position x + die angestrebte Bewegung einen kleineren Zahlenwert als 0  hat und wenn ja, schneidet das Objekt den Rand und dann musst du halt was dagegen tun. Für y entsprechend...


----------



## hdi (24. Jan 2009)

Ja also bist du jetzt einfach nur faul oder weisst du das echt nicht?


```
private boolean canBeMoved(int newX, int newY) {
      return (newX < board.getWidth() && newX >= 0 && newY < board.getHeight());
}
```

* gilt nur falls du die Steine nicht fliessend bewegst, sondern abrupt jeweils um ihre Grösse.
Ausserdem gehe ich hier davon aus, dass die Koordinaten für den linken oberen Eckpunkt eines Steins stehen.


----------



## Fu3L (24. Jan 2009)

hdi hat gesagt.:
			
		

> Ausserdem gehe ich hier davon aus, dass die Koordinaten für den linken oberen Eckpunkt eines Steins stehen.



Das müsste man bei mir auch noch ergänzen, das hab ich mal als Üblich vorausgesetzt.


----------



## Guest (24. Jan 2009)

ok ich hab das jetzt mal so hinzugefügt... danke für die hilfe, kann leider nicht testen ob es funktioniert, da ich jetzt eine fehlermeldung bekomme, aber der code schaut mal so aus:


```
private boolean canBeMoved(int newX, int newY) {
		int x;
		int y;
		
		board.getWidth();
		board.getHeight();
		
		
	 return (newX < board.getWidth() && newX >= 0 && newY < board.getHeight());
	
		
	}
```

schaut jetzt so aus 

aber jetzt krieg ich in meinem TetrisPanel (=Spielfeld) in folgende Zeilen:


*case 3: //triangle*
*}*

folgende Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1

Mei ich verzweifel... was will denn der von mir?


----------



## Fu3L (24. Jan 2009)

Du scheinst bei einem Array auf array[-1] zuzugreifen, was natürlich nicht geht, aber wie sich das vermeiden lässt, kann ich dir _so_ auch nicht sagen  :shock:


----------



## Guest (24. Jan 2009)

das hier ist die methode, die die fehlermeldung aufweist: 


```
private void clearPosition() {
		for(int x = 0; x<currentX+1; x++){
			for(int y = 0; y<currentY+1; y++){
				switch (myStone.getSType()) {
				case 1: // bar
					myStone.getStoneArray()[x][y] = 0;
					myStone.getStoneArray()[x+1][y] = 0;
					myStone.getStoneArray()[x+2][y] = 0;
					myStone.getStoneArray()[x+3][y] = 0;
					break;
				case 2: //square
					myStone.getStoneArray()[x][y] = 0;
					myStone.getStoneArray()[x+1][y] = 0;
					myStone.getStoneArray()[x+1][y+1] = 0;
					myStone.getStoneArray()[x][y+1] = 0;
					break;
				case 3: //triangle
					myStone.getStoneArray()[x][y] = 0;
					myStone.getStoneArray()[x][y+1] = 0;
					myStone.getStoneArray()[x-1][y+1] = 0;
					myStone.getStoneArray()[x+1][y+1] = 0;
					break;
				case 4: //rightL
					myStone.getStoneArray()[x][y] = 0;
					myStone.getStoneArray()[x][y+1] = 0;
					myStone.getStoneArray()[x+1][y+1] = 0;
					myStone.getStoneArray()[x+2][y+1] = 0;
					break;
				case 5: //leftL
					myStone.getStoneArray()[x][y] = 0;
					myStone.getStoneArray()[x+1][y] = 0;
					myStone.getStoneArray()[x+2][y] = 0;
					myStone.getStoneArray()[x+2][y+1] = 0;
					break;
				}
			}
		}
		
	}
```
is da irgendwas so wie es nicht sein sollte?  danke übrigens für die schnelle antwort!


----------



## Fu3L (24. Jan 2009)

```
myStone.getStoneArray()[x-1][y+1] = 0;
```

Die Zeile fällt mir beim Überfliegen auf. Wenn nämlich x 0 ist, dann ist x-1 == -1.

Am besten du klammerst den Teil mal aus mit // und schreibst stattdessen: System.out.println(x-1); und guckst was rauskommt...


----------



## Guest (24. Jan 2009)

wir haben bereits versucht die zeile auszukommentieren, jedoch leider vergebens. Wir haben alles überprüft damit nirgends auf ein "negatives" array verwiesen wird, jedoch zeigt er den fehler immer dort an, wo ganz sicher positive arrays sind 

komisch oder? 

 :bloed: 

sag mal, kennst du dich auch mit dem timer aus?

den braucht man ja bei so einem spiel wie tetris oder?

also wir haben mal einen gemacht... nur leider fliegt der stein total schnell runter... und egal welchen wert wir bei speed eingeben, die geschwindigkeit bleibt unverändert. 


```
timer = new Timer(1000,this);
            timer.setDelay(10);
	    timer.start();
```

des 1000 is ja die geschwindigkeit, oder?


----------



## André Uhres (24. Jan 2009)

Eine Kollision kann nicht nur am Rand entstehen, sondern auch an einer anderen Figur.
Zur Feststellung einer Kollision gehen wir einfach die vier Teilquadrate der Figur durch
und prüfen jeweils ob das Teilquadrat (gemäß der aktuellen Rotation der Figur)
auf einer freien Boardposition liegt. Wenn nicht, ist es eine Kollision.

javax.swing.Timer(int delay, ActionListener listener)
          baut einen Timer und initialisiert den "initial delay" und den "between-event delay" mit delay Millisekunden.
In meinem Beispiel habe ich jetzt auch einen Swing Timer eingebaut: TetrisDemo.jar (Quellcode im jar).


----------

