ブルズアンドカウズゲーム。パート1

こんにちは!検疫は実り多いものであり、タイムキラーなおもちゃ「ブルズアンドカウズ」を書くことにしました。ゲームはそれほど難しくはありませんが、非常に興味深いものです。通常、ゲームは推測する必要がある4つの数字を使用します。コンピューターは番号を推測し、ユーザーは4つの番号を入力します。ユーザーの番号の数字が非表示の番号の位置と一致する場合、これは雄牛ですが、その場所にない場合は牛です。より詳細なルールはインターネットで簡単に見つけることができます。このパートでは、バックエンドを扱います。将来的には、ユーザーの数を推測してフロントエンドを追加します。おそらくそれだけです。さあ、始めましょう!



まず、プログラムのすべての作業を担当するBackEndクラスを作成しました。フィールドがあります:



    private int length;             // 
    private int[] mas;              //  
    private int[] inputArray;       //,  


アイデアは次のとおりです。コンピューターは長さの長さの数マスを生成し、ユーザーは数inputArrayを入力して、雄牛と牛の数を確認します。その後、勝つか、プレーを続けます。まず、mas配列を出力して番号を確認し、コードをデバッグします。次に、この行を削除します。任意の長さの配列の出力を書いてみましょう:



    private void printMas(int[] mas) {
        for (int i = 0; i < length; i++) {
            System.out.print(mas[i] + "   ");
        }
    } 


このメソッドに配列を渡し、forループを介して出力します。フィールドを介して実行することもできますが、最初にmasを出力し、次にinputArrayを出力するため、これを実行することにしました。



次に、番号生成を作成する必要があります。これは標準の機能で行うことができますが、数字に異なる桁が必要であることを忘れないでください。これは、番号45566が機能しないことを意味しますが、45367はちょうどいいでしょう。数字を検証してそのような数を生成する方法を書いてみましょうが、最初に、ユーザーが数を推測したい期間を調べましょう。



private void getMas() {
        Scanner scanner = new Scanner(System.in);
        do {
            System.out.println("    1  10");
            while (!scanner.hasNextInt()) {
                System.out.println(" ");
                scanner.next();
            }
            length = scanner.nextInt();
        } while (length <= 0 || length > 10);
        setMas(createMas());
    }


コンソールから番号を取得するためのスキャナーオブジェクトを作成します。次に、dowhile事後条件付きのループを使用します。なぜこれが少し後であるのかを説明します。ループの本体には、whileループがあります。これは、分数や文字などではなく、数字がコンソールに入力されていることを確認するために使用されます。番号がコンソールに入力されていることを確認した後、その値を長さで書き込みます。そして今、do while postconditionを使用して、それが間隔[0,10)に属していることを確認します。間隔に含まれていない番号が入力された場合は、再度長さの入力を求められます。番号が一度に正しく入力された場合、createMasメソッドを使用して番号を生成し、masフィールドの値を変更します。



 public void setMas(int[] mas) {
        this.mas = mas;
    }


private int[] createMas() {
        int[] arr = new int[length];
        for (int i = 0; i < this.length; i++) {
            arr[i] = (int) (Math.random() * 10);
        }
        boolean checkMas = false;
        while (!checkMas) {
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr.length; j++) {
                    if (i != j) {
                        if (arr[i] == arr[j]) {
                            arr[j] = (int) (Math.random() * 10);
                        }
                    }

                }
            }


            boolean check = false;
            for (int i = 0; i < arr.length && !check; i++) {
                for (int j = 0; j < arr.length && !check; j++) {

                    if (i != j) {
                        if (arr[i] == arr[j]) {
                            check = true;
                            checkMas = false;
                        } else checkMas = true;
                    }
                }
            }

        }
        return arr;
    }


createMasがどのように機能するかを説明しましょう。まず、長さ長さの配列を作成し、間隔[0,10)からのランダムな数値で埋めます。 Math.random()は、間隔[0,1)からランダムな数値を生成し、それに10を掛けると、間隔[0,10)の数値が得られます。これで、ランダムな数字で構成される配列arrができました。次のステップは、繰り返し番号がないかチェックすることです。私はこれをブール変数を使用して行うことにしました。まず、各要素をそれぞれと比較し、一致する場合は、比較する要素をランダムな番号で変更します。すべての要素を比較した後、数字の一意性について配列をチェックします。このために、チェック変数も作成しました。次に、各要素をそれぞれと比較します。 2つの同一の要素が見つかった場合は、比較のためにを終了します(!チェックはfalseを返し、ループは終了するため)、forループに戻って、同じ番号を変更します。配列内のすべての数値が異なると、checkMas変数がtrueになり、配列チェックが終了します。ここで、arr配列を返し、フィールドmas = arrにします。



これで、コンピューターで考案された番号ができました。ユーザーによるこの数の推測を実装しましょう。これを行うには、checkInputメソッドを記述しましょう。



