高難度問題
Java練習問題 第22回では高難易度の問題を出題します。
問題 1 難易度 ★★★★★
以下の実行例を参考として、じゃんけん大会ゲームプログラムを完成させてください。
複数の人間と、複数のコンピュータが参加して、最後の一人になるまでじゃんけんを続けるゲームです。
実行例
**じゃんけん大会ゲーム**
ゲームを選んでください
0: 一人プレイ
1: マルチプレイ
1
じゃんけんゲームはじめるよ!
みんなで勝負です!!
参加ユーザーの人数を入力してください
2
参加 PC の台数を入力してください
2
1 番目のユーザーの名前を入力してください
taro
2 番目のユーザーの名前を入力してください
hanako
1 回戦!
taro さんの手を選んでください。
0:ぐー 1:ちょき 2:ぱー
0
hanako さんの手を選んでください。
0:ぐー 1:ちょき 2:ぱー
1
taro さんは ぐー
hanako さんは ちょき
PC1 号さんは ちょき
PC2 号さんは ぐー
勝利者は、
taro さん PC2 号さん です。
2 回戦!
taro さんの手を選んでください。
0:ぐー 1:ちょき 2:ぱー
2
taro さんは ぱー
PC2 号さんは ぐー
勝利者は、
taro さん です。
ゲーム終了です。優勝者は taro さんでした
問題 1 解答
正解は、、、
Main_1801.java
package lesson018_exercise_1_1;
import java.util.Scanner;
public class Main_1801 {
public static void main(String[] args) {
System.out.println("**じゃんけんゲーム**");
System.out.println("ゲームを選んでください");
System.out.println("0:\t 一人プレイ");
System.out.println("1:\t マルチプレイ");
int n = new Scanner(System.in).nextInt();
Janken janken = new Janken();
if (n == 0) {
janken.startSinglePlay();
} else if (n == 1) {
janken.startMultiPlay();
}
}
}
Janken.java
package lesson018_exercise_1_1;
public class Janken {
public static final String[] HANDS = { "ぐー", "ちょき", "ぱー" };
private int cnt = 1;
public Janken() {
System.out.println("じゃんけんゲームはじめるよ!");
}
public void startSinglePlay() {
System.out.println("PC と勝負です!!");
Player[] players = new Player[2];
players[0] = new UserPlayer();
players[1] = new PcPlayer();
setPlayersName(players);
startJanken(players);
}
public void startMultiPlay() {
System.out.println("みんなで勝負です!!");
System.out.println("参加ユーザーの人数を入力してください");
int userNum = new java.util.Scanner(System.in).nextInt();
System.out.println("参加 PC の台数を入力してください");
int pcNum = new java.util.Scanner(System.in).nextInt();
Player[] players = new Player[userNum + pcNum];
for (int i = 0; i < userNum; i++) {
players[i] = new UserPlayer();
}
for (int i = 0; i < pcNum; i++) {
players[i + userNum] = new PcPlayer();
}
setPlayersName(players);
startJanken(players);
}
public void setPlayersName(Player[] players) {
for (int i = 0; i < players.length; i++) {
players[i].setName();
}
}
private void startJanken(Player[] players) {
System.out.println(cnt + "回戦!");
for (int i = 0; i < players.length; i++) {
players[i].setHand();
}
System.out.println();
for (int i = 0; i < players.length; i++) {
System.out.println(players[i].getName() + "さんは " +
HANDS[players[i].getHand()]);
}
Judge judge = new Judge();
Player[] winPlayers = judge.getWinners(players);
if (winPlayers.length == players.length) {
System.out.print("あいこ");
} else {
System.out.println("勝利者は、");
for (int i = 0; i < winPlayers.length; i++) {
System.out.print(winPlayers[i].getName() + "さん ");
}
}
System.out.println("です。\n");
if (winPlayers.length == 1) {
System.out.println("ゲーム終了です。優勝者は"
+ winPlayers[0].getName() + "さんでした");
} else {
cnt++;
startJanken(winPlayers);
}
}
}
Player.java
package lesson018_exercise_1_1;
public abstract class Player {
protected String name;
protected int hand;
public abstract void setName();
public abstract void setHand();
public String getName() {
return name;
}
public int getHand() {
return hand;
}
}
UserPlayer.java
package lesson018_exercise_1_1;
public class UserPlayer extends Player {
private static int num;
@Override
public void setName() {
num++;
System.out.println(num + "番目のユーザーの名前を入力してください");
name = new java.util.Scanner(System.in).next();
}
@Override
public void setHand() {
System.out.println(name + "さんの手を選んでください。");
for (int i = 0; i < Janken.HANDS.length; i++) {
System.out.print(i + ":" + Janken.HANDS[i] + "\t");
}
System.out.println();
hand = (new java.util.Scanner(System.in).nextInt());
}
}
PcPlayer.java
package lesson018_exercise_1_1;
import java.util.Random;
public class PcPlayer extends Player {
private static int num;
@Override
public void setName() {
num++;
name = "PC" + num + "号";
}
@Override
public void setHand() {
hand = new Random().nextInt(3);
}
}
Judge.java
package lesson018_exercise_1_1;
public class Judge {
private int[] handCounts = new int[3];
public Player[] getWinners(Player[] players) {
if (isDraw(players)) {
return players;
} else {
int winHand = getWinHand();
Player[] winners = new Player[handCounts[winHand]];
int cnt = 0;
for (int i = 0; i < players.length; i++) {
if (players[i].getHand() == winHand) {
winners[cnt] = players[i];
cnt++;
}
}
return winners;
}
}
private int getWinHand() {
if (handCounts[0] == 0) {
return 1;
} else if (handCounts[1] == 0) {
return 2;
} else {
return 0;
}
}
private boolean isDraw(Player[] players) {
return isAllSame(players) || isAllAppear(players);
}
private boolean isAllSame(Player[] players) {
int n = players[0].getHand();
for (int i = 1; i < players.length; i++) {
if (n != players[i].getHand()) {
return false;
}
}
return true;
}
private boolean isAllAppear(Player[] players) {
for (int i = 0; i < players.length; i++) {
handCounts[players[i].getHand()]++;
if (handCounts[0] > 0 && handCounts[1] > 0 && handCounts[2] > 0) {
return true;
}
}
return false;
}
}
Java練習問題 第23回でも引き続き高難易度の問題を出題します。
コメント