2015-01-08 2 views
0

Я пытаюсь сделать игру змеи, но у меня есть несколько проблем. У меня есть этот поток, который содержит игровой цикл, но он не работает. Это простая форма моего цикла, я упростил его, потому что сначала он не работал, но он еще не работает. Что происходит, так это то, что моя переменная state сбрасывается до 0 после первого цикла, и я действительно не знаю, почему. Я пытаюсь так много способов исправить это, но я не могу найти проблему.Почему мой массив сбрасывается до 0 после каждого цикла?

О да, также не смотрите на небрежное начало моего метода запуска, я пытаюсь исправить вещи, и это становится довольно уродливым.

public void run() { 
    alive = true; 
    keyPressed = 2; // Right 
    keyPressedBefore = 2; 
    field = Gui.getPanelArray(); 
    state = new int[20][20]; 
    newstate = new int[20][20]; 
    previous = new int[20][20]; 
    coordw = new int[20*20]; 
    coordh = new int[20*20]; 
    length = 2; 
    width = height = 20; 

    for (int w = 0; w < 20; w++) { 
     for (int h = 0; h < 20; h++) { 
      state[w][h] = 0; 
     } 
    } 
    state[0][0] = 1; 
    render(state,field); 
    previous = state; 
    newstate = state; 

    try { 
     Thread.sleep(2000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    loop(); 
} 

private void loop() { 
    while (alive) { 
     for (int w = 0; w < 20; w++) { 
      for (int h = 0; h < 20; h++) { 
       newstate[w][h] = 0; 
      } 
     } 

     if (keyPressed == 0) { 
      for (int w = 0; w < 20; w++) { 
       for (int h = 0; h < 20; h++) { 
        if (state[w][h] == 1) { 
         newstate[w][h-1] = 1; 
        } 
       } 
      } 
     } else if (keyPressed == 1) { 
      for (int w = 0; w < 20; w++) { 
       for (int h = 0; h < 20; h++) { 
        if (state[w][h] == 1) { 
         newstate[w-1][h] = 1; 
        } 
       } 
      } 
     } else if (keyPressed == 2) {    
      for (int w = 0; w < 20; w++) { 
       for (int h = 0; h < 20; h++) { 
        if (state[w][h] == 1) { 
         newstate[w][h+1] = 1; 
        } 
       } 
      } 
     } else if (keyPressed == 3) { 
      for (int w = 0; w < 20; w++) { 
       for (int h = 0; h < 20; h++) { 
        if (state[w][h] == 1) { 
         newstate[w+1][h] = 1; 
        } 
       } 
      } 
     } 
     render(newstate, field); 
     state = newstate; 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     //keyPressedBefore = keyPressed; 
    } 

} 

ответ

2

Поскольку первый раздел вашего цикла явно устанавливает массив в ноль. Комментарий это как

while (alive) { 
    // for (int w = 0; w < 20; w++) { 
    // for (int h = 0; h < 20; h++) { 
    //  newstate[w][h] = 0; 
    // } 
    // } 

Кроме того, не просто присвоить ссылку здесь

// state = newstate; 
state = Arrays.copyOf(newstate, newstate.length); 
+0

Это устанавливает 'newstate' 0, я говорю о' state'. Я перезагружаю newstate, так что это проще в использовании, но состояние должно содержать записи, отличные от нулей. – tomishomo

+0

@BorisVerwoerd Не после назначения 'newstate'' state'. –

+0

Жаль, что я потерял тебя здесь. Если я правильно прочитал, 'newstate' будет установлен в 0, то заданные значения будут' state'. Тогда 'state' устанавливается равным' newstate', теперь у них все еще есть записи, отличные от нуля. Но теперь, когда я снова сказал «newstate» в 0, «состояние» также отличается, но почему? Я не равнялся им, когда 'newstate' все еще 0. – tomishomo

Смежные вопросы