プログラマメモ2 - programmer no memo2

じゃんけんプログラムを条件分岐なしで。 2008/03/26

アルゴリズム・サイエンス:入口からの超入門 (アルゴリズム・サイエンスシリーズ―超入門編)
浅野 哲夫
4320121678

立ち読みしていて、「第8章 分岐命令の威力 - 分岐の除去」という項目を読んでなるほどと思ったしだい。

じゃんけんプログラムで条件分岐をなくしてみます。
簡単なじゃんけんプログラムを作成してみます。
結果を導くを方法に、if文を使った条件分岐版と、条件分岐を使わないで結果を求める方法で作成してみました。
ユーザが入力した値と、コンピュータがランダムでだした値で比較するというものです。

条件分岐(if)をネストするのがつねづねいやだいやだと思ってるいる人なので、
「条件分岐をなくす」が、僕的に目からうろこ状態だったのでした。

ユーザの状態3通り、コンピュータの状態3通りなので、9通りの結果が導きだせます。


import java.util.Random;
import java.util.Scanner;

public class Janken {

public static void main(String[] args) {

System.out.println("永遠にじゃんけんします。");
String[] t = { "グー", "チョキ", "パー" };
System.out.println("入力してください。入力してEnter 0:グー 1:チョキ 2:パー");
Scanner scanner = new Scanner(System.in);
while (true) {
int u = scanner.nextInt();
int r = r();
System.out.printf("あなた:%s コンピュータ:%s%n", t[u], t[r]);
System.out.println("条件分岐版:" + a(u, r));
System.out.println("条件分岐なし版:" + b(u, r));
}
}

/**
* 条件分岐して結果をとりだします。
* @param u
* @param r
* @return
*/
static String a(int u, int r) {

if (u == r)
return "あいこ";

if ((u == 0 && r == 1) || (u == 1 && r == 2) || (u == 2 && r == 0))
return "あなたの勝ち";

return "you lose!!";
}

/**
* 条件分岐をせずに結果をとりだします。
* @param u
* @param r
* @return
*/
static String b(int u, int r) {
String[][] t = { { "あいこ", "あなたの勝ち", "you lose!!" },
{ "you lose!!", "あいこ", "あなたの勝ち" },
{ "あなたの勝ち", "you lose!!", "あいこ" } };
return t[u][r];
}

static int r() {
return new Random().nextInt(3);
}
}

: