从另一个类java

时间:2016-12-28 12:12:49

标签: java while-loop

我目前正致力于基于文本的“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;有关。 如果有人能解释我应该如何解决这个问题,我很高兴。

3 个答案:

答案 0 :(得分:1)

我猜battleLost()属于PerformAtack类。所以map内的局部变量battleLost()不会影响控制道路的对象。

你可以做两件事:

  1. 使running静态(和公共),然后您可以通过类名称WolrdMap.runnning = false从任何地方引用它,但如果您决定并行执行此解决方案,则此解决方案存在问题(例如多个线程)。 Remmeber:静态数据几乎总是多线程设计的陷阱!

  2. 更好的解决方案是让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是一个类变量,所以它的值将在所有类之间共享