JavaRush /جاوا بلاگ /Random-SD /سيڪشن "راندين" جاوا رش تي: مفيد نظريو

سيڪشن "راندين" جاوا رش تي: مفيد نظريو

گروپ ۾ شايع ٿيل
JavaRush جي ”گيمز“ سيڪشن ۾ توهان کي مشهور ڪمپيوٽر گيمز لکڻ لاءِ دلچسپ پروجيڪٽ ملندا. ڇا توھان توھان چاھيو ٿا توھان جو پنھنجو نسخو ٺاھيو مشهور "2048"، "سيپر"، "سانپ" ۽ ٻيون رانديون؟ اهو سادو آهي. اسان راند لکڻ کي هڪ قدم قدم واري عمل ۾ تبديل ڪيو آهي. بابپنهنجو پاڻ کي گيم ڊولپر جي حيثيت سان آزمائڻ لاءِ، توهان کي ترقي يافته پروگرامر نه هجڻ گهرجي، پر جاوا علم جو هڪ خاص سيٽ اڃا به گهربل آهي. هتي توهان کي معلومات ملندي جيڪا ڪارائتي ٿيندي جڏهن رانديون لکڻ .

1. وراثت

JavaRush گيم انجڻ سان ڪم ڪرڻ ۾ وراثت استعمال ڪرڻ شامل آهي. پر جيڪڏهن توهان کي خبر ناهي ته اهو ڇا آهي؟ هڪ طرف، توهان کي هن موضوع کي سمجهڻ جي ضرورت آهي: اهو سطح 11 تي اڀياس ڪيو ويو آهي . ٻئي طرف، انجڻ عمدي طور تي ٺهيل هئي بلڪل سادي، تنهنڪري توهان حاصل ڪري سگهو ٿا وراثت جي سطحي ڄاڻ سان. پوء، وراثت ڇا آهي؟ ان کي بلڪل سادو رکڻ لاء، وراثت ٻن طبقن جي وچ ۾ تعلق آهي. انهن مان هڪ والدين بڻجي ويندو آهي، ۽ ٻيو ٻار بڻجي ويندو آهي (جانشين طبقي). ان صورت ۾، والدين طبقي کي شايد خبر ناهي ته اهو نسلي طبقو آهي. اهي. اهو وارث طبقن جي موجودگي مان ڪو خاص فائدو حاصل نٿو ڪري. پر وراثت هڪ نسلي طبقي کي ڪيترائي فائدا فراهم ڪري ٿي. ۽ سڀ کان اهم اهو آهي ته والدين طبقي جا سڀئي متغير ۽ طريقا ٻار ڪلاس ۾ ظاهر ٿين ٿا، ڄڻ ته والدين طبقي جو ڪوڊ چائلڊ ڪلاس ۾ نقل ڪيو ويو آهي. اهو مڪمل طور تي درست ناهي، پر وراثت جي هڪ آسان سمجهه لاء اهو ڪندو. وراثت کي بهتر سمجهڻ لاءِ هتي ڪجهه مثال آهن. مثال 1: آسان ترين وراثت.
public class Родитель {

}
چائلڊ ڪلاس والدين طبقي مان ورثي ۾ ملي ٿو extensions لفظ استعمال ڪندي .
public class Потомок extends Родитель {

}
مثال 2: والدين طبقي جي متغيرن کي استعمال ڪندي.
public class Родитель {

   public int age;
   public String name;
}
چائلڊ ڪلاس والدين طبقي جي عمر ۽ نالي جي متغيرن کي استعمال ڪري سگهي ٿو ڄڻ ته انهن کي ان ۾ اعلان ڪيو ويو آهي.
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(name+" "+age);
   }
}
مثال 3: والدين طبقي جا طريقا استعمال ڪرڻ.
public class Родитель {

   public int age;
   public String name;

   public getName() {
      return name;
   }
}
ٻار طبقو والدين طبقي جي متغيرن ۽ طريقن کي استعمال ڪري سگھي ٿو ڄڻ ته اھي ان ۾ بيان ڪيا ويا آھن. هن مثال ۾ اسان استعمال ڪري رهيا آهيون getName () طريقو.
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}
هي اهو آهي جيڪو Descendant طبقو مرتب ڪندڙ جي نقطي نظر کان نظر اچي ٿو:
public class Потомок extends Родитель {

