#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, но я попробую