ロイヤルインターネット

趣味や関心のあることについてメモのような感じ

ジャンケンゲーム改造

だいぶ手を加えてみた。ゲームとしての体裁は整えてみたつもり。
ただ、想定外の入力への対処は未実装。
思い出しつつ、

【Java】 コンストラクタって何? this( )の意味 | 一番かんたんなJava入門
上記ページも参照しつつで2時間くらいで作成。
とても、リーダブルコードを読了したあとのコードとは思えないな……w

public class Jangken {

	public static void main(String args[]) {
		// 勝つまで終わらない!
		while(true) {
			System.out.println("Game start. Choice your weapon any one.");
			System.out.println("1. Stone. Scissors can't break this.");
			System.out.println("2. Scissors. Easily cut.");
			System.out.println("3. Paper. Catch any stone.");

			// じゃんけんゲームで出す手を自分で選択できるようにする
			Player pl = new Player();

			// ResultクラスをPlayerクラスの追加に伴い、Computerクラスに名称を変更
			Computer com = new Computer();

			// 勝敗を判定するJudgeクラスの追加
			Judge judge = new Judge(pl.ChoiceWeapon(), com.ChoiceWeapon());

			// 勝てば終わり
			if (judge.Result()) {
				break;
			} else {
				for (int itr = 0; itr < 5; itr++) {
					System.out.println(".");
				}
			}
		}
	}

}
// じゃんけんの手をコンソール上で選択できるようにする
// 2014/10/16

import java.io.*;

public class Player {

	private int choice_weapon = 0;

	Player() {
		System.out.print("Choice! : ");

		// 入力された文字列を数値変換する
		try {
			InputStreamReader isr = new InputStreamReader(System.in);
			BufferedReader br = new BufferedReader(isr);

			// 欲しいのは最初の一文字だけなので、配列に入れた後そこだけ取り出す
			String input_string = new String(br.readLine());
			String picUp_first_chara = input_string.substring(0,1);

			choice_weapon = Integer.parseInt(picUp_first_chara);
		} catch (IOException e) {
			System.err.println("Error : " + e.getMessage());
		}
	}

	public int ChoiceWeapon() {
		return choice_weapon;
	}

}
//コンピューターの手を決める
//2014/10/16
import java.util.Random;

public class Computer {

	// 初期値は変更するかも。プレイヤーの手が不正である場合はCOMの自動勝利だ
	private int choice_weapon = 0;

	Computer() {
  	Random tmp = new Random();
		choice_weapon = tmp.nextInt(3) + 1;
	}

	public int ChoiceWeapon() {
		return choice_weapon;
	}
}
// プレイヤーとコンピュータの手を処理して結果を出す。印字もここ
// 2014/10/16
public class Judge {

	private static String[] weapon = {"Nuke", "Stone", "Scissors", "Paper"};
	private boolean is_flag = false;

	Judge(int pl, int com) {
		// 勝ったらクリアフラグを立てる、負け、あいこはそのまま
		if (pl < com) {
			is_flag = !is_flag;
		} else if (pl == 3 && com == 1) {
			is_flag = !is_flag;
		}
		
		// コンソールに出力する
		this.MessagePrint(weapon[pl], weapon[com]);
	}

	// なんとなくオーバーロードしておく(謎
	Judge() {
		this(0, 1);
	}

	private void MessagePrint(String pl_weapon, String com_weapon) {
		System.out.println("Your weapon is " + pl_weapon + ".");
		System.out.println("Enemy weapon is " + com_weapon + ".");
	}

	public boolean Result() {
		if (is_flag) {
			System.out.println("You win!");
		} else {
			System.out.println("Game is Continued...");
		}
		return is_flag;
	}
}

オーバーロードは、「ああ、そういやこんなのあったな……」と思って実装してみた。
たぶん使われることは無い。

作るのに時間がかかった部分は、

  • 入力の期待値が1,2,3であるのに対して、String[]のインデックスを合わせるのを忘れていた
  • 入力Stringの先頭文字を、charAt[0]で抜け出せないか試行錯誤(結局断念)
  • Buffered Readerクラスってtry catchしないとだめなの!?
  • Computerクラスで取得するランダム値が0~2になっていた!(←これ致命的

こんなあたりが要因かな。
weapon[0]は、当初Judgeクラスのコンストラクタが呼ばれるときに、pl-1とかにするかどうかで悩んだ末に保留に落ち着いた結果。

過去のファイルをあさっていたら、ブラックジャックの作りかけ放置が出てきたので、そちらも手をつけてみようかな。

知人がTRPGシナリオ公開用にWEBを設置したのに刺激を受けているので、JavaScriptとかも悪くない。

とにかく、現在の勤務先ではひたすらCOBOL! だから何かしら自分の慣れ親しんだ言語で遊びたくて仕方ないのである。