LoginSignup
4
0

More than 3 years have passed since last update.

【Java】System.out.printlnを入力するのがめんどくさいから楽にしたい

Posted at

はじめに

JavaでじゃんけんRPGを作成している途中に、毎回System.out.println書くのがかなり面倒だったので楽になる方法について調べてみました。

拡張機能などで、楽にはなると思いますが今回は違う方向からせめてみます。

大まかな流れは

  • コンソール出力のメソッドを作成
  • これまでに記述していた、System.out.printlnをメソッド名に置換する

ここから本題

解説では、3つほどあるクラスのうち1つだけに適応してみます。

これまでのコード

Judge.java
public class Judge {

    public void startJanken(Player player1, Player player2) {

        System.out.println("[じゃんけん開始]\n");

        for (int cnt = 0;cnt < 3; cnt++) {
            System.out.println("["+(cnt+1)+"回戦目]");

            //どっちが勝ったか判断 
            Player winner = judgeJanken(player1,player2);

            if(winner != null) {
                System.out.println("\n"+winner.getName()+"が勝ちました");
                winner.notifyResult(true);
            }else {
                System.out.println("引き分けです");
            }
        }
        System.out.println("じゃんけん終了");

        Player finalWinner = judgeFinalWinner(player1,player2);
        System.out.print(player1.getWinCount()+"対"+player2.getWinCount()+"で");

        if (finalWinner != null) {
            System.out.println(finalWinner.getName()+"の勝ちです");
        }else {
            System.out.println("引き分けです");
        }


    }
    private Player judgeJanken(Player player1,Player player2) {
        Player winner = null;

        int player1hand = player1.showHand();
        int player2hand = player2.showHand();

        printHand(player1hand);
        System.out.print("vs.");
        printHand(player2hand);
        System.out.print("\n");

        if((player1hand == Player.stone && player2hand == Player.scissors)||
                (player1hand == Player.scissors && player2hand == Player.paper)||
                (player1hand == Player.paper && player2hand == Player.stone)) {
            winner = player1;
        }else if((player1hand == Player.stone && player2hand == Player.paper)||
                (player1hand == Player.scissors && player2hand == Player.stone)||
                (player1hand == Player.paper && player2hand == Player.scissors)) {
            winner = player2;
        }
        return winner;
    }
    private Player judgeFinalWinner(Player player1,Player player2) {
        Player winner = null;

        int player1WinCount = player1.getWinCount();
        int player2WinCount = player2.getWinCount();


        if(player1WinCount > player2WinCount) {
            winner = player1;

        }else if(player1WinCount < player2WinCount) {
            winner = player2;

        }
        return winner;
    }

    private void printHand(int hand) {

        switch(hand) {
        case Player.stone:
        System.out.print("ぐー");
        break;

        case Player.scissors:
        System.out.print("チョキ");
        break;

        case Player.paper:
        System.out.print("パー");
        break;

        default:
        break;
        }
    }

}

下記のようなメソッドを付け加えてみる

       //ここ!!!
    public static void put(String str) {
        System.out.println(str);
    }

すると、これまでSystem.out.printlnと入力していたところがputだけでいけた

Judge.java
public class Judge {

    public void startJanken(Player player1, Player player2) {

        put("[じゃんけん開始]\n");

        for (int cnt = 0;cnt < 3; cnt++) {
            put("["+(cnt+1)+"回戦目]");

            //どっちが勝ったか判断 
            Player winner = judgeJanken(player1,player2);

            if(winner != null) {
                put("\n"+winner.getName()+"が勝ちました");
                winner.notifyResult(true);
            }else {
                put("引き分けです");
            }
        }
        put("じゃんけん終了");

        Player finalWinner = judgeFinalWinner(player1,player2);
        System.out.print(player1.getWinCount()+"対"+player2.getWinCount()+"で");

        if (finalWinner != null) {
            put(finalWinner.getName()+"の勝ちです");
        }else {
            put("引き分けです");
        }


    }
    private Player judgeJanken(Player player1,Player player2) {
        Player winner = null;

        int player1hand = player1.showHand();
        int player2hand = player2.showHand();

        printHand(player1hand);
        System.out.print("vs.");
        printHand(player2hand);
        System.out.print("\n");

        if((player1hand == Player.stone && player2hand == Player.scissors)||
                (player1hand == Player.scissors && player2hand == Player.paper)||
                (player1hand == Player.paper && player2hand == Player.stone)) {
            winner = player1;
        }else if((player1hand == Player.stone && player2hand == Player.paper)||
                (player1hand == Player.scissors && player2hand == Player.stone)||
                (player1hand == Player.paper && player2hand == Player.scissors)) {
            winner = player2;
        }
        return winner;
    }
    private Player judgeFinalWinner(Player player1,Player player2) {
        Player winner = null;

        int player1WinCount = player1.getWinCount();
        int player2WinCount = player2.getWinCount();


        if(player1WinCount > player2WinCount) {
            winner = player1;

        }else if(player1WinCount < player2WinCount) {
            winner = player2;

        }
        return winner;
    }