   public int age; //  унаследованная переменная
   public String name; //  унаследованная переменная

   public getName() { //  унаследованный метод.
      return name;
  }
   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}

2. طريقو مٿانهون ڪرڻ

ڪڏهن ڪڏهن اهڙيون حالتون به هونديون آهن جو اسان پنهنجي Descendant طبقي کي وراثت ۾ ڪجهه تمام مفيد Parent class کان ورثي ۾ مليا هوندا، جنهن ۾ سڀني متغيرن ۽ طريقن سان گڏ، پر ڪجهه طريقا ائين ڪم نه ڪندا آهن جيئن اسان چاهيون ٿا. يا بلڪل نه ان طريقي سان جيڪو اسان نٿا چاهيون. هن صورتحال ۾ ڇا ڪجي؟ اسان هڪ طريقو ختم ڪري سگهون ٿا جيڪو اسان پسند نه ڪندا آهيون. اهو بلڪل سادو ڪيو ويو آهي: اسان جي Descendant ڪلاس ۾ اسان صرف هڪ طريقي جو اعلان ڪريون ٿا ساڳئي دستخط سان (هيڊر) والدين طبقي جو طريقو ۽ ان ۾ پنهنجو ڪوڊ لکو. مثال 1: طريقو اوور رائڊنگ.
public class Родитель {

   public String name;

   public void setName (String nameNew) {
       name = nameNew;
  }

   public getName() {
      return name;
  }
}
printInfo() طريقو جملي کي پرنٽ ڪندو "لوقا، نه!!!"
public class Потомок extends Родитель {

   public void setName (String nameNew) {
       name = nameNew + ",No!!!";
  }

   public void printInfo() {

      setName("Luke");
      System.out.println( getName());
   }
}
هي اهو آهي جيڪو Descendant طبقو مرتب ڪندڙ جي نقطي نظر کان نظر اچي ٿو:
public Потомок extends Родитель {

   public String name; //  унаследованная переменная

   public void setName (String nameNew) { //  Переопределенный метод взамен унаследованного

       name = nameNew + ", No!!!";
   }
   public getName() { //  унаследованный метод.

      return name;
   }
   public void printInfo() {

     setName("Luke");
     System.out.println(getName());
   }
}
مثال 2: وراثت جو ٿورڙو جادو (۽ طريقو ختم ڪرڻ).
public class Родитель {

   public getName() {
      return "Luke";
  }
   public void printInfo() {

     System.out.println(getName());
   }
}
public class Потомок extends Родитель {

   public getName() {
      return "I'm your father, Luke";
  }
}
هن مثال ۾: جيڪڏهن هڪ طريقو printInfo(پيرنٽ ڪلاس کان) Descendant طبقي ۾ ختم نه ڪيو ويو آهي، جڏهن هن طريقي کي Descendant طبقي جي اعتراض تي سڏيو ويندو آهي، ان جو طريقو سڏيو ويندو getName()، ۽ getName()والدين طبقي نه.
Родитель parent = new Родитель ();
parent.printnInfo();
هي ڪوڊ اسڪرين تي لکت "لوقا" ڏيکاري ٿو .
Потомок child = new Потомок ();
child.printnInfo();
هي ڪوڊ لکت ڏيکاري ٿو "مان توهان جو پيء آهيان، لوقا؛" .
هي اهو آهي جيڪو Descendant طبقو مرتب ڪندڙ جي نقطي نظر کان نظر اچي ٿو:
public class Потомок extends Родитель {

   public getName() {
      return "I'm your father, Luke";
   }
   public void printInfo() {

     System.out.println(getName());
   }
}

3. لسٽون

