bugfix> java > 投稿

私はテキストベースのゲームを作成しています。メインキャラクター用に作成されたクラスがあるので、キャラクター名などを設定できます。私が理解しようとしているのは、ミューテーター(character.setname (入力))別のメソッドへの引数として。それをしようとすると、メソッドへの引数としてvoid型を使用できないと言われます。ユーザーが自分の名前を入力するためのコードを書き、それ以外はすべてエラーチェックを繰り返していたので、エラーチェックを呼び出す独自のメソッドを作成したかったのです。いくつかの文は、名前が間違って入力された場合、setnameメソッドを使用して名前をリセットしますが、エラーチェックメソッドでsetnameを直接使用することはできません。同じメソッドを使用してデータの他の入力をチェックするためです。

これを回避する方法はありますか?

要求されたコードは次のとおりです。私は実際に問題を複雑にしている可能性があります。

次のコードは、ユーザーが何かを正しく入力したかどうかを確認するために使用するコードです。ユーザーが入力できるすべての正しい答えを含む配列を受け入れます。私は何かをエラーチェックできるように設計しようとしました「yes」または「no」ステートメントだけでなく、getVariableがアクセサメソッドであり、setVariableが作業を試みているものです。エラーをリセットできるようにミューテータも渡そうとしています

public void confirmEntry(String question, String[] options, String getVariable, setVariable) throws InterruptedException
{
    boolean correctEntry = false;
    System.out.print("Is this correct? ");
    for(int i = 0; i < options.length - 1; i++)
    {
        System.out.print(options[i] + ", ");
    }
    System.out.print("or ");
    System.out.print(options[options.length - 1] + ": ");
    input = in.nextLine();
    for(int i = 0; i < options.length; i++)
    {
        if(input.equals(options[i]))
        {
            correctEntry = true;
            System.out.println(correctEntry);
        }
    }
    System.out.println(correctEntry);
    while(correctEntry == false)
    {
        Thread.sleep(2000);
        System.out.print("You must enter ");
        for(int i = 0; i < options.length - 1; i++)
        {
            System.out.print("\"" + options[i] + "\", ");
        }
        System.out.print("or ");
        System.out.print("\"" + options[options.length - 1] + "\" to continue: ");
        Thread.sleep(2000);
        System.out.println();
        System.out.println("You chose " + getVariable);
        Thread.sleep(2000);
        System.out.print("Is this correct? ");
        for(int i = 0; i < options.length - 1; i++)
        {
            System.out.print(options[i] + ", ");
        }
        System.out.print(" or ");
        System.out.print(options[options.length - 1] + ": ");
        input = in.nextLine();
        for(int i = 0; i < options.length; i++)
        {
            if(input.equals(options[i]))
            {
                correctEntry = true;
            }
        }
    }
}

次のコードは、キャラクターに関する情報を入力するメソッドに現在あるものです。ユーザーに質問、名前、年齢などを尋ねるたびに、メソッドを呼び出すだけで済むように、コードの多くをエラーチェックメソッドに移動しようとしています。

public void characterCreation() throws Exception
{
    //create an instance of the class player (your character creation)
    Player character = new Player();
    //Initial Introduction to the game
    System.out.println("Welcome to Stranded!");
    Thread.sleep(2000);
    System.out.println("Tell us a little about yourself!");
    Thread.sleep(2000);

    //______________________________________________________________________________________________________________
    //SET YOUR CHARACTER'S NAME
    String[] yesNo = {"yes", "no"};                                         //array to feed into confirmEntry method
    System.out.print("Enter your character's name: ");
    input = in.nextLine();                                                  //asks for input of the name
    character.setName(input);                                               //sets name in the player class
    System.out.println("You chose " + character.getName() 
    + " for your character's name");                                       
    Thread.sleep(2000);
    confirmEntry("Enter your character's name: ", yesNo, character.getName(), character.setName(input));
    while(input.equals("no"))
    {
        Thread.sleep(2000);
        System.out.print("Enter your character's name: ");                  //prompt to enter name again
        input = in.nextLine();
        character.setName(input);                                           //sets name in player class
        Thread.sleep(2000);
        System.out.println("You chose " + character.getName() 
        + " for your character's name");                                   //confirms what user entered for name
        Thread.sleep(2000);
        confirmEntry("Enter your character's name: ", yesNo, character.getName(), character.setName(input));
    }

SET CHARACTER NAMEコメントの後にconfirmEntryメソッドにコードを移動しようとしていますが、キャラクターの名前に関連する残りのコードはミューテーターを使用して名前を設定します。それが問題です。ユーザーに自分のキャラクターについて何かを入力するように依頼するときは、基本的にメソッドを呼び出すだけなので、できる限り多くのコードをconfirmEntryに入れたいと思いました。

回答 2 件
  • 使用している場合Java 8 メソッド参照パラメーターを使用してメソッドを作成できます。

    public void functionName(Consumer<String> setter){setter.
    accept(string);}
    
    

    そしてあなたに電話する方法 使用できます: functionName(character::setname);

    あなたが見ることができます:http://www.informit.com/articles/article.aspx?p = 2171751&seqNum = 3

  • エントリーとは何ですか?ユーザーが入力した値のようです。

    class Entry{
        String value;
        public Entry(String value){
            this.value = value;
        }
        public boolean confirm(String input){
            return value.equals(input);
        }
    }
    
    

    エントリーをすべて保存してください。

    Map<String, Entry> entries = new HashMap<>();
    String message = "Enter your character's name: ";
    System.out.println(message);
    String input = in.nextLine();
    entries.put(message, new Entry(input));
    
    

    確認したいとき。

    public void confirmEntries(){
        for(String message: entries.keySet()){
            System.out.println(message);
            System.out.println(entries.get(message) + "yes/no?");
            //get some input and update the value. etc.
        }
    }
    
    

    もう1つの方法は、Runnableを作成することです。

    List<Runnable> entryRunnables = new ArrayList<>();
    
    

    その後、いつでもアクションを追加することができます。

    Runnable r = ()->{
        System.out.println("Enter your players name, yes/no");
        String input = in.readLine();
        //check input and do stuff.
    }
    entryRunnables.add(r);
    
    

    エントリを確認します。 (ストリーム方式)

    entryRunnables.forEach(Runnable::run);
    
    

    または

    for(Runnable r: entryRunnables){
         r.run();
    }
    
    

あなたの答え