    private void printHand(int hand) {

        switch(hand) {
        case Player.stone:
        System.out.print("ぐー");
        break;

        case Player.scissors:
        System.out.print("チョキ");
        break;

        case Player.paper:
        System.out.print("パー");
        break;

        default:
        break;
        }
    }

       //ここ!!!
    public static void put(String str) {
        System.out.println(str);
    }
}


メソッドなので、クラスをまたぐ時に少し面倒かもしれないが結構楽になった笑

置換について

私の場合、途中で知ったのでこれまで書いていたところを全てputに書き換える必要があった。

ちょうどLinuxの勉強をしたところだったのでsedコマンドを使ってみる

sedコマンドの基本構文

~$ sed -e s/置換前の文字/置換後の文字/g [ファイル名]

  • 「-e」はあってもなくてもいい
  • gを入れなかったら、先頭の文字のみを置換する

など色々あるがここでは省略します。

いざ、ターミナルで置換!

tarminal.

~$ sed -e s/System.out.println/put/g Judge.java 

public class Judge {

    public void startJanken(Player player1, Player player2) {

        put("[じゃんけん開始]\n");

        for (int cnt = 0;cnt < 3; cnt++) {
            put("["+(cnt+1)+"回戦目]");

            //どっちが勝ったか判断 
            Player winner = judgeJanken(player1,player2);

            if(winner != null) {
                put("\n"+winner.getName()+"が勝ちました");
                winner.notifyResult(true);
            }else {
                put("引き分けです");
            }
        }
        put("じゃんけん終了");

        Player finalWinner = judgeFinalWinner(player1,player2);

        :
                :
                :
                :

    public static void put(String str) {
        put(str);
    }
}

ファイルを確認

tarminal.
~$ cat Judge.java 

public class Judge {

    public void startJanken(Player player1, Player player2) {

        System.out.println("[じゃんけん開始]\n");

        for (int cnt = 0;cnt < 3; cnt++) {
            System.out.println("["+(cnt+1)+"回戦目]");

            //どっちが勝ったか判断 
            Player winner = judgeJanken(player1,player2);

            if(winner != null) {
                System.out.println("\n"+winner.getName()+"が勝ちました");
                winner.notifyResult(true);
            }else {
                System.out.println("引き分けです");
            }
        }
        System.out.println("じゃんけん終了");

        Player finalWinner = judgeFinalWinner(player1,player2);

        :
                :
                :
                :

    public static void put(String str) {
        System.out.println(str);
    }
}

ここで置換完了と思ったのだが、エディタで確認してみると置換されていない。。

ここで調べてみると、sedコマンドはプレビューを見るだけで実際には反映されなかった。

実際に反映して欲しいので、調べて見ると
オプションに-i(直接ファイルに反映される)

ということで再挑戦
~$ sed -i -e s/System.out.println/put/g Judge.java

tarminal.
~$ cat Judge.java
public class Judge {

    public void startJanken(Player player1, Player player2) {

        put("[じゃんけん開始]\n");

        for (int cnt = 0;cnt < 3; cnt++) {
            put("["+(cnt+1)+"回戦目]");

            //どっちが勝ったか判断 
            Player winner = judgeJanken(player1,player2);

            if(winner != null) {
                put("\n"+winner.getName()+"が勝ちました");
                winner.notifyResult(true);
            }else {
                put("引き分けです");
            }
        }
        put("じゃんけん終了");

        Player finalWinner = judgeFinalWinner(player1,player2);

        :
                :
                :
                :

    public static void put(String str) {
        put(str);
    }
}

しっかり反映されてる。

あとは、メソッドも置換されてしまったのでそれを手直しすればいいかな。

結果

楽になった( ^∀^)

4
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0