جيڪڏهن توهان اڃا تائين لسٽون نه مليون آهن، هتي هڪ تڪڙو پرائمر آهي. توهان JavaRush ڪورس جي سطح 6-7 تي مڪمل معلومات حاصل ڪري سگهو ٿا . لسٽن ۾ صفن سان تمام گھڻو عام آھي:
  • هڪ خاص قسم جي ڊيٽا جو تمام گهڻو ذخيرو ڪري سگهو ٿا؛
  • توهان کي انهن جي انڊيڪس/نمبر ذريعي عناصر کي ٻيهر حاصل ڪرڻ جي اجازت ڏيو؛
  • عنصر انڊيڪس 0 تي شروع ٿئي ٿو.
لسٽن جا فائدا: صفن جي برعڪس، لسٽون متحرڪ طور تي سائيز کي تبديل ڪري سگھن ٿيون. ٺاھڻ کان فوري پوءِ، لسٽ ۾ 0 جي ماپ آھي. جيئن توھان لسٽ ۾ عناصر شامل ڪندا آھيو، ان جي سائيز وڌي ويندي آھي. هڪ فهرست ٺاهڻ جو مثال:
ArrayList<String> myList = new ArrayList<String>(); // создание нового списка типа ArrayList
زاويه بریکٹ ۾ قيمت ڊيٽا جو قسم آهي جيڪا فهرست محفوظ ڪري سگهي ٿي. هتي فهرست سان ڪم ڪرڻ لاء ڪجهه طريقا آهن:
ڪوڊ ڪوڊ جو مختصر بيان
ArrayList<String> list = new ArrayList<String>(); تارن جي نئين لسٽ ٺاهيندي
list.add("name"); فهرست جي آخر ۾ هڪ عنصر شامل ڪريو
list.add(0, "name"); فهرست جي شروعات ۾ هڪ عنصر شامل ڪريو
String name = list.get(5); ان جي انڊيڪس ذريعي هڪ عنصر حاصل ڪريو
list.set(5, "new name"); تبديل ڪريو عنصر ان جي انڊيڪس ذريعي
int count = list.size(); ھڪڙي فهرست ۾ عناصر جو تعداد حاصل ڪريو
list.remove(4); ھڪڙي شيء کي ھڪڙي فهرست مان هٽايو
توھان انھن مضمونن مان فهرستن بابت وڌيڪ سکو سگھو ٿا:
  1. ArrayList ڪلاس
  2. تصويرن ۾ ڪم ڪندڙ ArrayList
  3. ArrayList مان هڪ عنصر کي هٽائڻ

4. صفون

