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 という名前) を定義することでした。

  • public String getInput();
  • public void showOutput(文字列出力);

  • 次に、このインターフェイスを実装する 2 つのクラスがありました。1 つはホスト コンピューターの端末を使用し (現在行っているように)、もう 1 つは 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 によって説明されているインターフェイス アプローチを検討できますが、一般的な「in/out」メソッドではなく、操作ごとに 1 つのルーチンを作成します。

    例えば:

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

    コマンドラインの実装は明確です。これで、GUI 実装は、実際には単なるコマンドライン バージョンのテキスト領域ではなく、論理操作ごとに適切なダイアログを使用できるようになりました。

    さらに、テストでこれらのルーチンを任意の方法でスタブ化できるため、単体テストを作成するのが簡単になります。

    于 2008-10-04T19:18:29.050 に答える