private void checkInput() {
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[length];
        if (length == 1) System.out.println(" " + length + "   ");
        else {
            if (length > 1 && length < 5) {
                System.out.println(" " + length + "   ");
            } else {
                if (length > 4 && length < 11) {
                    System.out.println(" " + length + "   ");
                }
            }
        }
        boolean checkMas = false;
        while (!checkMas) {
            for (int i = 0; i < length; i++) {
                do {
                    System.out.println("  ");
                    while (!scanner.hasNextInt()) {
                        System.out.println(" ");
                        scanner.next();
                    }
                    arr[i] = scanner.nextInt();
                    if(arr[i] < 0 || arr[i]>=10) System.out.println("   0  9 ");
                } while (arr[i] < 0 || arr[i] >= 10);
            }
            
            boolean check = checkInputArray(arr);
            if (check) {
                checkMas = true;
            } else {
                System.out.println("    ");
                System.out.println("  ");
            }
        }
        setInputArray(arr);

    }


同様に、長さ長さのスキャナーと補助アレイarrを作成します。次は、数字とフレーズを一致させるだけの責任がある一連のifです。それらの後に、ユーザーの番号の直接入力と検証があります。ユーザーとの論理の不一致がないように、ユーザーが各番号を個別に入力するようにすることにしました。



for (int i = 0; i < length; i++) {
                do {
                    System.out.println("  ");
                    while (!scanner.hasNextInt()) {
                        System.out.println(" ");
                        scanner.next();
                    }
                    arr[i] = scanner.nextInt();
                    if(arr[i] < 0 || arr[i]>=10) System.out.println("   0  9 ");
                } while (arr[i] < 0 || arr[i] >= 10);
            }


番号を入力して確認するのは、コードのこのセクションです。作業は配列の長さを入力するのと似ているので、説明する理由はありません。次に、ユーザー配列に同じ番号が存在するかどうかがチェックされます。これを行うには、checkInputArrayメソッドを記述しましょう。



private boolean checkInputArray(int[] arr) {
        boolean checkMas = false;
        boolean check = false;
        for (int i = 0; i < arr.length && !check; i++) {
            for (int j = 0; j < arr.length && !check; j++) {

                if (i != j) {
                    if (arr[i] == arr[j]) {
                        check = true;
                        checkMas = false;
                    } else checkMas = true;
                }
            }
        }
        return checkMas;
    }


チェックは非表示の配列のチェックに似ているので、ここでは詳しく説明しません。ユーザーの番号に重複する番号が含まれている場合は、番号全体を再入力するようにお願いします。正しく入力されるまで、以下同様です。次に、inputArrayフィールドの値を補助配列arrに変更します。念のため、コードを示します。



public void setInputArray(int[] inputArray) {
        this.inputArray = inputArray;
    }


この時点で、非表示配列と入力配列の2つの配列があります。ユーザーが見つけた雄牛の数と牛の数を調べる時が来ました。



これは、checkCowAndBullメソッドを使用して確認します。



private int[] checkCowAndBull() {
        int[] arr = new int[2];
        int cow = 0;
        int bull = 0;
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length; j++) {

                if (mas[i] == inputArray[j]) {
                    if (i == j) bull++;
                    else cow++;
                }
            }
        }
        arr[0] = cow;
        arr[1] = bull;
        return arr;
    }


補助的な2要素配列を作成します。 1つ目は牛の数、2つ目は雄牛の数です。次に、要素を比較しながら、両方の配列を繰り返し処理します。要素が等しく、それらのインデックスが等しい場合は、雄牛の数を増やします。そうでない場合は、牛の数を増やします。その後、値を配列に書き込んで返します。



いつもBackEndクラスのコンストラクターに何があったのかを理解する時が来ました。



public BackEnd() {
        getMas();
        //printMas(mas);
        boolean win = false;
        while (!win) {
            checkInput();
            System.out.println(" :");
            printMas(inputArray);
            System.out.println();
            int[] arr = checkCowAndBull();
            if (arr[1] == length) {
                win = true;
                System.out.println("!  !");
            } else {
                System.out.println("   " + arr[0] + " , " + arr[1] + " ");
                System.out.println("  ");
            }
        }
    }


まず、目的の配列を生成します。デバッグ用に出力しましたが、ゲームにはこの機能は必要ありません。ユーザーがどの試行から番号を推測するかわからないため、適切な時点までwhileループを開始します。次に、ユーザーに番号を入力し、入力した配列を表示して、雄牛と牛の数を確認するように求めます。雄牛の数が配列の長さと一致する場合、その数は推測され、ゲームは終了します。それ以外の場合は、雄牛と牛の数が表示され、ゲームが続行されます。



残っているのは、クラスのインスタンスの作成をmanに追加することだけです。



public class main {
    public static void main(String[] args) {
        BackEnd bk = new BackEnd();
    }
}


起動、チェック、再生します。



ご清聴ありがとうございました。第2部はもうすぐ公開されます。



All Articles