هڪ ميٽرڪس ڇا آهي؟ هڪ ميٽرڪس هڪ مستطيل ٽيبل کان وڌيڪ ٻيو ڪجهه ناهي جيڪو ڊيٽا سان ڀريو وڃي. ٻين لفظن ۾، اهو هڪ ٻه-dimensional صف آهي. جئين توھان ڄاڻو ٿا، جاوا ۾ صفون شيون آھن. هڪ معياري هڪ-dimensional صف جو قسم intهن طرح نظر اچي ٿو:
int [] array = {12, 32, 43, 54, 15, 36, 67, 28};
اچو ته ان کي بصري طور تصور ڪريون:
0 1 2 3 4 5 6 7
12 32 43 54 15 36 67 28
مٿين لائن سيل پتي کي ظاهر ڪري ٿو. اهو آهي، نمبر 67 حاصل ڪرڻ لاء، توهان کي انڊيڪس 6 سان سري عنصر تائين رسائي جي ضرورت آهي:
int number = array[6];
هتي هر شيء بلڪل سادي آهي. هڪ ٻه-dimensional array هڪ-dimensional arrays جو هڪ صف آهي. جيڪڏهن اهو توهان جو پهريون ڀيرو هن بابت ٻڌو آهي، روڪيو ۽ ان کي پنهنجي سر ۾ تصوير ڏيو. هڪ ٻه-dimensional صف هن طرح ڪجهه ڏسڻ ۾ اچي ٿو:
0 هڪ طرفي صف هڪ طرفي صف
1 هڪ طرفي صف
2 هڪ طرفي صف
3 هڪ طرفي صف
4 هڪ طرفي صف
5 هڪ طرفي صف
6 هڪ طرفي صف
7 هڪ طرفي صف
ڪوڊ ۾:
int [][] matrix = {
{65, 99, 87, 90, 156, 75, 98, 78}, {76, 15, 76, 91, 66, 90, 15, 77}, {65, 96, 17, 25, 36, 75, 54, 78}, {59, 45, 68, 14, 57, 1, 9, 63}, {81, 74, 47, 52, 42, 785, 56, 96}, {66, 74, 58, 16, 98, 140, 55, 77}, {120, 99, 13, 90, 78, 98, 14, 78}, {20, 18, 74, 91, 96, 104, 105, 77} }
0 0 1 2 3 4 5 6 7
65 99 87 90 156 75 98 78
1 0 1 2 3 4 5 6 7
76 15 76 91 66 90 15 77
2 0 1 2 3 4 5 6 7
65 96 17 25 36 75 54 78
3 0 1 2 3 4 5 6 7
59 45 68 14 57 1 9 63
4 0 1 2 3 4 5 6 7
81 74 47 52 42 785 56 96
5 0 1 2 3 4 5 6 7
66 74 58 16 98 140 55 77
6 0 1 2 3 4 5 6 7
120 99 13 90 78 98 14 78
7 0 1 2 3 4 5 6 7
20 18 74 91 96 104 105 77
قيمت 47 حاصل ڪرڻ لاء، توهان کي [4] [2] تي ميٽرڪس عنصر تائين رسائي جي ضرورت آهي.
int number = matrix[4][2];
جيڪڏهن توهان نوٽيس ڪيو ته ميٽرڪس ڪوآرڊينيٽس ڪلاسيڪل مستطيل ڪوآرڊينيٽ سسٽم (Cartesian coordinate system) کان مختلف آهن. ميٽرڪس تائين پهچندي، توهان پهرين y ۽ پوءِ x بيان ڪريو ٿا ، جڏهن ته رياضي ۾ اهو عام آهي ته x (x، y) کي پهريون بيان ڪيو وڃي. توهان شايد پنهنجو پاڻ کان پڇي رهيا آهيو، "ڇو نه توهان جي تخيل ۾ ميٽرڪس کي ريورس ڪريو ۽ عناصر کي معمولي طريقي سان (x، y) ذريعي پهچايو؟ اهو ميٽرڪس جي مواد کي تبديل نه ڪندو. ها، ڪجھ به تبديل نه ٿيندو. پر پروگرامنگ جي دنيا ۾، "پهرين y، پوء x" جي شڪل ۾ ميٽرڪس ڏانهن اشارو ڪرڻ جو رواج آهي. اها ڳالهه مڃڻ گهرجي. هاڻي اچو ته ميٽرڪس کي پنهنجي انجڻ (ڪلاس Game) تي پروجيڪٽ ڪرڻ بابت ڳالهايون. جيئن توهان کي خبر آهي، انجڻ وٽ ڪيترائي طريقا آهن جيڪي ڏنل همراهن تي راند جي ميدان جي سيلن کي تبديل ڪن ٿا. مثال طور، جي setCellValue(int x, int y, String value). اهو هڪ خاص سيل سيٽ ڪري ٿو همراهڪن سان (x، y) قدر ڏانهن value. جيئن توهان محسوس ڪيو، هي طريقو پهريون ڀيرو بلڪل x وٺندو آهي، جيئن ڪلاسيڪل ڪوآرڊينيٽ سسٽم ۾. باقي انجڻ جا طريقا ساڳي طرح ڪم ڪن ٿا. جڏهن راندين کي ترقي ڪندي، اڪثر ڪري اسڪرين تي ميٽرڪس جي حالت کي ٻيهر پيدا ڪرڻ جي ضرورت پوندي. اهو ڪيئن ڪجي؟ پهرين، هڪ لوپ ۾ توهان کي ميٽرڪس جي سڀني عناصر ذريعي ٻيهر ڪرڻ جي ضرورت آهي. ٻيو، انهن مان هر هڪ لاء، INVERTED همراهن سان ڊسپلي ڪرڻ لاء هڪ طريقو ڪال ڪريو. مثال:
private void drawScene() {
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[i].length; j++) {
            setCellValue(j, i, String.valueOf(matrix[i][j]));
        }
    }
}
قدرتي طور، ڦيرو ٻن طرفن ۾ ڪم ڪري ٿو. setCellValueتوهان پاس ڪري سگهو ٿا (i، j) طريقي سان ، پر ساڳئي وقت ۾ عنصر [j][i] کي ميٽرڪس مان وٺو. ڦيرڦار ٿورڙي مشڪل لڳي سگھي ٿي، پر اھو ذهن ۾ رکڻ لاء ڪجھھ آھي. ۽ هميشه، جيڪڏهن ڪو مسئلو پيدا ٿئي ٿو، اهو هڪ قلم سان ڪاغذ جو هڪ ٽڪرو کڻڻ جي قابل آهي، هڪ ميٽرڪس ڊرائنگ ۽ ٻيهر پيدا ڪرڻ جو ڪهڙو عمل ان سان ٿي رهيو آهي.

