[ Java練習問題 ] 練習問題 第22回 『高難易度①』

目次

高難度問題

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 解答

正解は、、、

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;
  }
}

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);
    }
  }
}

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();
    }
  }
}

Java練習問題 第23回でも引き続き高難易度の問題を出題します。

(Visited 311 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次