如何在不退出Java代码的情况下退出2D游戏模拟(仅限)?

如何在不退出Java代码的情况下退出2D游戏模拟(仅限)?,java,game-development,Java,Game Development,我(Java新手)正在从事一个已有数十年历史的Java项目,该项目使用Golden T Studio游戏开发jdk构建。我在项目中有一个运行2D模拟的游戏。简而言之,代码结构如下: package game; import java.io.*; import java.lang.reflect.Field; import javax.swing.JFrame; import com.golden.gamedev.GameLoader; import com.google.gson.Gson;

我(Java新手)正在从事一个已有数十年历史的Java项目,该项目使用Golden T Studio游戏开发jdk构建。我在项目中有一个运行2D模拟的游戏。简而言之,代码结构如下:

package game;
import java.io.*;
import java.lang.reflect.Field;
import javax.swing.JFrame;

import com.golden.gamedev.GameLoader;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import sometcpimports.*;

public class MainGAME extends JFrame implements Runnable {

    public static void main(String[] args) { //call new MainGAME;
    }

    public MainGAME() {//initiate game parameters; 
    //start new THREAD; 
    }

   @Override
   public void run() { //initiate new game and environment;
    game = new GameLoader();
    gameenv = new GameEnvironment(params); //This class is in another file "public class GameEnvironment extends Game {}" 
    //I don't clearly undertsand what the following lines do, so I'm mentioning them as is;

    game.setup(gameenv, dimensions);
    this.setVisible(false);
    gameenv.setVisible(false);
    game.start();
    game.setVisible(true);

    //tbd (code reaches this step)

    }
}
我的目标是多次运行上述模拟(每次使用不同的输入),并在每次运行后在新的主类中提取信息,如下所示

public class gamedriver {
    public static void main(String[] args) {
        MainGAME.params = some params;
        MainGAME.main(); // runs the simulation;

        //tbd1 (code doesn't reach this step)
    }
}

问题是,在从不同的文件(新的主类)运行模拟时,我无法在一次运行后退出2D模拟器。代码在新的主类中没有到达
//tbd1
,该主类有一些输出打印语句。本质上,我只想退出模拟器,而不是整个JVM。到目前为止,我已经尝试:

  • game.stop()
    gameenv.finish()
    //tbd
    上,它什么也不做
  • System.exit(0)
    at
    //tbd
    ,它在模拟后退出游戏,但也退出jvm,不会到达其他主类
  • finish()
    位于
    //tbd
    和GameEnvironment类,其行为与第2点完全相同
  • 此外,我无法在for循环中运行上述(gamedriver类中的MainGAME)。这将抛出
    Game.Exception错误
    。我知道这与线程有关,但我不确定如何运行它们


    谢谢你抽出时间。谢谢你的帮助

    我找到了解决上述问题的方法。我将我的解决方法作为遇到类似问题的人的参考。请注意,可能还有其他(更好的)解决方案

  • 我禁用了MainGAME中的所有(任何)线程实现(通过简单的注释)
  • 我在MainGAME中添加了
    System.out.println()
    ,以便在模拟结束时打印所有输出
  • 我的第二个脚本使用运行时进程来执行MainGAME:
  • 我解析output.csv以获得解决方案

  • 这可能是一种草率的解决问题的方法,但对我来说很有效,尤其是因为GTGE提供的其他方法都不起作用。

    你确定你需要你所说的吗?你只想在你的MainGame类运行后打印一些东西,对吗?如果是这样,你就严重地过度思考了这个问题。为什么你认为你需要第二个类来运行第一个类,以便在屏幕上转储一些信息?嗨,MarsAtomic,谢谢你的阅读。抱歉,实际问题是在游戏顶部运行优化代码。这只是一个测试,检查我是否从游戏中得到了想要的变量。完成后,我只需将优化代码导入gamedriver并运行它(迭代游戏)。。。这里有三个选项:1)在调试器中运行代码,在设置了要查看的值后设置断点,并使用调试器检查变量;2) 学习使用JUnit并编写一个测试,其中包含一些测试相关变量的断言;或者3)在设置变量后删除一些简单的System.out.println()语句,并将变量打印到控制台。因为你专注于一种特殊的方法,所以你真的让这件事变得比需要的难多了。这个问题与驱动程序或线程无关。谢谢!我要试试这些。
    public class gamedriver {
        public static void main(String[] args) {
            try {
                String separator = System.getProperty("file.separator");
                String classpath = System.getProperty("java.class.path");
                String path = System.getProperty("java.home") + separator + "bin" + separator + "java";
                String[] command = new String[]{path, "-cp", classpath, gamedriver.GAME.class.getName(), "output.csv"};
                Process process = Runtime.getRuntime().exec(command);
                process.waitFor();
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        static class GAME {
    
            public static void main(String args[]) {
                PrintStream out = null;
                try {
                    out = new PrintStream(args[1]); 
                } catch (FileNotFoundException p) {
                    p.printStackTrace();
                }
    
                System.setOut(out);// this catches all output from the game to a csv file (output.csv)
                MainGAME temp = new MainGame(some params); // initiate the simulation
                temp.run()
                out.close();
                System.exit(0); // force close the simulator
            }
        }
    }