Извините, если это простой вопрос, и это моя вина, но я не могу понять свой собственный цикл - он работает только один раз. На данный момент цикл строит все 20 машин одновременно, но я хочу построить только одну машину за клик. Надеюсь вы понимаете меня.

Мой код цикла:

for (int j = 3;j <= 80; j+=4){
    if(CarsLv1.cars[j] == 0){
        for(int i=1;i <= 25;i+=2){
            Part.parts[i] -=1;
        }   
        //CarFrame.frames[1] -=1;                               
        CarsLv1.cars[j] +=1;

        switch(j){

            case 3:{
                JOptionPane.showMessageDialog (null, "You have gained Aston Martin DB9!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Aston_Martin_DB9Icon);
                break;}
            case 7:{
                JOptionPane.showMessageDialog (null, "You have gained Acura NSX!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Acura_NSXIcon);
                break;}
            case 11:{
                JOptionPane.showMessageDialog (null, "You have gained Ford Mustang!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Ford_MustangIcon);
                break;
            }
            case 15:{
                JOptionPane.showMessageDialog (null, "You have gained Moskvich 412!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Moskvich_412Icon);
                break;
            }
            case 19:{
                JOptionPane.showMessageDialog (null, "You have gained Kia Venga!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Kia_VengaIcon);
                break;
            }
            case 23:{
                JOptionPane.showMessageDialog (null, "You have gained Fiat 1500!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Fiat_1500Icon);
                break;
            }
            case 27:{
                JOptionPane.showMessageDialog (null, "You have gained Ferrari Enzo!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Ferrari_EnzoIcon);
                break;
            }
            case 31:{
                JOptionPane.showMessageDialog (null, "You have gained Aston Martin Rapide!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Aston_Martin_RapideIcon);
                break;
            }
            case 35:{
                JOptionPane.showMessageDialog (null, "You have gained Koenigsegg CCX!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Koenigsegg_CCXIcon);
                break;
            }
            case 39:{
                JOptionPane.showMessageDialog (null, "You have gained Honda Civic!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Honda_CivicIcon);
                break;
            }
            case 43:{
                JOptionPane.showMessageDialog (null, "You have gained Cadilliac ATS!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Cadilliac_ATSIcon);
                break;
            }
            case 47:{
                JOptionPane.showMessageDialog (null, "You have gained Mitsubishi Lancer Evolution X!", "Congratulations", JOptionPane.INFORMATION_MESSAGE,ImagesHolder.Mitsubishi_LancerEvolutionXIcon);
                break;
            }
            case 51:{
                JOptionPane.showMessageDialog (null, "You have gained Infiniti FX!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Infiniti_FXIcon);
                break;
            }
            case 55:{
                JOptionPane.showMessageDialog (null, "You have gained Lancia Thema!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Lancia_ThemaIcon);
                break;
            }
            case 59:{
                JOptionPane.showMessageDialog (null, "You have gained Volvo XC90!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Volvo_XC90Icon);
                break;
            }
            case 63:{
                JOptionPane.showMessageDialog (null, "You have gained Acura CSX!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Acura_CSXIcon);
                break;
            }
            case 67:{
                JOptionPane.showMessageDialog (null, "You have gained Saab Sonett II!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Saab_SonettIIIcon);
                break;
            }
            case 71:{
                JOptionPane.showMessageDialog (null, "You have gained Renault Floride!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Renault_FlorideIcon);
                break;
            }
            case 75:{
                JOptionPane.showMessageDialog (null, "You have gained BMW e34!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.BMW_e34Icon);
                break;
            }
            case 79:{
                JOptionPane.showMessageDialog (null, "You have gained Chrysler Cordoba!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.Chrysler_CordobaIcon);                                   
                JOptionPane.showMessageDialog(null, "You have collected all LVL 1 cars", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.MaxUpgradeIcon);
                break;
            }
            default:{
                JOptionPane.showMessageDialog(null, "You have collected all LVL 1 cars", "Congratulations", JOptionPane.INFORMATION_MESSAGE, ImagesHolder.MaxUpgradeIcon);
                break;
            }
        }
    }
}
-4
crelix 15 Мар 2016 в 13:34
Да, петли не будут работать так, как вы хотите. Используйте свойство класса, чтобы запомнить статус.
 – 
MikeCAT
15 Мар 2016 в 13:41
Что именно ты хочешь делать?
 – 
user3437460
15 Мар 2016 в 13:43
Для меня этот код вообще не получает внешнего ввода. Итак, где вы ожидаете получить ввод внутри этого цикла? Я просто считаю с шагом 4 от 3 до 80 и увеличиваю соответствующий слот CarsLv1.cars [j] (предотвращая действия в другое время, но j никогда больше не будет иметь это значение).
 – 
rpy
15 Мар 2016 в 13:44

2 ответа

Лучший ответ

Сделайте паузу после вашего заявления switch. break в операторе switch только прерывают конкретный случай, они не выходят из окружающего цикла.

for (int j = 3;j <= 80; j+=4){
  if (CarsLv1.cars[j] == 0) {
    switch(j){
      case 3:
        // Whatever.
        break;  // This breaks the case.
    }
    break;  // This breaks the loop;
  }
}

Обратите внимание: было бы намного чище, если бы вы определили перечисление, представляющее автомобили, например:

enum Car {
  ASTON_MARTIN_DB9(3, "Aston Martin DB9", ImagesHolder.Aston_Martin_DB9Icon),
  ACURA_NSX(7, "Acura NSX", ImagesHolder.Acura_NSXIcon),
  // etc, for other cars.
  ;

  private final int number;
  private final String name;
  private final ImageIcon icon;

  private Car(int number, String name, ImageIcon icon) {
    // Assign parameters to fields.
  }

  // Add getters.
}

Затем, вместо того, чтобы перебирать эти числа, вы можете перебирать сами автомобили:

boolean found = false;
for (Car car : Car.values()) {
  int j = car.getNumber();
  if(CarsLv1.cars[j] != 0) continue;

  for(int i=1;i <= 25;i+=2){
    Part.parts[i] -=1;
  }                                
  CarsLv1.cars[j] +=1;
  JOptionPane.showMessageDialog (null, "You have gained " + car.getName() + "!", "Congratulations", JOptionPane.INFORMATION_MESSAGE, car.getIcon());
  found = true;
  break;
}
if (!found) {
  // Show the message about having collected all cars.
}

То есть избежать необходимости в этом большом переключателе и всем повторяющемся коде.

2
Andy Turner 15 Мар 2016 в 14:22

цикл строит все 20 машин одновременно, но я хочу построить только одну машину за клик.

Подсказка: если вы хотите, чтобы код выполнялся только один раз, а не несколько раз подряд. Может быть, вам не стоит использовать петлю.

Создайте метод createCar (или что-то подобное) и вызовите этот метод, когда вы сделаете свой «щелчок».

2
911DidBush 15 Мар 2016 в 13:56