Я изучаю Java по книге Аллена Б. Дауни "Think Java". В главе 5 вводится понятие GridWorld
, где у вас в основном есть сетка 10x10 с «актерами», такими как Жук, Камни и сама Сетка, которая представляет объекты. Когда код установлен, графический интерфейс GridWorld
покажет сетку, содержащую двух актеров, «жука» и «камень».
При нажатии на актора появляется выпадающее меню с методами, которые можно вызывать для этого актора.
Одно из заданий состоит в том, чтобы написать метод, используя Math.random();
с именем randomBug
, который принимает жука в качестве параметра и устанавливает направление жука на одно из 0, 90, 180 или 270, то есть север, восток, юг, запад, с равными вероятности, а затем перемещает ошибку, если это возможно.
Следующее задание состоит в том, чтобы изменить randomBug
, чтобы взять целое число n
и повторить n
раз.
Это мой код:
/*
* AP(r) Computer Science GridWorld Case Study:
* Copyright(c) 2005-2006 Cay S. Horstmann (http://horstmann.com)
*
* This code is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* @author Cay Horstmann
*/
import info.gridworld.actor.ActorWorld;
import info.gridworld.actor.Bug;
import info.gridworld.actor.Rock;
/**
* This class runs a world that contains a bug and a rock, added at random
* locations. Click on empty locations to add additional actors. Click on
* populated locations to invoke methods on their occupants. <br />
* To build your own worlds, define your own actors and a runner class. See the
* BoxBugRunner (in the boxBug folder) for an example. <br />
* This class is not tested on the AP CS A and AB exams.
*/
public class BugRunner
{
public static void main(String[] args)
{
ActorWorld world = new ActorWorld();
Bug redbug = new Bug();
world.add(redbug);
System.out.println(redbug.getLocation());
world.show();
randomBug(redbug, Math.random(), 5);
}
public static void randomBug(Bug x, double y, int n){
if (y <= 0.2 && n >= 0){
x.setDirection(0);
if (x.canMove()) x.move();
} else if (y >= 0.3 && y <= 0.5 && n >= 0){
x.setDirection(90);
if (x.canMove()) x.move();
} else if (y >= 0.6 && y <= 0.8 && n >= 0){
x.setDirection(180);
if (x.canMove()) x.move();
} else {
x.setDirection(270);
if (x.canMove()) x.move();
}
randomBug(x, Math.random(), n-1);
}
}
Я пытаюсь использовать рекурсивную функцию, чтобы повторить процесс пять раз, поэтому ошибка должна двигаться пять раз, если только она не достигнет края сетки. Проблема, которая иногда возникает, заключается в том, что Жук перемещается более 5 раз, он делает 6 или 10 шагов, хотя я ограничил это условием n <= 0
.
Что я должен изменить или добавить в свой код, чтобы выполнить назначение?