Tetris - Spielfeldgröße

Status
Nicht offen für weitere Antworten.

JavaKüken

Mitglied
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?

Code:
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

Top Contributor
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

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

Code:
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

Top Contributor
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.
 
G

Guest

Gast
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:

Code:
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

Top Contributor
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:
 
G

Guest

Gast
das hier ist die methode, die die fehlermeldung aufweist:

Code:
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

Top Contributor
Code:
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...
 
G

Guest

Gast
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.

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

des 1000 is ja die geschwindigkeit, oder?
 

André Uhres

Top Contributor
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).
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben