لعبة الثيران والأبقار. الجزء 1

مرحبا! كان الحجر الصحي مثمرًا وقررت كتابة لعبة "الثيران والأبقار" القاتلة للوقت. اللعبة ليست بهذه الصعوبة ، لكنها ممتعة للغاية. عادة ما تستخدم اللعبة 4 أرقام يجب تخمينها. يقوم الكمبيوتر بتخمين الرقم ، يقوم المستخدم بإدخال 4 أرقام ، إذا تطابق الرقم الموجود في رقم المستخدم في موضعه مع الموضع في الرقم المخفي ، فهذا ثور ، ولكن إذا لم يكن في مكانه فهو بقرة. من السهل العثور على قواعد أكثر تفصيلاً على الإنترنت. في هذا الجزء ، سنتعامل مع BackEnd ، في المستقبل سنضيف FrontEnd ، تخمين رقم المستخدم ، وربما هذا كل شيء. حسنًا ، لنبدأ!



بادئ ذي بدء ، قمت بإنشاء فئة BackEnd التي ستكون مسؤولة عن جميع أعمال البرنامج. لها مجالات:



    private int length;             // 
    private int[] mas;              //  
    private int[] 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());
    }


نقوم بإنشاء كائن ماسح ضوئي نحصل من خلاله على الرقم من وحدة التحكم. بعد ذلك ، نستخدم حلقة مع فعل أثناء حالة ما بعد الشرط. سأشرح لماذا هذا بعد قليل. في جسم الحلقة ، نرى حلقة while. يتم استخدامه للتحقق من إدخال رقم في وحدة التحكم ، وليس كسرًا ، أو أحرفًا ، إلخ. بعد أن نتحقق من إدخال الرقم في وحدة التحكم ، نكتب قيمته في الطول. والآن ، باستخدام الأمر do أثناء الشرط اللاحق ، نتحقق من أنه ينتمي إلى الفترة [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 ، والتي تتكون من أرقام عشوائية. الخطوة التالية هي التحقق من تكرار الأرقام. قررت القيام بذلك باستخدام المتغيرات المنطقية. أولاً ، نقارن كل عنصر بكل عنصر ، وإذا كان هناك تطابق ، فقم بتغيير العنصر الذي نقارنه برقم عشوائي. بعد أن قارنا جميع العناصر ، نتحقق من المصفوفة للتأكد من تفرد الأرقام. لهذا ، قمت أيضًا بإنشاء متغير الشيك. ثم نقارن كل عنصر بكل عنصر. إذا وجدنا عنصرين متطابقين ، فقم بالخروج للمقارنة (حيث سيعود التحقق خطأ وستنتهي الحلقات) ،والعودة إلى حلقات for لتغيير نفس الأرقام. بعد اختلاف جميع الأرقام في المصفوفة ، يصبح متغير checkMas صحيحًا وينتهي فحص المصفوفة. الآن نعيد المصفوفة 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);

    }


وبالمثل ، نقوم بإنشاء ماسح ضوئي ومجموعة مساعدة بطول الطول. بعد ذلك تأتي مجموعة من ifs ، والتي لا تكون مسؤولة عن أكثر من مطابقة رقم وعبارة. بعدهم هناك إدخال مباشر والتحقق من رقم المستخدم. حتى لا يكون هناك خلاف في المنطق مع المستخدم ، قررت أن أجعله حتى يقوم المستخدم بإدخال كل رقم على حدة.



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


في هذه المرحلة ، لدينا مصفوفتان: المصفوفة المخفية ومصفوفة الإدخال. حان الوقت لمعرفة عدد الثيران وعدد الأبقار التي وجدها المستخدم.



سنكتشف ذلك باستخدام طريقة 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;
    }


نقوم بإنشاء مصفوفة مكونة من عنصرين إضافيين. الأول هو عدد الأبقار ، والثاني هو عدد الثيران. ثم نكرر كلتا المصفوفتين ، ونقارن بين العناصر. إذا كانت العناصر متساوية ومؤشراتها متساوية ، فإننا نزيد عدد الثيران ، وإلا فإننا نزيد عدد الأبقار. بعد ذلك نكتب القيم إلى المصفوفة ونعيدها.



حان الوقت لمعرفة ما كان في مُنشئ فئة 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 حتى اللحظة المناسبة. ثم نطلب من المستخدم إدخال رقمه ، وعرض الصفيف الذي تم إدخاله ، والتحقق من عدد الثيران والأبقار. إذا كان عدد الثيران يطابق طول المصفوفة ، فسيتم تخمين الرقم وتنتهي اللعبة. خلاف ذلك ، يتم عرض عدد الثيران والأبقار وتستمر اللعبة.



يبقى فقط لإضافة إنشاء مثيل للفئة للإنسان:



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


نبدأ ، نتحقق ، نلعب.



شكرا لاهتمامكم ، الجزء الثاني سيأتي قريبا.



All Articles