見出し画像

Javaでプログラム制作に挑戦する【Hit&Blow】

ここまでJavaの基礎を計8回にわたって座学を中心に学習してきました!
その知識を定着、理解を更に深めることを目的に簡単なアプリをJavaで作成していきたいと思います。

・作成するもの

3桁の数字を当てるゲーム「 Hit&Blow 」

ルール
・入力する数字は3つ
・数字は1~6の範囲内のみ
・3つの数字は重複しない
・入力した数字が答えの中にあり、場所もあっている場合はHitとして数える
・入力した数字が答えの中にあるが、場所が異なる場合はBlowとして数える
・3つの数字がすべてHitとなったらクリア

・要件定義

実装する機能

以下の5つの機能を持ったアプリケーションを作成します。
・タイトルとルールの表示
・答えの生成機能
・入力した数字の保持機能
・Hit、Blowの判定機能
・クリアの判定機能

作成するアプリの挙動

①タイトルとルールを表示
②3つの数字を入力
③入力した数字に対して結果を表示
④3つともHitであればゲームクリア
(数字が異なる場合、②へ戻る)

作成したプログラム

package practice;

// 本プログラムで継承しているクラス
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Practice {
  public static void main(String[] args) {

// 変数に出力したいタイトル、ルールを格納
    String title = "Hit&Blow"
    String rule = "隠された3つの数字を当ててください\n"
                  + "1つの文字は1から6の間です\n"
                  + "3つの数字は重複しません\n"
                  + "入力した数字の、\n"
                  + "位置と数字が当たってたらHit、\n"
                  + "数字だけあってたらBlowとカウントします。\n"
                  + "隠された3つの数字とその場所を当てたら\n"
                  + "終了です\n\n";

// 配列を宣言、3つの箱を用意する
    int[] answer = new int[3];
    int[] input = new int[3];

    int hit = 0,blow = 0, count = 0;

// タイトルとルールを出力
    BufferedReader br 
    = new BufferedReader(new InputStreamReader(System.in));
    System.out.println(title);
    System.out.println(rule);

// 繰り返し処理でランダムな答えを作成
    for (int i = 0; i < answer.length; i++) {
      boolean flag = false;
      answer[i] = (int) (Math.random() * 6 + 1);
      do {
          flag = false;
          for (int j = i - 1; j >= 0; j--) {
              if (answer[i] == answer[j]) {
                  flag = true;
                  answer[i] = (int) (Math.random() * 6 + 1);
              }
          }
        } while (flag == true);
    }

    while (true) {
      count++;
      System.out.println("*** "+count + "回目 ***");

// 入力させる処理、繰り返し
    for (int i = 0; i < answer.length; i++) {
        System.out.print( (i + 1) + "個目 : ");
        try {
            input[i] = Integer.parseInt(br.readLine());
        } catch (NumberFormatException e) {
            System.err.println("数値を入力してください");              
            i--;
        } catch (IOException e) {
            System.err.println("もう一度入力してください");
            i--;
        }
    }

// 答え合わせの処理
// 数字と場所が合っていればHitに加算、誤っていたらBlowに加算
    hit = 0;
    blow = 0;
    for (int i = 0; i < answer.length; i++) {
        for (int j = 0; j < answer.length; j++) {
            if (i == j && input[i] == answer[j]) {
                hit++;
            } else if (input[i] == answer[j]) {
                blow++;
            }
        }
    }

// 3Hitか否かの判断を処理
    System.out.println("ヒット" + hit + " ブロー" + blow);
    if (hit == 3) {
        System.out.println("お見事!");
        break;
    }else{
        System.out.println("残念!");
      }
    }
  }
}

このプログラムの作成にあたって、3つのクラスを継承しました。

BufferedReader

テキストファイルを読み込むためのクラスです。
3つの数字を入力する際の処理に組み込んでいます。

IOException

例外の発生を通知するシグナルを発生させるクラスです。
入出力処理の失敗や、または割り込みの発生によって生成されるクラスです。今回設けているルールの1~6以外の数字が入力されたときに用いています。

InputStreamReader

バイトと文字列の橋渡し的な処理を行うクラスです。
前述のBufferedReaderとセットで利用し、処理を行なっています。

実際に作ってみて

ここまで学んできた宣言や、繰り返しの処理など、それを活用した結果として、きちんと動作するプログラムが作成できて良かったし、実際に作成することで、改めてJavaのプログラム構造の理解が深まったと思います!

Javaの得意分野をもっと理解深めつつ、別のプログラム作成にも挑戦していきたいです。

この記事が気に入ったらサポートをしてみませんか?