5. بي ترتيب نمبر

بي ترتيب نمبر جنريٽر سان ڪيئن ڪم ڪجي؟ ڪلاس Gameهڪ طريقو بيان ڪري ٿو getRandomNumber(int). هود جي تحت، اهو Randomjava.util پيڪيج مان هڪ ڪلاس استعمال ڪري ٿو، پر اهو بي ترتيب نمبر جنريٽر سان ڪم ڪرڻ جي اصول کي تبديل نٿو ڪري. getRandomNumber(int)انٽيجر کي هڪ دليل طور وٺي ٿو. اهو نمبر مٿيون حدون هوندو جيڪو جنريٽر واپس ڪري سگهي ٿو. هيٺين حد 0 آهي. اهم! جنريٽر ڪڏهن به اپر بائونڊ نمبر واپس نه ڪندو. مثال طور، جيڪڏهن getRandomNumber(3)بي ترتيب سڏيو وڃي ته اهو 0، 1، 2 واپس ڪري سگهي ٿو. جيئن توهان ڏسي سگهو ٿا، اهو 3 واپس نٿو ڪري سگهي. جنريٽر جو هي استعمال بلڪل سادو آهي، پر ڪيترن ئي ڪيسن ۾ تمام گهڻو اثرائتو آهي. توهان کي ڪجهه حدن اندر بي ترتيب نمبر حاصل ڪرڻ جي ضرورت آهي: تصور ڪريو ته توهان کي ڪجهه ٽن عددي نمبر جي ضرورت آهي (100..999). جيئن توهان اڳ ۾ ئي ڄاڻو ٿا، گهٽ ۾ گهٽ واپسي نمبر 0 آهي، تنهنڪري، توهان کي ان ۾ 100 شامل ڪرڻ جي ضرورت پوندي. پر هن صورت ۾، توهان کي خيال رکڻو پوندو ته مٿين حد کان وڌيڪ نه. 999 جي وڌ ۾ وڌ بي ترتيب قيمت حاصل ڪرڻ لاءِ، توھان کي 1000 جي دليل سان طريقي کي سڏڻ گھرجي. getRandomNumber(int)پر اسان کي 100 جي ايندڙ اضافو بابت ياد آھي: ھن جو مطلب آھي ته مٿئين حد کي 100 کان گھٽ ڪيو وڃي. اھو آھي، حاصل ڪرڻ لاءِ ڪوڊ. بي ترتيب ٽي عددي نمبر هن طرح نظر ايندو:
int number = 100 + getRandomNumber(900);
پر اهڙي طريقي کي آسان ڪرڻ لاء، انجڻ هڪ طريقو مهيا ڪري ٿو getRandomNumber(int, int)جيڪو گهٽ ۾ گهٽ نمبر وٺي ٿو واپسي لاء پهريون دليل جي طور تي. هن طريقي کي استعمال ڪندي، پوئين مثال ٻيهر لکي سگهجي ٿو:
int number = getRandomNumber(100, 1000);
بي ترتيب انگ اکر حاصل ڪرڻ لاءِ استعمال ڪري سگھجن ٿا بي ترتيب صف جي عنصر:
String [] names = {"Andrey", "Валентин", "Сергей"};
String randomName = names[getRandomNumber(names.length)]
ڪجهه واقعن کي هڪ خاص امڪان سان ٽڪرائڻ. هڪ شخص جي صبح ممڪن منظرن جي مطابق شروع ٿئي ٿي: اوور ننڊ - 50٪؛ وقت تي اٿيو - 40٪؛ توقع کان هڪ ڪلاڪ اڳ اٿيو - 10٪. تصور ڪريو ته توھان لکي رھيا آھيو انساني صبح جو ايموليٽر. توھان کي ھڪڙي خاص امڪان سان واقعن کي ٽڪرائڻ جي ضرورت آھي. هن کي ڪرڻ لاء، ٻيهر، توهان کي استعمال ڪرڻ جي ضرورت آهي بي ترتيب نمبر جنريٽر. لاڳو ڪرڻ مختلف ٿي سگهي ٿو، پر آسان هڪ کي هيٺين الگورتھم جي پيروي ڪرڻ گهرجي:
  1. اسان حدون مقرر ڪيون ٿا جن جي اندر نمبر پيدا ٿيڻ جي ضرورت آهي؛
  2. هڪ بي ترتيب نمبر ٺاهي؛
  3. اسان نتيجو نمبر تي عمل ڪريون ٿا.
