解答例(1)
class Kadai1105{
public static void main(String [] args) throws Exception{
//キーボード入力を読みとるために、System.inからBufferedReaderを作る。
BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
//乱数から正解となるMoo数を作る。
MooNumber m=new MooNumber();
//入力を促すメッセージ(初回のみ表示)
System.out.println("入力してください。");
//int型変数iとMooNumberクラスの変数nを宣言し、iには0を代入。
int i=0;
MooNumber n;
//while文の条件式が常にtrueなので、breakで抜けるまで無限ループ。
while(true){
//キーボードからの入力を読み込む。
String a=d.readLine();
//入力されたものがMoo数でない時のために、try文を作る。
try{
n=new MooNumber(a);
}
//Moo数に変換できない例外(java.lang.Exeption)が発生した場合、
//再入力を促すメッセージを表示し、while文の最初に戻る。
catch(java.lang.Exception e){
System.out.println("入力が間違っているようです。もう一度正しく入力してください。");
continue;
}
//iを1増加。(正解までにかかった入力回数となる)
i++;
//現在の回答回数、正解のMoo数とのbull、cowの数を表示。
System.out.println(i+":"+n.getBull(m)+"B"+n.getCow(m)+"C");
//4bull(つまり正解)の時はwhile文を抜け、正解回数を表示。
if(n.getBull(m)==4) break;
}
System.out.println(i+"回で正解しました。");
}
}
こちらが想定したようなプログラムです.コメントが詳しいので紹介しました.
解答例(2)
class Kadai1105{
public static void main(String [] args) throws Exception{
//MOOナンバーを予想してもらうメッセージを表示
System.out.println("Guess a Moo number");
//正解のMOO数を乱数で生成する
MooNumber n1=new MooNumber();
// MooNumberを作成中にExceptionが発生する可能性があるので
// tryでくるむ
try{
// 文字列からMooNumberを作る。
// ここでExceptionが発生する可能性がある。
int i=0;
for(;;) {
// 入力をするためには,System.inからBufferedReaderを作らなくてはいけない
BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
//ユーザの入力を受け取る
String s;
s = d.readLine();
MooNumber n2 = new MooNumber(s);
// Bullを計算して表示
System.out.print(n1.getBull(n2)+"B");
// Cowを計算して表示
System.out.println(n1.getCow(n2)+"C");
//何回質問したかを変数iによってカウントする。
i=++i;
//もし正解と一致したら解答回数を表示して,プログラムを終了
if(n1.getBull(n2)==4){
//正解とのMOO積を表示
System.out.println("Correct answer in "+i);
//その後プログラムを終了する。
break;
}
}
}
catch(Exception e){
System.out.println("Moo Numberではありません。");
}
}
}
このプログラムは,BufferedReaderを何度も作っているため,ファイルやプロ
グラムからの入力の場合は正しく扱えないという問題があります.
解答例(3)
//氏名:XXXXX
//学生証番号:XXXX
//科類・学年:XXXX
/*
11/05 課題プログラム
コメント:
・入力した数がMoo数でない場合は入力をやり直させます。
・Moo数クラスは独自に書きました。とはいっても仕組みはほとんど一緒でgetCow, getBullメソッドはパクリです。
・MooGameControllerクラスを作ってMVCモデルっぽく。勉強不足で正しいかどうかは分かりませんが…
・基本的には課題の仕様と同じなはずです。
*/
import java.io.*;
//汎用入力クラス。Cのscanfの様な感じ。
class InputFromKeyboard
{
//文字列を入力
public static String inputString()
{
BufferedReader d = new BufferedReader(new InputStreamReader(System.in));
String outStr = "";
try
{
outStr = d.readLine();
}
catch(IOException e)
{
System.out.println("IO Error: " + e.getMessage());
System.exit(1);
}
return outStr;
}
//入力した文字列をintに変換して得る
public static int inputInt()
{
String outStr=inputString();
return Integer.parseInt(outStr);
}
//入力した文字列をdoubleに変換して得る
public static double inputDouble()
{
String outStr=inputString();
return Double.parseDouble(outStr);
}
}
//例のMoo Numberクラス
class MooNumber
{
//Moo数の要素として使わない数を初期値にする(後のダブリをなくす処理のため)
private int moo_num_list[] = {10,10,10,10};
MooNumber()
{
int random_num;
for(int i = 0 ; i < 4 ; i++)
{
for(;;)
{
random_num = (int)(10 * Math.random()); //0〜9までの乱数を代入
//random_numがmoo_num_listとどれも一致しなかったらループを抜ける
//このためにmoo_num_listの要素の初期値は要素として使わない値である必要がある
if ((moo_num_list[0] - random_num) * (moo_num_list[1] - random_num) *
(moo_num_list[2] - random_num) * (moo_num_list[3] - random_num) != 0)
{
break;
}
}
moo_num_list[i] = random_num;
//System.out.println("Constracting... moo_num_list[" + i + "] = " + moo_num_list[i]); //デバッグ用
}
}
MooNumber(String moo_str) throws Exception
{
int temp;
if(moo_str.length() != 4)
{
throw new Exception("Not a Moo Number : Length must be 4");
}
for(int i = 0 ; i < 4 ; i++)
{
//サンプルと同じやり方
temp = "0123456789".indexOf(moo_str.charAt(i));
if(temp < 0)
{
throw new Exception("Not a Moo Number : Not avaivable scope");
}
//上と同じようなタブリチェック
if ((moo_num_list[0] - temp) * (moo_num_list[1] - temp) *
(moo_num_list[2] - temp) * (moo_num_list[3] - temp) == 0)
{
throw new Exception("Not a Moo Number : All numbers must be different");
}
moo_num_list[i] = temp;
//System.out.println("Constracting... moo_num_list[" + i + "] = " + moo_num_list[i]); //デバッグ用
}
}
int getBull(MooNumber other_moo)
{
int bull = 0;
for(int i = 0 ; i< 4 ; i++)
{
if(moo_num_list[i] == other_moo.moo_num_list[i])
{
bull++;
}
}
return bull;
}
int getCow(MooNumber other_moo)
{
int cow = 0;
for(int i = 0 ; i < 4 ; i++)
{
for(int j = 0 ; j < 4 ; j++)
{
if((i != j) && (moo_num_list[i] == other_moo.moo_num_list[j]))
{
cow++;
break;
}
}
}
return cow;
}
}
//数当てゲームMooを司るクラス
class MooGameController
{
private MooNumber computer_moo;
private int answer_count = 0;
MooGameController()
{
computer_moo = new MooNumber();
System.out.println("Guess a Moo number!");
}
//Moo数入力〜bull,cowの表示まで。当てたら戻り値はそれまでに答えた回数。ハズレの時は-1。
int doMooGame()
{
answer_count++;
MooNumber user_moo;
for(;;)
{
try
{
//Moo数の入力
//System.out.print("Input a Moo number >");
String str = InputFromKeyboard.inputString();
user_moo = new MooNumber(str);
}
catch(Exception e)
{
//Moo数生成の際のエラーならやりなおし
System.out.println("Error: " + e.getMessage());
continue;
}
break;
}
int bull = computer_moo.getBull(user_moo);
int cow = computer_moo.getCow(user_moo);
System.out.println(answer_count + ":" + bull + "B" + cow + "C");
if(bull == 4) return answer_count;
return -1;
}
//当てた時の処理
void finishMooGame()
{
System.out.println("Right answer! You answered " + answer_count + " times.");
}
}
public class Kadai1105
{
public static void main(String[] args)
{
MooGameController game_manager = new MooGameController();
for(;;)
{
if(game_manager.doMooGame() > 0)
{
game_manager.finishMooGame();
break;
}
}
}
}
MVC(Model View Control)モデルというのは,オブジェクト思考設計の際のモ
デルの一つです.良く勉強していますが,この程度のプログラムに使うのは大
げさな気もしますね.
解答例(4)
class Kadai1105{
public static void main(String [] args) throws Exception{
// この部分を埋めて下さい.
System.out.println("Guess MooNumber");
BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
MooNumber moo1 , moo2;
moo1 = new MooNumber();
int j=1;
for(;;){
String m = d.readLine();
moo2 = new MooNumber(m);
System.out.println(j+":"+moo1.getBull(moo2)+"B"+moo1.getCow(moo2)+"C");
j++;
if (moo1.getBull(moo2) == 4) break;}
System.out.println("Congulatulation!Correct answer in "+j);
}
}
j++ を入れる位置が違っているので,一回で当てても2回かかったことになってしまっています.
解答例(5)
/**
* Kadai1105.java
* XXXX XXXXX
*
* 数当てゲームMOO。
* コンピュータがランダムに生成した、互いに異なる4桁の数(MOO数)を当てます。
* "0586"のように"0"から始めてもよいです。
* ユーザーが好きなMOO数を入力すると、bull(場所も数も同じ)と
* cow(数は同じだが場所が違う)の数をこたえます。
* 4:B2C1と表示されたら、4回目の質問でbullが2、cowが1であることを示します。
*
* 正解を言い当てると終了します。
* MOO数のかわりにexitと入力しても終了することができます。
*
* History
* 2002.11.12 ver.0.01 新規作成
*/
import java.util.*;
import java.io.*;
class Kadai1105 {
/** デバッグするときはtrueに */
//public static final boolean DEBUG = true;
public static final boolean DEBUG = false;
/** 終了するための文字列 */
public static final String EXIT_CODE = "exit";
public static void main(String[] args) throws IOException {
System.out.println("MOO数を当ててください。");
/** 答え。ランダムに生成 */
MooNumber answer = new MooNumber();
if (DEBUG) System.out.println(answer.toString());
/** 現在何回目? */
int currentTerm = 1;
BufferedReader in
= new BufferedReader(new InputStreamReader(System.in));
while (true) {
try {
String inputStr = in.readLine();
// 終了チェック
if (inputStr.equals(EXIT_CODE)) {
if (queryExit(in)) {
break;
} else {
continue;
}
}
// それ以外のときはMOO数を入力したものとして評価
// MOO数じゃないときはExceptionで対処
MooNumber input = new MooNumber(inputStr);
int bull = input.getBull(answer);
int cow = input.getCow(answer);
// 画面表示
System.out.println("" + currentTerm + ":" +
bull + "B" + cow + "C");
// すべての桁がBullなら終了
if (bull == MooNumber.N_DIGITS) {
System.out.println("Correct answer in " + currentTerm);
break;
}
currentTerm++;
} catch (NotMooNumberException e) {
System.out.println("MOO数ではない。");
}
}
}
/**
* 終了するかユーザーにたずねます。
*
* 終了するならtrueを、しないならfalseを返します。
*/
private static boolean queryExit(BufferedReader in) throws IOException {
// 途中でやめて終了します
while (true) {
System.out.print("ゲームを中断してもよいですか?y/n: ");
String ans = in.readLine();
if (ans.equals("y")) {
return true;
} else if (ans.equals("n")) {
return false;
}
}
}
}
/**
* MooNumberクラス
*
* MOO数の管理をするクラスです。
*/
class MooNumber {
/** 桁数。必ず10以下。 */
static public final int N_DIGITS = 4;
///////////////////////////////////////////
// メンバ
/** それぞれの桁の数字。必ず0-9をとる。 */
private int[] digits = new int[N_DIGITS];
/**
* ランダムにMooNumberを初期化
*/
public MooNumber() {
int tmpDigits[] = new int[10];
// tmpDigitsに 0123456789を入れる
for (int i = 0; i < 10; i++) {
tmpDigits[i] = i;
}
// 乱数を生成するためのクラス
Random rand = new Random();
// 0 と 0-9(の範囲の乱数を添字とする tmpDigitsの要素)を,
// 1と1-9を, 2と2-9を,3と3-9を入れ換える
for (int i = 0; i < N_DIGITS; i++) {
int j = i + rand.nextInt(10 - i);
digits[i] = tmpDigits[j];
tmpDigits[j] = tmpDigits[i];
}
}
/**
* 文字列でMooNumberを初期化
*/
public MooNumber(String str) throws NotMooNumberException {
if (str.length() != N_DIGITS){
throw new NotMooNumberException();
}
// 同じ数字が2回使われないかどうかのチェック
boolean used[] = new boolean[10];
for (int i = 0; i < N_DIGITS; i++) {
// strのi番目の文字が 0-9にあてはまるか?
int index = "0123456789".indexOf(str.charAt(i));
// 0-9以外の文字か,index番目の数字が既に使われた時
if (index == -1 || used[index]) {
throw new NotMooNumberException();
}
// index番目の数字が使われた
used[index] = true;
// インスタンス変数 digitのi桁目をindexにする.
digits[i]=index;
}
}
/**
* 別のMOO数との間のbullを数える
*/
public int getBull(MooNumber m){
int bull = 0;
for (int i = 0; i < N_DIGITS; i++)
if (digits[i] == m.digits[i])
bull++;
return bull;
}
/**
* 別のMOO数との間のcowを数える
*/
public int getCow(MooNumber m){
int cow = 0;
for (int i = 0; i < N_DIGITS; i++)
for (int j = 0; j < N_DIGITS; j++)
if (i != j && digits[i] == m.digits[j]) {
cow++;
break;
}
return cow;
}
/**
* Stringに変換
*/
public String toString() {
String str = "";
for (int i = 0; i < N_DIGITS; i++) {
str += "" + digits[i];
}
return str;
}
}
/**
* NotMooNumberExceptionクラス
*
* MooNumberのコンストラクタで、MOO数でないときにthrowされます。
*/
class NotMooNumberException extends Exception {
}
4桁以外のゲームにすぐにできるようにしているところ,デバッグ用のコード
も入れているところは,凝っています.
解答例(6)
//////////////////////
//計算機プログラミング1 課題11月5日
// ゲーム「Mooで遊ぼう!」
// Programmed by
// XXXXX
// XXXXX
//////////////////////////////////////////
/*
売り:ゲーム中のメッセージ
仕様:Moo数を当てるときに、Moo数でない数(1129など、同じ数字があるor文字が多い)を入力すると、エラーとなる。ただし、回数はカウントされていく。また、コマンドラインで引数に 1-10 の数字を与えると、4桁以外のMooで遊べる。
>java Kadai1105 3
で、3桁のMooが遊べます。
*/
import java.util.*;
import java.io.*;
class Kadai1105{
public static void main(String argv[]){
//使用する変数、インスタンス
int figure = 4;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
MooNumber mN;
int count = 0;
//Exception処理のためのtry-catch
//ただし、たいした処理はしていない
try{
if(argv.length != 0){
figure = Integer.parseInt(argv[0]);
}
}catch(Exception e){
System.out.println(e);
}
try{
//ゲーム開始
//雰囲気を出すためにThread.sleep(1000)を使っている
System.out.print("Mooで遊ぼう!");
Thread.sleep(1000);
mN = new MooNumber(figure);
//System.out.println("debug..."+mN);
System.out.print("...Moo数を生成しています...ずるはいけませんよ。");
Thread.sleep(1000);
System.out.println("それではMoo数を当ててください。");
while(true){
//Exception処理のためのtry-catch
//ただし、たいした処理はしていない
count++;
String str = br.readLine();
//入力が不正な場合はExceptionでスキップ。ループの最初へ戻る。
//その場合もカウントは増える。ここは厳しく。
try{
String judge = mN.compareTo(new MooNumber(figure, str));
System.out.println(count+":"+judge);
if(judge.equals(figure+"B0C")){
System.out.println(count+"回で正解しました!");
break;
}
}catch(Exception e){
System.out.println(count+":"+e.getMessage());
}
}
System.out.println("ゲーム終了です。Thank you for your playing.");
//デバッグ用
//System.out.println("debug..."+mN);
}catch(Exception err){
System.out.println("エラーが起こりました。\n"+err);
//err.printStackTrace();
}
}
}
class MooNumber{
//Moo数の桁数(隠し機能:4桁以外のMooも遊べる)
private int figure = 4;
//Moo数を入れるためのint配列:digits[]
private int digits[] = new int[10];
//乱数発生Randomインスタンス
private Random r = new Random();
//コンストラクタ1(引数なし)Moo数ランダム生成
MooNumber() throws Exception{
initRand();
}
//コンストラクタ2(引数文字列)
MooNumber(String str) throws Exception{
initString(str);
}
//コンストラクタ(引数int)4桁以外のゲームにも対応
MooNumber(int fig) throws Exception{
figure = fig;
initRand();
}
//コンストラクタ(引数int, 文字列)4桁以外のゲームにも対応
MooNumber(int fig, String str) throws Exception{
figure = fig;
initString(str);
}
//コンストラクタから呼ぶ初期化用メソッド
private void initRand() throws Exception{
//0〜9が一個ずつあるint配列
int tmpDigits[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for(int i = 0; i < figure; i++){
int j = i + r.nextInt(10 - i);
digits[i] = tmpDigits[j];
tmpDigits[j] = tmpDigits[i];
}
}
private void initString(String str) throws Exception{
//桁数が合っているかどうかのチェック
if(str.length() != figure){
throw new Exception("Moo数は"+figure+"文字でなければならないのです。");
}
//一文字ずつintにして代入
for(int i = 0; i < figure; i++){
try{
digits[i] = Integer.parseInt(str.substring(i, i + 1));
for(int j = 0; j < i; j++){
if(digits[i] == digits[j]){
throw new Exception("同じ数字を使ってはいけないのです。");
}
}
}catch(NumberFormatException err){
throw new Exception("数字じゃない。。。");
}
}
}
public String compareTo(MooNumber mNg){
int bull = 0, cow = 0;
for(int i = 0; i < figure; i++){
for(int j = 0; j < figure; j++){
if(digits[i] == mNg.digits[j]){
if(i == j){
bull++;
}else{
cow++;
}
}
}
}
return ""+bull+"B"+cow+"C";
}
public String toString(){
String tempS = "";
for(int i = 0; i < figure; i++){
tempS += digits[i];
}
return tempS;
}
}
こちらの用意したMooNumberクラスを使わず,一から作っています.
解答例(7)
import java.util.*;
import java.io.*;
class MooNumber{
int digits[]=new int[4];
MooNumber(){
int i,j;
Random r=new Random();
//まず一桁目をランダムで0から9まで生成
digits[0]=r.nextInt(10);
for(i=1;i<= 3;i++){
int again=0;
do{
again=0;
//二桁目以降はランダムで作られる値の上限を1ずつ下げていく
digits[i]=r.nextInt(10-i);
for (j=0;j< i;j++){
if(digits[i]==digits[j]){
//そして(乱数の値を少なめに生成するぶん)もし
//前と同じ値になったら値を+1する
//この処理を行ったらもう一度
//新たに同じになった桁がないかチェックする
digits[i]++;
again=1;
}
}
}
while(again==1);
}
}
MooNumber(String str) throws Exception{
if (str.length()!=4){
throw new Exception("Not a Moo Number");
}
boolean used[]=new boolean[10];
for (int i=0;i< 4;i++){
int index="0123456789".indexOf(str.charAt(i));
if (index==-1|| used[index]){
throw new Exception("Not a Moo Number");
}
used[index]=true;
digits[i]=index;
}
}
int getBullCow(MooNumber m,MooNumber a){
int bull=0;
int cow=0;
int i,j=0;
//a(入力された数)m(生成したMooNumber)の各桁を比較
//同じであればbullの値を1増やす
for (i=0;i< 4;i++){
if (a.digits[i]==m.digits[i]){
bull++;
}
}
//a(入力された数)とm(生成したMooNumber)で
//重複した数がいくつあるか調べる
for (i=0;i< 4;i++){
for (j=0;j< 4;j++){
if (a.digits[i]==m.digits[j]){
cow++;
}
}
}
//本来bullにすべきケースもcowに入れている
//よってそのぶんcowの値を減らす
cow=cow-bull;
//返り値を一つですませるため下の式を用いている。
return bull*10+cow;
}
}
class Kadai1105{
public static void main(String[] args) throws Exception{
MooNumber a=new MooNumber();
BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
//kaisu変数で入力された回数を記憶する
int kaisu=0;
for (;;){
//入力された数sを引数としてMooNumberクラスを生成
String s;
System.out.println("Guess a Moo Number");
s=d.readLine();
MooNumber m=new MooNumber(s);
int point=a.getBullCow(m,a);
//pointの値からbull、cowの値を算出する
System.out.println((int)point/10+"B"+point%10+"C");
kaisu++;
if (point==40){
System.out.println(kaisu+"times");
//正解を出すまでループする
break;
}
}
}
}
bullとCowの計算を一度に行い bull*10+cow を返すというせこいテクニックを
使っています.昔の不自由なプログラミング言語を使う場合はこの手のテクニックは必須でした.
解答例(8)
// XXXXXX
// 11/5課題問題 "数当てゲーム MOO"
// Randomクラスを使うために必要
import java.util.*;
// キーボード入力のために必要
import java.io.*;
// Moo数を表すクラス
class MooNumber{
// 4桁の10進表現に対応した配列
int digits[]=new int[4];
// 乱数でのMOO数の生成
// 0123456789を並び替えて最初の4桁
MooNumber(){
int tmpDigits[]=new int[10];
int i;
// tmpDigitsに 0123456789を入れる
for(i=0;i< 10;i++){
tmpDigits[i]=i;
}
// 乱数を生成するためのクラス
Random r=new Random();
// 0 と 0-9(の範囲の乱数を添字とする tmpDigitsの要素)を,
// 1と1-9を, 2と2-9を,3と3-9を入れ換える
for(i=0;i< 4;i++){
int j=i+r.nextInt(10-i);
digits[i]=tmpDigits[j];
tmpDigits[j]=tmpDigits[i];
}
}
// 文字列から対応するMoo数を作る
MooNumber(String str) throws Exception{
if(str.length() != 4){
throw new Exception("Not a Moo Number");
}
// 同じ数字が2回使われないかどうかのチェック
boolean used[]=new boolean[10];
for(int i=0;i< 4;i++){
// strのi番目の文字が 0-9にあてはまるか?
int index="0123456789".indexOf(str.charAt(i));
// 0-9以外の文字か,index番目の数字が既に使われた時
if(index == -1 || used[index]){
throw new Exception("Not a Moo Number");
}
// index番目の数字が使われた
used[index]=true;
// インスタンス変数 digitのi桁目をindexにする.
digits[i]=index;
}
}
// 別のMoo数との間のbullを数える
int getBull(MooNumber m){
int bull=0;
for(int i=0;i< 4;i++)
if(digits[i]==m.digits[i])
bull++;
return bull;
}
// 別のMoo数との間のcowを数える
int getCow(MooNumber m){
int cow=0;
for(int i=0;i< 4;i++)
for(int j=0;j< 4;j++)
if(i!=j && digits[i]==m.digits[j]){
cow++;
break;
}
return cow;
}
// デバッグ用など表示に使う.
public String toString(){
return ""+digits[0]+""+digits[1]+""+digits[2]+""+digits[3];
}
}
class Kadai1105{
public static void main(String [] args) throws Exception{
//////////////////////////以上は課題のページから引用/////////////////////////////
MooNumber MN1 = new MooNumber();
//System.out.println(MN1);//デバッグ用
System.out.println("Guess a Moo Number!");
// 変数kを解答回数の表示(とoption1)のために使用する。
int k,check=0;
//------ option1のための配列とdigits[]のchar化-----------------------
int help=1;//help の回数を制限するための変数
char openD[]=new char[4];
char tempopen[]=new char[4];
for(int od=0;od<=3;od++){
openD[od]='X';
for(int y=0;y<=9;y++){
if(MN1.digits[od]==0)tempopen[od]='0';
if(MN1.digits[od]==1)tempopen[od]='1';
if(MN1.digits[od]==2)tempopen[od]='2';
if(MN1.digits[od]==3)tempopen[od]='3';
if(MN1.digits[od]==4)tempopen[od]='4';
if(MN1.digits[od]==5)tempopen[od]='5';
if(MN1.digits[od]==6)tempopen[od]='6';
if(MN1.digits[od]==7)tempopen[od]='7';
if(MN1.digits[od]==8)tempopen[od]='8';
if(MN1.digits[od]==9)tempopen[od]='9';
}//もっと簡単にできそうな気もしますが・・・
}
//-------------------------------------------------------------------
// 正解が出るまで繰り返す。
for(k=1;;){
BufferedReader d = new BufferedReader(new InputStreamReader(System.in));
String n=d.readLine();
//----option1:"help"または"HELP"を入力すると一桁ずつ公開される------------
if(n.equals("help")||n.equals("HELP")){
k++;//1ターン罰
for(;;){
Random o=new Random(); // 公開される桁はランダム
int open=o.nextInt(4);
//4回以上使えない
if(help>=4){
System.out.println("これ以上helpは使えません。");
k--;//罰を取り消す
break;
}
//まだ公開されていない桁を探す
if(openD[open]==tempopen[open]){
continue;
}
openD[open]=tempopen[open];
System.out.print(k+":The answer is...");
System.out.println(openD[0]+""+openD[1]+""+openD[2]+""+openD[3]);
help++;//help使用回数加算
k++;//解答回数加算
break;
}
continue;
}
//--------------------------------------------------------------------------
//入力された文字列からMooNumberを作る。例外を処理する。
try{
MooNumber MN2 = new MooNumber(n);
System.out.print(k+":"+MN1.getBull(MN2)+"B");
System.out.println(MN1.getCow(MN2)+"C");
//正解の時はプログラムを終了する。
if(MN1.getBull(MN2) == 4){
break;
}
k++;
}
// 例外が出たときはメッセージを出力する。
catch(Exception e){
System.out.println("Moo Numberではありません。");
}
}
// 解答回数を表示して終了。
System.out.print("Correct answer in "+k+".");
// option2
if(k<=4){
System.out.println(" ヾ(≧▽≦)ノ Excellent!!!");
}else if(k>=5 && k<= 7){
System.out.println(" (^▽^) Great!!");
}else if(k>=8 && k<= 10){
System.out.println(" (^ー^) Good!");
}else if(k>=11 && k<=15){
System.out.println(" (-_-) Bad.");
}else{
System.out.println(" (T_T) Poor...");
}
}
}
helpと入力すると,1桁だけ教えてくれるという妙な機能を実装しています.
質問,気のついた点
-
int num[]=new int[4];//int num[4];ではだめなんですか?
C, C++など多くの言語では配列の宣言時に大きさ(添字の最大値)を指定
しますが,Java言語では大きさを指定せずに宣言します.そのため,初期化を
伴う場合も,
int num[4];
のような書き方はできません.
-
//何回質問したかを変数iによってカウントする。
i=++i;
上の式は,
//何回質問したかを変数iによってカウントする。
++i;
と書き直すことができます.なお,
//何回質問したかを変数iによってカウントする。
i++;
でも同じです.
-
繰り返しはdo-while文で記述しています。
終了条件をwhile(Mnum1.getBull(Mnum2)<4)で記述した方がスマートだと思ったんですが、コンパイル時に「変数 Mnum2 は初期化されていない可能性があります。」というエラーが出てしまったので、Bull数をモニターするための変数として新しく自然数tを定義しています。
これは,Mnum2がtry文の中で代入されていることによるのでしょう.このエラー
を出さなくするには,
MooNumber Mnum2=null;
のように,宣言時に「null」(オブジェクト型の変数にnullを代入すると,そ
の変数に何も入っていないことを意味して,参照するとNullPointerException
が生ずる)を明示的に入れるとよいでしょう.