2013-03-06 4 views
5

Ich versuche, das Spiel Tetris in Java zu machen.Java: Tetris zufälliger Block erzeugt nach Zeile löschen

Ich habe es zu dem Punkt, wo:

  • ein neuer Block erzeugt wird, wenn er trifft den Boden oder seine y + 1 nicht null ist (was bedeutet, es gibt einen anderen Block unter ihm)

    public void collisionCheck(int x, int y) { 
        if (activetile.getY() == this.height-2 || getTileAt(x, y+1) != null) { 
         activetile = new Tile(this, 0, 0);  
        } 
    } 
    
  • Eine Zeile wird gelöscht, wenn die untere Zeile voll mit Werten ungleich Null ist, oder die Tetris-Teile (für y = 4 (der Boden), Schleife x bis x = 4 und prüfen, ob alle nicht null sind)

    public void checkBottomFull(int x, int y) { 
    while (getTileAt(x,y) != null) {  
        say("(" + x + ", " + y +")"); 
        if (x == 3) { 
         say("row is full");  
         //replace full row with tiles from above 
         for (int i = 0; i < 4; i++) { 
          for (int j = 5; j > 0; j--) { 
           grid[j][i] = getTileAt(i,j-1); 
           grid[j-1][i] = null; 
          } 
         } 
        break; 
        }  
        x++; 
        } 
    } 
    

Gerade jetzt, ich bin Tasten um den Block zu bewegen:

public void keyPressed(KeyEvent e) { 
    int keyCode = e.getKeyCode(); 
    if(keyCode == KeyEvent.VK_DOWN) { 
     activetile.setLocation(activetile.getX(), activetile.getY()+1); 
     System.out.println("coordinates: " + activetile.getX() + ", " + activetile.getY()); 

     collisionCheck(activetile.getX(),activetile.getY()); 

     checkBottomFull(0,4); 

     repaint(); 
    } 
    } 

es zwei Probleme, das ich habe:

1) Auf dem Bild werden Sie feststellen, Ich habe den Block bis auf den Boden fallen lassen ... und die Reihe ist geklärt. Nach dem Löschen erzeugt es einen Block nach oben links (x = 0, y = 1), auf den ich keine Kontrolle habe.

2) Auf dem Boden scheint eine rote Linie zu sein ... was ich annehme ist eine Reihe von Blöcken, die vom JFrame versteckt sind ... Ich bin nicht sicher, warum das dort ist.

enter image description here

FYI: Wenn Sie sich fragen, warum grid [j] [i] hat die Zeilen und Spalten gespiegelt (aka, warum es nicht grid [i] [j]) ist, weil ich es instanziiert als grid = new Tile[height][width];

Irgendwelche Gedanken?

Danke!

Antwort

0

Bah,

Stellt sich im Schlüsselereignis aus, ich überprüfen benötigt, wenn der Boden vor der Prüfung voll war, wenn es zu einer Kollision ist.

Ich denke, was passiert, ist, wenn ich collisionCheck(activetile.getX(),activetile.getY()); vor checkBottomFull(0,4); Überprüfung, wenn der Boden voll war, würde es die Zeile löschen und die aktuelle Zeile gleich der Zeile darüber gesetzt: grid[j][i] = getTileAt(i,j-1);, war das Problem, dass collisionCheck war Erzeugen eines neuen Stücks und das neu erzeugte Stück wurde gelöscht und durch checkBottomFull ersetzt.

Durch die Kollisionsprüfung nach checkBottomFull wird sichergestellt, dass das neu erzeugte Teil nicht ersetzt wird, wenn der Boden voll ist.

0

Es ist schwer zu sagen, was falsch ist, ohne die App tatsächlich zu debuggen. Aber vielleicht versuchen, dieses:

public void checkBottomFull(int x, int y) { 
    while (getTileAt(x,y) != null) {  
    say("(" + x + ", " + y +")"); 
    if (x == 3) { 
     say("row is full");  
     //replace full row with tiles from above 
     for (int i = 0; i < 4; i++) { 
      for (int j = 4; j >= 0; j--) { 
       grid[j][i] = getTileAt(i,j-1); 
       grid[j-1][i] = null; 
      } 
     } 
    break; 
    }  
    x++; 
    } 
} 

Sie haben 5 Zeilen (0-4 indexiert) und 4 Spalten (von 0 bis 3 indexiert). Welche Werte für Höhe und Breite geben Sie an: grid = new Tile [Höhe] [Breite];

Weil, was ich sehe, sollten Sie etwas tun: grid = new Tile [5] [4];