تنهن ڪري، هن معاملي ۾، حد ٿي ويندي 10. اچو ته طريقي کي سڏين getRandomNumber(10)۽ تجزيو ڪريون ته اهو اسان ڏانهن واپس اچي سگهي ٿو. اهو 10 انگن کي واپس ڪري سگهي ٿو (0 کان 9 تائين) ۽ هر هڪ ساڳئي امڪان سان - 10٪. هاڻي اسان کي سڀني ممڪن نتيجن کي گڏ ڪرڻ ۽ انهن کي اسان جي ممڪن واقعن سان ملائڻ جي ضرورت آهي. توھان جي تخيل جي لحاظ کان، تمام گھڻا مجموعا ٿي سگھن ٿا، پر سڀ کان وڌيڪ پڌرو آواز: ”جيڪڏھن ھڪڙو بي ترتيب نمبر [0..4] جي اندر آھي - واقعي کي سڏيو ”اوورسليپ“، جيڪڏھن اھو نمبر [5..8] جي اندر آھي ] - ”اُٿ“ وقت تي، ۽ فقط جيڪڏهن انگ 9 آهي، ته پوءِ ”مان توقع کان هڪ ڪلاڪ اڳ اُٿان. هر شي بلڪل سادو آهي: [0..4] اندر 5 نمبر آهن، جن مان هر هڪ 10٪ جي امڪان سان واپس اچي سگهي ٿو، جيڪو مجموعي طور تي 50٪ ٿيندو. [5..8] جي اندر 4 نمبر آهن، ۽ 9 اهو واحد نمبر آهي جيڪو 10٪ جي امڪان سان ظاهر ٿئي ٿو. ڪوڊ ۾، هي سڄو هوشيار ڊيزائن اڃا به آسان نظر اچي ٿو:
int randomNumber = getRandomNumber(10);
if (randomNumber < 5) {
    System.out.println("Проспал ");
} else if (randomNumber < 9) {
    System.out.println("Встал вовремя ");
} else {
    System.out.println("Встал на час раньше положенного ");
}
عام طور تي، بي ترتيب نمبر استعمال ڪرڻ لاء ڪيترائي اختيار ٿي سگھن ٿا. اهو سڀ صرف توهان جي تخيل تي دارومدار. پر اهي تمام مؤثر طريقي سان استعمال ٿيندا آهن جيڪڏهن توهان کي بار بار ڪجهه نتيجو حاصل ڪرڻ جي ضرورت آهي. پوء اهو نتيجو اڳئين هڪ کان مختلف ٿيندو. ڪجهه امڪان سان، يقينا. اهو ئي سڀ ڪجهه آهي! جيڪڏهن توهان راندين جي سيڪشن بابت وڌيڪ سکڻ چاهيو ٿا، هتي ڪجهه مفيد دستاويز آهن جيڪي مدد ڪري سگهن ٿيون:
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION