2013-05-10 2 views
2

Предположим, у меня был массив с 4 элементами, и я хочу прокрутить их до тех пор, пока не будет выполнено какое-то определенное условие, каким бы лучшим способом я мог это сделать? Моя идея была бы что-то вроде:Цикл через массив

ArrayList<Player> myList = new ArrayList<Player>(); 
myList.add(new Player("a")); 
myList.add(new Player("b")); 
myList.add(new Player("c")); 

for(int i = 0; i < 3; i++) { 

    if(isGameOver) 
     break; 

    if(i == 2) 
     i = 0; 
} 

Но я подумал, что, возможно, было более элегантное решение ...

+2

Array или ArrayList? – squiguy

+0

Извините, ArrayList :) – MrD

+0

По крайней мере, вы должны использовать 'size()' вашего списка как привязку цикла, а не жесткое кодирование. 3. –

ответ

3

Условие ломает цикл должен быть использован в while цикле:

int i = 0; 
while (!isGameOver) 
{ 
    // Do something here. 

    i = (i + 1) % 3; 
} 

Здесь % - оператор модуля; то есть остаток при делении на 3. Таким образом, i является 0, 1, 2, 0, 1, 2, ...

+0

Обязательно объясните, что означает '%' для новичков. – Patashu

+0

Приветствия: D Я думаю, что это будет делать :) – MrD

+0

Я действительно должен что-то упускать, учитывая, что этот ответ не циклически проходит через массив или массив ArrayList. –

1

Я думаю, что я предпочитаю:

while (!isGameOver) { 
    for(int i = 0; i < myList.size(); i++) { 

    } 
} 

Или использовать foreach конструкцию:

while (!isGameOver) { 
    foreach(Player p : myList) { 

    } 
} 
0

Может быть, вы бы сделать бесконечное время цикла вместо ...

int k=0; 
int n=myList.size(); 
do { 
    int i = k++ % n; 
    // use i 
while(!GameOver); 
0
while(true) { 
    while(!isGameOver){ 
     for(Player p : myList){ 
      p.doSomething(); 
     } 
    } 

    while (otherGameStates){ 
    } 

    while(paused...){ 
    } 
} 

Это делается исходя из того, что вы делаете это где-то в своем gameloop. while true позволяет изменять состояние штата (если у вас несколько состояний в вашей игре), позволяя игре перейти от pause>run до, возможно, pause>menu>run или pause>menu>quit или gameover>gamerunning. Первый блок, вероятно, достаточно для ваших нужд.

+0

Не могли бы вы объяснить немного больше? – acdcjunior

0

@ ответ rgettman является большим :)

Я просто даю другую альтернативу. Выберите нужный набор логики или мыслительного процесса

mainProcessLoop: 
while (!gameOver) { // or while(true), if you are sure 
        // that the collection is never empty 
    for (Player player: players) { 
    // do whatever you need for player 

    if (gameOver) { 
     break mainProcessLoop; 
    } 
    } 
} 
Смежные вопросы