2013-03-06 10 views
5

Próbuję zrobić grę Tetris w języku Java.java: losowy blok tetris wygenerowany w wierszu wyczyść

Dostałam go do punktu, w którym:

  • nowy blok jest generowany, gdy upadnie na podłogę lub jej y + 1 nie jest null (co oznacza, że ​​jest inny blok pod nią)

    public void collisionCheck(int x, int y) { 
        if (activetile.getY() == this.height-2 || getTileAt(x, y+1) != null) { 
         activetile = new Tile(this, 0, 0);  
        } 
    } 
    
  • wiersz usuwa gdy dolny rząd jest pełna wartość niż zero lub kawałki Tetris (na y = 4 (podłoże) w pętli x aż x = 4 i sprawdzić, czy wszystko nie jest pusta)

    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++; 
        } 
    } 
    

Teraz używam klawiszy, aby przenieść blok:

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(); 
    } 
    } 

Są dwie kwestie Mam:

1) w obrazie zauważysz Zrzuciłem blok na całą podłogę ... i rząd się wyjaśnił. Po wyczyszczeniu wygeneruje blok w lewym górnym rogu (x = 0, y = 1), nad którym nie mam kontroli.

2) Na podłodze wydaje się być czerwona linia ... która, jak zakładam, to rząd bloków ukrytych przez JFrame ... Nie jestem pewien, dlaczego tak jest.

enter image description here

FYI: Jeśli zastanawiasz się, dlaczego siatkę [j] [i] zawiera wiersze i kolumny przerzucony (aka, dlaczego to nie jest grid [i] [j]), to dlatego, że instancja go jako grid = new Tile[height][width];

Jakieś myśli?

Dzięki!

Odpowiedz

0

Bah,

Okazuje się, że w kluczowej imprezy, musiałem sprawdzić czy dolna była pełna przed sprawdzeniem, czy istnieje kolizja.

myślę, co się dzieje jest, kiedy sprawdzałam collisionCheck(activetile.getX(),activetile.getY()); przed checkBottomFull(0,4);, gdy dolna była pełna, to usunąć wiersz i ustawić bieżący wiersz równą rzędu nad nim: grid[j][i] = getTileAt(i,j-1);, problemem było to, że collisionCheck było generowanie nowego kawałka i ten nowo wygenerowany fragment został usunięty i zastąpiony przez checkBottomFull.

Wstawienie testu kolizji po checkBottomFull gwarantuje, że nowo wygenerowany element nie zostanie wymieniony, jeśli spód jest pełny.

0

Trudno powiedzieć, co jest nie tak, bez debugowania aplikacji. Ale może spróbować tego:

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++; 
    } 
} 

Masz 5 wierszy (indeksowane od 0 do 4) i 4 kolumny (indeksowane od 0 do 3). Jakie wartości wysokości i szerokości przechodzą na: siatka = nowa Płytka [wysokość] [szerokość];

Ponieważ z tego co widzę, powinieneś zrobić coś takiego: siatka = nowa płytka [5] [4];