بادئ ذي بدء ، قمت بإنشاء فئة 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();
}
}
نبدأ ، نتحقق ، نلعب.
شكرا لاهتمامكم ، الجزء الثاني سيأتي قريبا.