Столкновение рыбы в моделируемом аквариуме вызывает исключение в потоке «main» java.lang.StackOverflowError ⇐ JAVA
Столкновение рыбы в моделируемом аквариуме вызывает исключение в потоке «main» java.lang.StackOverflowError
Я построил симуляцию аквариума, в котором отображаются разные виды рыб, они движутся горизонтально (+1 за каждый результат), а также имеют случайный шанс двигаться вертикально. С помощью метода Thread.sleep создается впечатление, что они плавают в вашей консоли. Основная проблема, с которой я сталкиваюсь, — это когда рыбы сталкиваются. Весь аквариум — это, по сути, просто 2D-массив рыб, поэтому при столкновении двух рыб одна перезаписывается. Я попытался исправить это отдельным методом, когда рыба сохраняется во временном массиве. В этом массиве они плавают или движутся дальше, как обычно, но не отображаются, потому что отображается только основной массив рыб. Каждый раз, когда рыба движется, должна выполняться проверка, пуста ли позиция, в которой рыба находится в данный момент в tempArray, в основном массиве. Если это так, их следует снова поместить/установить в основной массив, чтобы их снова можно было увидеть. В итоге в консоли выглядит так, будто они просто плывут друг над другом.
публичный класс FishTank { public int TankHeight; общественный int TankWidth; общественная Рыба[][] рыба; public FishTank(int TankHeight, int TankWidth) { this.tankHeight = TankHeight; this.tankWidth = TankWidth; this.fish = новая рыба[this.tankHeight][this.tankWidth]; } public int getTankHeight() { вернуть this.tankHeight; } общественный ИНТ getTankWidth () { вернуть this.tankWidth; } public boolean isCollision(int swimWidth, int swimHeight) { if (swimWidth++ >= 0 && swimWidth++ < this.tankWidth && swimHeight >= 0 && swimHeight < this.tankHeight) { return fish[swimHeight][swimWidth] != null; } вернуть ложь; } public void handleCollision(int swimWidth, int swimHeight, Fish fish) { Fish[][] tempArray = новая рыба[this.tankHeight][this.tankWidth]; tempArray[fish.getSwimHeight()][fish.getSwimWidth()] = рыба; while (isCollision(swimWidth, swimHeight)) { Fish[][] updateFish = новая рыба[this.tankHeight][this.tankWidth]; for (int i = 0; i < this.tankHeight; i++) { for (int j = 0; j < this.tankWidth; j++) { if (tempArray[j] != null) { // Сохраняем текущую позицию перед плаванием ИНТ OldHeight = я; ИНТ OldWidth = J; tempArray[j].swim(это); int newHeight = tempArray[j].getSwimHeight(); int newWidth = tempArray[j].getSwimWidth(); // Проверяем столкновение в новой позиции if (!isCollision(newWidth, newHeight)) { // Обновляем tempArray новой позицией updateFish[newHeight][newWidth] = tempArray[j]; } еще { // Восстанавливаем старую позицию, если произошло столкновение обновленныйFish[oldHeight][oldWidth] = tempArray[j]; } } } } tempArray = обновленная рыба; } // Устанавливаем рыбу в основной массив после разрешения коллизий setFish (рыба); } общественный недействительный printFishTank () { Система.out.println(); for (int i = 0; i < this.tankHeight; i++) { System.out.print("|"); for (int j = 0; j < this.tankWidth; j++) { если (рыба[j] != ноль) { System.out.print(fish[j].getLook()); j += рыба[j].getLook().length() - 1; } еще { System.out.print(" "); } } System.out.println("|"); } System.out.print("+"); for (int i = 0; i < this.tankWidth; i++) { System.out.print("-"); } System.out.println("+"); Система.out.println(); } общественная недействительность moveFish() { Fish[][] updateFish = новая рыба[this.tankHeight][this.tankWidth]; for (int i = 0; i < this.tankHeight; i++) { for (int j = 0; j < this.tankWidth; j++) { если (рыба[j] != ноль) { рыба[i][j].swim(это); ; int newHeight = рыба[i][j].getSwimHeight(); int newWidth = рыба[i][j].getSwimWidth(); обновленныйFish[newHeight][newWidth] = рыба[i][j]; } } } рыба = обновленная рыба; } public void setFish(Fish newFish) { this.fish[newFish.getSwimHeight()][newFish.getSwimWidth()] = newFish; } public static void main(String[] args) выдает InterruptedException { Fish.Shark fish1 = новая Fish.Shark(1, 14, false); Fish.SwordFish fish2 = новый Fish.SwordFish(1, 5, false); Fish.NormalFish fish3 = новый Fish.NormalFish(3, 3, false); Fish.PufferFish fish4 = новый Fish.PufferFish(4, 4, false); Fish.Shark fish5 = новая Fish.Shark(6, 14, false); Fish.SwordFish fish6 = новый Fish.SwordFish(7, 5, false); Fish.NormalFish fish7 = новый Fish.NormalFish(8, 3, false); Fish.PufferFish fish8 = новый Fish.PufferFish(7, 11, false); FishTank ft = новый FishTank(10, 50); ft.setFish(рыба1); ft.setFish(рыба2); ft.setFish(рыба3); ft.setFish(рыба4); ft.setFish(рыба5); ft.setFish(рыба6); ft.setFish(рыба7); ft.setFish(рыба8); для (int я = 0; я = 0; i--) { if (i >= 0 && i < this.look.length()) { char currentChar = this.look.charAt(i); если (currentChar == '>') { новыйLook += '
Я построил симуляцию аквариума, в котором отображаются разные виды рыб, они движутся горизонтально (+1 за каждый результат), а также имеют случайный шанс двигаться вертикально. С помощью метода Thread.sleep создается впечатление, что они плавают в вашей консоли. Основная проблема, с которой я сталкиваюсь, — это когда рыбы сталкиваются. Весь аквариум — это, по сути, просто 2D-массив рыб, поэтому при столкновении двух рыб одна перезаписывается. Я попытался исправить это отдельным методом, когда рыба сохраняется во временном массиве. В этом массиве они плавают или движутся дальше, как обычно, но не отображаются, потому что отображается только основной массив рыб. Каждый раз, когда рыба движется, должна выполняться проверка, пуста ли позиция, в которой рыба находится в данный момент в tempArray, в основном массиве. Если это так, их следует снова поместить/установить в основной массив, чтобы их снова можно было увидеть. В итоге в консоли выглядит так, будто они просто плывут друг над другом.
публичный класс FishTank { public int TankHeight; общественный int TankWidth; общественная Рыба[][] рыба; public FishTank(int TankHeight, int TankWidth) { this.tankHeight = TankHeight; this.tankWidth = TankWidth; this.fish = новая рыба[this.tankHeight][this.tankWidth]; } public int getTankHeight() { вернуть this.tankHeight; } общественный ИНТ getTankWidth () { вернуть this.tankWidth; } public boolean isCollision(int swimWidth, int swimHeight) { if (swimWidth++ >= 0 && swimWidth++ < this.tankWidth && swimHeight >= 0 && swimHeight < this.tankHeight) { return fish[swimHeight][swimWidth] != null; } вернуть ложь; } public void handleCollision(int swimWidth, int swimHeight, Fish fish) { Fish[][] tempArray = новая рыба[this.tankHeight][this.tankWidth]; tempArray[fish.getSwimHeight()][fish.getSwimWidth()] = рыба; while (isCollision(swimWidth, swimHeight)) { Fish[][] updateFish = новая рыба[this.tankHeight][this.tankWidth]; for (int i = 0; i < this.tankHeight; i++) { for (int j = 0; j < this.tankWidth; j++) { if (tempArray[j] != null) { // Сохраняем текущую позицию перед плаванием ИНТ OldHeight = я; ИНТ OldWidth = J; tempArray[j].swim(это); int newHeight = tempArray[j].getSwimHeight(); int newWidth = tempArray[j].getSwimWidth(); // Проверяем столкновение в новой позиции if (!isCollision(newWidth, newHeight)) { // Обновляем tempArray новой позицией updateFish[newHeight][newWidth] = tempArray[j]; } еще { // Восстанавливаем старую позицию, если произошло столкновение обновленныйFish[oldHeight][oldWidth] = tempArray[j]; } } } } tempArray = обновленная рыба; } // Устанавливаем рыбу в основной массив после разрешения коллизий setFish (рыба); } общественный недействительный printFishTank () { Система.out.println(); for (int i = 0; i < this.tankHeight; i++) { System.out.print("|"); for (int j = 0; j < this.tankWidth; j++) { если (рыба[j] != ноль) { System.out.print(fish[j].getLook()); j += рыба[j].getLook().length() - 1; } еще { System.out.print(" "); } } System.out.println("|"); } System.out.print("+"); for (int i = 0; i < this.tankWidth; i++) { System.out.print("-"); } System.out.println("+"); Система.out.println(); } общественная недействительность moveFish() { Fish[][] updateFish = новая рыба[this.tankHeight][this.tankWidth]; for (int i = 0; i < this.tankHeight; i++) { for (int j = 0; j < this.tankWidth; j++) { если (рыба[j] != ноль) { рыба[i][j].swim(это); ; int newHeight = рыба[i][j].getSwimHeight(); int newWidth = рыба[i][j].getSwimWidth(); обновленныйFish[newHeight][newWidth] = рыба[i][j]; } } } рыба = обновленная рыба; } public void setFish(Fish newFish) { this.fish[newFish.getSwimHeight()][newFish.getSwimWidth()] = newFish; } public static void main(String[] args) выдает InterruptedException { Fish.Shark fish1 = новая Fish.Shark(1, 14, false); Fish.SwordFish fish2 = новый Fish.SwordFish(1, 5, false); Fish.NormalFish fish3 = новый Fish.NormalFish(3, 3, false); Fish.PufferFish fish4 = новый Fish.PufferFish(4, 4, false); Fish.Shark fish5 = новая Fish.Shark(6, 14, false); Fish.SwordFish fish6 = новый Fish.SwordFish(7, 5, false); Fish.NormalFish fish7 = новый Fish.NormalFish(8, 3, false); Fish.PufferFish fish8 = новый Fish.PufferFish(7, 11, false); FishTank ft = новый FishTank(10, 50); ft.setFish(рыба1); ft.setFish(рыба2); ft.setFish(рыба3); ft.setFish(рыба4); ft.setFish(рыба5); ft.setFish(рыба6); ft.setFish(рыба7); ft.setFish(рыба8); для (int я = 0; я = 0; i--) { if (i >= 0 && i < this.look.length()) { char currentChar = this.look.charAt(i); если (currentChar == '>') { новыйLook += '
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение