lundi 20 juin 2016

Wait for method to Finish, and weird interaction with System.println

I am trying to write a genetic program to play through a game, but I am running into a bit of a snag. When I call this code:

public double playMap (GameBoard gb, Player p) {
    gb.playerController = p;
    Game g = new Game(gb);
    int initHP = 0;
    for (Unit u : gb.enemy.units) {
        initHP += u.maxHP;
    }

    g.playGame(false);

    int finalHP = 0;
    for (Unit u : gb.enemy.units) {
        finalHP += u.currHP;
    }
    System.out.println("        " + initHP);
    System.out.println("        " + finalHP);
    System.out.println("        " + (finalHP - initHP));
    if (initHP == finalHP) {
        return -10;
    }
    return initHP - finalHP;
}

the g.playGame() line does not have time to finish, and I am getting incorrect results from the function. I can wait out unit the game is over with a

while (!g.isDone) {
    System.out.println(g.isDone);
}

but not with the same while loop without a print statement. I know there has to be a more elegant solution, and I cant seem to implement the methods I have seen. Also if anyone knows why I need the print statement in the while loop to get it to wait that would be great too.

Thanks in advance.

ADDED playGame:

public void playGame(boolean visual) {
    Global.visual = visual;
    if (Global.visual) {
        JFrame application = new JFrame();
        application.setBackground(Color.DARK_GRAY);
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        application.add(this);           


        application.setSize(500, 400);         // window is 500 pixels wide, 400 high
        application.setVisible(true); 
    }

    PlayerInput pi = new PlayerInput();
    this.addKeyListener(pi);

    final Timer timer = new Timer(10/60, null);
    ActionListener listener = new ActionListener() {
        @Override 
        public void actionPerformed(ActionEvent e) {
            pi.addPressed();
            if (update(pi)) {
//                  application.setVisible(false);
//                  application.dispose();
                System.out.println(gb.toString());
                isDone = true;
                timer.stop();

            }
            pi.reset();
        }
    };
    timer.addActionListener(listener);
    timer.start();


    while (!isDone) {
        System.out.println(isDone);
    }
}

Aucun commentaire:

Enregistrer un commentaire