サイコロをふって進み20の地点のゴールを目指す処理を作成せよ。
詳しくは実行例を参考のこと。

初級課題

人数を入力しエンターを押すと
プレイヤー名…今回出た目(到達した地点)
到達した地点の数分だけの[*] ゴール地点[|]
が表示される。
エンターを押すことによって次の人の結果が表示される。
これを2ターン(人数分*2)分表示する処理を作成せよ。
[実行例]

 
何人>3 [enter]
P1...6(6)
******             | [enter]
P2...3(3)
***                | [enter]
P3...6(6)
******             | [enter]

P1...6(12)
************       | [enter]
P2...2(5)
*****              | [enter]
P3...1(7)
*******            | [enter]

中級課題

初級課題に続き、もし誰か一人がゴール地点を超えたらWinメッセージを表示して終了する処理を作成せよ。初級と同様に[enter]によって処理が進むようにする。
なお、ゴールを超えた分の*は表示しなくてよい

 
何人>3
P1...6(6)
******             |
P2...3(3)
***                |
P3...6(6)
******             |

P1...6(12)
************       |
P2...2(5)
*****              |
P3...1(7)
*******            |

P1...4(16)
****************   |
P2...2(7)
*******            |
P3...5(12)
************       |

P1...5(21)
********************
Goal! P1 Win!

上級課題

中級の処理を修正し、ゴール地点をオーバーしてしまった場合そのオーバーした分を戻る処理を加えよ。(ピッタリ20になったときのみゴールとなる)

何人>3
P1...3(3)
***                |
P2...1(1)
*                  |
P3...4(4)
****               |

P1...4(7)
*******            |
P2...1(2)
**                 |
P3...3(7)
*******            |

P1...6(13)
*************      |
P2...5(7)
*******            |
P3...4(11)
***********        |

P1...1(14)
**************     |
P2...1(8)
********           |
P3...2(13)
*************      |

P1...4(18)
****************** |
P2...2(10)
**********         |
P3...6(19)
*******************|

P1...4(18)
Overしたので 2 戻った
****************** |
P2...5(15)
***************    |
P3...5(16)
Overしたので 4 戻った
****************   |

P1...1(19)
*******************|
P2...2(17)
*****************  |
P3...1(17)
*****************  |

P1...1(20)
********************
Goal! P1 Win!

[解答例]

import java.util.*;

public class Sugoroku {
	public static void main(String[] args) {
		final int GOAL_POS = 20;
		System.out.print("何人>");
		int num = new Scanner(System.in).nextInt();
		int[] membersPos = new int[num];
		
		while (true) {
			for (int i = 0; i < num; i++) {
				int dice = new Random().nextInt(6) + 1;
				membersPos[i] += dice;
				int backStep = 0;
				if (membersPos[i] > GOAL_POS) {
					backStep = membersPos[i] - GOAL_POS;
					membersPos[i] = GOAL_POS - backStep;
				}
				System.out.printf("P%d...%d(%d)%n", i + 1, dice, membersPos[i]);
				if (backStep > 0) {
					System.out.printf("Overしたので %d 戻った%n", backStep);
				}
				for (int j = 0; j < GOAL_POS; j++) {
					if(membersPos[i] != GOAL_POS && j==GOAL_POS-1){
						System.out.print("|");
					}else if(j<membersPos[i]){
						System.out.print("*");
					}else{
						System.out.print(" ");
					}
				}
				if (membersPos[i] == GOAL_POS) {
					System.out.printf("%nGoal! P%d Win!%n", i + 1);
					return;
				}
				new Scanner(System.in).nextLine();
			}
			System.out.println();
		}
	}
}