#はじめに
JavaでじゃんけんRPGを作成している途中に、毎回System.out.println
書くのがかなり面倒だったので楽になる方法について調べてみました。
拡張機能などで、楽にはなると思いますが今回は違う方向からせめてみます。
大まかな流れは
- コンソール出力のメソッドを作成
- これまでに記述していた、
System.out.println
をメソッド名に置換する
#ここから本題
解説では、3つほどあるクラスのうち1つだけに適応してみます。
これまでのコード
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
だけでいけた
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を入れなかったら、先頭の文字のみを置換する
など色々あるがここでは省略します。
いざ、ターミナルで置換!
~$ 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);
}
}
ファイルを確認
~$ 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
~$ 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);
}
}
しっかり反映されてる。
あとは、メソッドも置換されてしまったのでそれを手直しすればいいかな。
###結果
楽になった( ^∀^)