Почему мой пустой оператор if связанного списка ничего не выводит?

#java

#Ява

Вопрос:

Я пишу игру на java, и у меня есть оператор else, который проверяет длину связанного списка объектов, и если он пуст, должен возвращать «Вы выиграли» в консоли. Используя точки останова в IntelliJ, я вижу, что код выполняется на каждом тике игры, но, похоже, он никогда не регистрирует условие как истинное.

Игра представляет собой простую ритмическую игру, в которой игрок должен вовремя нажимать кнопки, чтобы набрать очки, и независимо от того, промахивается ли игрок или попадает в ритм, первый экземпляр типа объекта удаляется из связанного списка, поэтому теоретически список должен быть пустым, если игрок выигрывает игру. и консоль выводит исключение «такого элемента нет» при проверке биений после пропуска или попадания последнего.

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

 public void checkBeats(){  Beat currentObject = (Beat) Game.beatLinkedList.getFirst();  //Find the x position of the current object  int currentBeatPosition = currentObject.getX();   //Condition to award points to the player if they time hitting the beat correctly  if (currentBeatPosition lt;= 70) {  //Add 100 to the score variable.  Player.lives -= 1;  Game.beatLinkedList.removeFirst();  for (GameObject obj : Handler.object) {  if (obj instanceof Beat) {  Handler.object.remove(obj);  break;  }  }  checkLives();  }   else if (beatLinkedList.isEmpty() == true){  System.out.println("YOU WIN");  }  }  

Я также использовал beatLinkedList.size ==0 и несколько других , таких как if null , и, похоже, ничего не работает. Был бы признателен, если бы кто-нибудь знал, почему.

Редактировать:

Попробовал удалить else , и изменил Game.beatLinkedList на просто beatLinkedList , так как я все равно работаю в Game классе.

 public void checkBeats(){  Beat currentObject = (Beat) beatLinkedList.getFirst();  //Find the x position of the current object  int currentBeatPosition = currentObject.getX();   //Condition to award points to the player if they time hitting the beat correctly  if (currentBeatPosition lt;= 70) {  //Add 100 to the score variable.  Player.lives -= 1;  Game.beatLinkedList.removeFirst();  for (GameObject obj : Handler.object) {  if (obj instanceof Beat) {  Handler.object.remove(obj);  break;  }  }  checkLives();  }   if (beatLinkedList.isEmpty()){  System.out.println("YOU WIN");  } }  

Правка 2:

Если я изменю код на if (beatLinkedList.size() == 1) «Затем», когда он достигнет предпоследнего такта, сообщение «вы выиграли» несколько раз печатается в консоли, не зная, что происходит, когда оно достигает 0.

Комментарии:

1. Может быть, вы не хотите else if — просто if — чтобы он проверялся isEmpty() каждый раз?

2. Пожалуйста, предоставьте все соответствующие классы, о которых идет речь, чтобы мы действительно могли вам помочь. В противном случае мы никак не сможем сообщить, что не так с вашим кодом. В настоящее время существует так много открытых вопросов: откуда beatLinkedList берется? Что checkLives() происходит? Что такое Beat , Game , GameObject и Handler ?

Ответ №1:

Прежде всего: измените значение «если» на » и «если«. Таким образом, он будет каждый раз проверять, выиграли ли игроки.

Во-вторых, ваш код внутри else, если может быть неправильным (?), почти в каждой строке, с которой вы взаимодействуете со своим списком битлинков, вы вводите Game. infront. Однако в вашем случае, если вы не используете Game.BeatlinkedList, вы используете только beatLinkedList. Есть какая-нибудь причина для этого?

 if (Game.beatLinkedList.isEmpty()){ //you don't need == true.  System.out.println("YOU WIN"); }  

Комментарии:

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

Ответ №2:

Может ли быть так, что, когда список пуст, пустое также первое искажение ( currentBeatPosition lt;= 70 ) истинно?

Если это так, вы не попадете в блок «еще», если в первую очередь.

В таком случае просто сделай это

 if (beatLinkedList.isEmpty() == true){  System.out.println("YOU WIN"); }  

(Отбросьте «еще»)

Комментарии:

1. Насколько я знаю, это не должно быть возможно, так как полученное значение x является атрибутом объекта beat, но я попробую