1

我正在用 Java 编写游戏,我希望用户能够从命令行和我的 GUI 提供输入。目前,我使用这种方法来获取输入:

    static String getInput(){
        System.out.println("Your move:");
        Scanner sc = new Scanner(System.in);
        return sc.nextLine();
    }

我想继续使用它,但也让 mousePressed 事件模拟用户实际输入他们的输入。它的解决方案效率不高,但在我的应用程序中很有意义。所以问题是:如何模拟用户从代码端输入 System.in?

4

4 回答 4

1

这是可能的 - System.in最简单的替代品是PipedInputStream。这必须连接到从另一个线程(在本例中为 Swing 线程)写入的PipedOutputStream

public class GameInput {

    private Scanner scanner;

    /**CLI constructor*/
    public GameInput() {
        scanner = new Scanner(System.in);
    }

    /**GUI constructor*/
    public GameInput(PipedOutputStream out) throws IOException {
        InputStream in = new PipedInputStream(out);
        scanner = new Scanner(in);
    }

    public String getInput() {
        return scanner.nextLine();
    }

    public static void main(String[] args) throws IOException {
        GameInput gameInput;

        PipedOutputStream output = new PipedOutputStream();
        final PrintWriter writer = new PrintWriter(output);
        gameInput = new GameInput(output);

        final JTextField textField = new JTextField(30);
        final JButton button = new JButton("OK");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String data = textField.getText();
                writer.println(data);
                writer.flush();
            }
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new FlowLayout());
        frame.getContentPane().add(textField);
        frame.getContentPane().add(button);
        frame.pack();
        frame.setVisible(true);

        String data = gameInput.getInput();
        System.out.println("Input=" + data);
        System.exit(0);
    }

}

但是,重新考虑您的游戏逻辑以在 GUI 模式下完全切断流可能会更好。

于 2008-10-04T23:34:52.090 回答
0

我曾经制作了一个可以通过命令行或使用 GUI 运行的应用程序。
我这样做的方法是定义一个接口(名为 IODevice),它定义了以下方法:

  • 公共字符串 getInput();
  • 公共无效显示输出(字符串输出);

  • 然后我有两个实现这个接口的类——一个使用主机的终端(就像你现在所做的那样),一个使用 JTextArea(输出)/JOptionPane(输入)。

    也许您可以做类似的事情 - 要更改使用的输入设备,只需更改 IODevice 的实例。


    希望这有点用。

    于 2008-10-04T19:11:09.453 回答
    0

    老实说,在重新阅读您的问题后,我不确定您想要什么。

    无论如何,也许您需要检查 java.lang.System.setIn(InputStream in) 方法。这将允许您更改用于从终端读取输入的阅读器(即将其从实际终端更改为您喜欢的任何内容)

    于 2008-10-04T19:17:14.107 回答
    0

    假设您有许多与给定示例类似的操作,您可能会考虑 Richie_W 描述的接口方法,但为每个操作创建一个例程,而不是通用的“输入/输出”方法。

    例如:

    public interface IGameInteraction
    {
        public String askForMove( String prompt );
        public boolean askAreYouSure( String prompt );
    }
    

    你的命令行实现很清晰;现在,您的 GUI 实现可以为每个逻辑操作使用适当的对话框,而不仅仅是一个实际上只是命令行版本的文本区域。

    此外,这更容易编写单元测试,因为在您的测试中,您可以以任何方式存根这些例程。

    于 2008-10-04T19:18:29.050 回答