我目前正致力于基于文本的“RPG”游戏。我做了两个班,第一个应该模拟从一个城镇到另一个城镇的道路,这样做有可能玩家会遇到敌人。战斗逻辑被放置在另一个类中,当玩家死亡时,我调用方法,该方法应该从之前的保存加载游戏或创建新角色并且工作完全正常,但即使当玩家死亡时,道路仍然继续而不是打破循环。 LeaveTown类看起来像这样:
public class WorldMap {
boolean running=true;
public void leaveTown(Character character){
EnemyFactory factory = new EnemyFactory();
PerformAtack atack = new PerformAtack();
StringBuilder sb = new StringBuilder();
Random random = new Random();
int progress = 0;
while(running && progress!=100){
try {
System.out.print(sb.append("#"));
System.out.println(progress+"%");
if (random.nextDouble() * 10 < 2) {
atack.performFight(character,factory.generateRandomEnemy());
}
Thread.sleep(500);
}catch(Exception ex){}
progress = progress+5;
}
}
}
正如你所看到的,我正在使用while循环,它应该在运行变量设置为false或道路完成时中断。当角色死亡时,我称之为方法battleLost
:
private void battleLost(Character character){
WorldMap map = new WorldMap();
System.out.println("You are dead.\nWould you like to try AGAIN or LOAD your last save");
System.out.println("Please type AGAIN or LOAD");
while(true) {
String choice = sc.nextLine().toUpperCase();
if (choice.equals("AGAIN")) {
map.running = false;
System.out.println("Create new character?");
break;
} else if (choice.equals("LOAD")) {
map.running = false;
save.readFromFile();
break;
} else
System.out.println("Try again.");
}
}
此方法将WorldMap类中的运行变量设置为false,但while
循环继续而不是中断。我知道问题可能与以错误的方式使用map.running = false;
有关。
如果有人能解释我应该如何解决这个问题,我很高兴。
答案 0 :(得分:1)
我猜battleLost()
属于PerformAtack
类。所以map
内的局部变量battleLost()
不会影响控制道路的对象。
你可以做两件事:
使running
静态(和公共),然后您可以通过类名称WolrdMap.runnning = false
从任何地方引用它,但如果您决定并行执行此解决方案,则此解决方案存在问题(例如多个线程)。 Remmeber:静态数据几乎总是多线程设计的陷阱!
更好的解决方案是让atack.performFight
返回一个布尔值,并将该值赋给running
var:running = atack.performFight(...
这在线程安全方面是更好的设计,但是你必须将battleLost()
的布尔值(它也必须返回布尔值)传播到`performFight()&#39;等等
答案 1 :(得分:1)
boolean running=true;
此变量应属于Character
类。
然后,您的while
将如下所示:
while(character.isRunning() && progress!=100)
并且,在performFight
内,您可以在死亡时将其更新为false
。
答案 2 :(得分:1)
好吧,将变量boolean running=true;
的访问修饰符更改为public static boolean running=true;
一旦你这样做,你可以将这个变量改为false而不创建一个实例来打破循环,做类似的事情
private void battleLost(Character character){
WorldMap map = new WorldMap();
System.out.println("You are dead.\nWould you like to try AGAIN or LOAD your last save");
System.out.println("Please type AGAIN or LOAD");
while(WorldMap.running) {
String choice = sc.nextLine().toUpperCase();
if (choice.equals("AGAIN")) {
map.running = false;
System.out.println("Create new character?");
break;
} else if (choice.equals("LOAD")) {
map.running = false;
save.readFromFile();
break;
} else
System.out.println("Try again.");
}
public void breakTheLoop(){
WorldMap.running=false;
}
因为static是一个类变量,所以它的值将在所有类之间共享