JavaRush /Java Blog /Random-TK /JavaRush-da "Oýunlar" bölümi: Peýdaly teoriýa

JavaRush-da "Oýunlar" bölümi: Peýdaly teoriýa

Toparda çap edildi
JavaRush-yň "Oýunlar" bölüminde meşhur kompýuter oýunlaryny ýazmak üçin gyzykly taslamalary tapyp bilersiňiz. Meşhur “2048”, “Sapper”, “akeylan” we beýleki oýunlaryň öz wersiýasyny döretmek isleýärsiňizmi? Bu ýönekeý. Oýun ýazuwyny ädimme-ädim öwrendik. BapÖzüňizi oýun oýnaýjy hökmünde synap görmek üçin ösen programmist bolmak hökman däl, ýöne belli bir Java bilimi talap edilýär. Bu ýerde oýun ýazanyňyzda peýdaly boljak maglumatlary tapyp bilersiňiz .

1. Miras

JavaRush oýun dwigateli bilen işlemek mirasy ulanmagy öz içine alýar. Itöne onuň nämedigini bilmeseň näme? Bir tarapdan, bu mowzuga düşünmeli: 11-nji derejede öwrenilýär . Başga bir tarapdan, hereketlendiriji bilkastlaýyn gaty ýönekeý dizaýn edildi, şonuň üçin miras barada ýüzleý bilim alyp bilersiňiz. Miras näme? Simplyönekeý söz bilen aýdylanda, miras iki synpyň arasyndaky gatnaşykdyr. Olaryň biri ene-atasy, ikinjisi çaga bolýar (mirasdüşer synpy). Bu ýagdaýda ene-atalar synpy onuň nesil synplarynyň bardygyny hem bilmezler. Bular. mirasdüşer synplarynyň bolmagyndan belli bir peýdany almaýar. Emma miras nesil synpyna köp artykmaçlyk berýär. Iň esasy, ene synpyň ähli üýtgeýjileriniň we usullarynyň çaga synpynda ene-atanyň kody çaga synpyna göçürilen ýaly peýda bolmagydyr. Bu düýbünden dogry däl, ýöne mirasa ýönekeý düşünmek üçin eder. Mirasa has gowy düşünmek üçin käbir mysallar. Mysal 1: iň ýönekeý miras.
public class Родитель {

}
Çaga synpy , giňeldilen açar söz ulanyp, Ene synpyndan miras alýar .
public class Потомок extends Родитель {

}
Mysal 2: Ene synp üýtgeýjilerini ulanmak.
public class Родитель {

   public int age;
   public String name;
}
Çaga synpy, ene-atalar synpynyň ýaş we at üýtgeýjilerini edil yglan edilişi ýaly ulanyp biler .
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(name+" "+age);
   }
}
Mysal 3: Ene-ata synp usullaryny ulanmak.
public class Родитель {

   public int age;
   public String name;

   public getName() {
      return name;
   }
}
Çaga synpy, ene-atalar synpynyň üýtgeýänlerini we usullaryny, edil yglan edilişi ýaly ulanyp biler. Bu mysalda getName () usulyny ulanýarys .
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}
Ine, nesil synpynyň düzüjiniň nukdaýnazaryndan görnüşi:
public class Потомок extends Родитель {

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

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

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

2. Usuly ýokaşdyrmak

Käwagt ähli üýtgeýänler we usullar bilen birlikde käbir peýdaly Ene synpyndan miras galan ýagdaýlarymyz bolýar, ýöne käbir usullar isleýşimiz ýaly işlemeýär. Ora-da asla islemeýän görnüşimizde däl. Bu ýagdaýda näme etmeli? Halamaýan usulymyzy ýok edip bileris. Bu gaty ýönekeý ýerine ýetirilýär: Nesil synpymyzda diňe ene-atanyň synp usuly bilen birmeňzeş gol (sözbaşy) usuly yglan edýäris we kodumyzy ýazýarys. Mysal 1: Usuly ýokaşdyrmak.
public class Родитель {

   public String name;

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

   public getName() {
      return name;
  }
}
PrintInfo () usuly "Luk, !!! ok !!!" sözlemini çap eder.
public class Потомок extends Родитель {

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

   public void printInfo() {

      setName("Luke");
      System.out.println( getName());
   }
}
Ine, nesil synpynyň düzüjiniň nukdaýnazaryndan görnüşi:
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());
   }
}
Mysal 2: mirasyň azajyk jadysy (we usuly ýok etmek).
public class Родитель {

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

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

   public getName() {
      return "I'm your father, Luke";
  }
}
Bu mysalda: printInfonesil synpynda bir usul (Ene-atalar synpyndan) ýok edilmese, bu usul nesil synpynyň obýektine çagyrylsa, ene-atalar synpy getName()däl-de, usuly atlandyrylar.getName()
Родитель parent = new Родитель ();
parent.printnInfo();
Bu kod ekranda "Luk" ýazgysyny görkezýär .
Потомок child = new Потомок ();
child.printnInfo();
Bu kod "Men seniň kakaň, Luka" diýen ýazgyny görkezýär . .
Ine, nesil synpynyň düzüjiniň nukdaýnazaryndan görnüşi:
public class Потомок extends Родитель {

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

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

3. Sanawlar

Sanawlary entek görmedik bolsaňyz, ine, çalt başlangyç. JavaRush kursynyň 6-7 derejeleri barada doly maglumat tapyp bilersiňiz . Sanawlaryň massiwler bilen köp umumylygy bar:
  • belli bir görnüşdäki köp maglumatlary saklap bilýär;
  • elementleri indeks / san boýunça almaga mümkinçilik berýär;
  • element görkezijileri 0-dan başlaýar.
Sanawlaryň artykmaçlyklary: Toplumlardan tapawutlylykda sanawlar ululygyny üýtgedip biler. Döredilenden dessine sanawyň ululygy 0 bolýar. Sanawa element goşsaňyz, ululygy ýokarlanýar. Sanaw döretmegiň mysaly:
ArrayList<String> myList = new ArrayList<String>(); // создание нового списка типа ArrayList
Burç ýaýlaryndaky baha sanawyň saklap bilýän maglumatlarynyň görnüşidir. Sanaw bilen işlemegiň käbir usullary:
Kod Kodyň näme edýändigi barada gysgaça düşündiriş
ArrayList<String> list = new ArrayList<String>(); Setirleriň täze sanawyny döretmek
list.add("name"); Sanawyň soňuna bir element goşuň
list.add(0, "name"); Sanawyň başyna bir element goşuň
String name = list.get(5); Indeksine görä element alyň
list.set(5, "new name"); Elementi indeks boýunça üýtgediň
int count = list.size(); Sanawdaky elementleriň sanyny alyň
list.remove(4); Sanawdan bir elementi aýyryň
Sanawlar barada has köp maglumat alyp bilersiňiz:
  1. ArrayList synpy
  2. Suratlarda işlemek ArrayList
  3. ArrayList-den elementi aýyrmak

4. Toplumlar

Matrisa näme? Matrisa maglumatlar bilen dolduryp boljak gönüburçly tablisadan başga zat däl. Başgaça aýdylanda, bu iki ölçegli massiwdir. Mümkin bilşiňiz ýaly, Java-daky massiwler obýektdir. Adaty bir ölçegli massiw görnüşi intşuňa meňzeýär:
int [] array = {12, 32, 43, 54, 15, 36, 67, 28};
Geliň muny wizual göz öňüne getireliň:
0 1 2 3 4 5 6 7
12 32 43 54 15 36 67 28
Topokarky setir öýjük salgylaryny görkezýär. 67agny, 67-nji belgini almak üçin 6-njy görkeziji bilen massiw elementine girmeli:
int number = array[6];
Bu ýerde hemme zat gaty ýönekeý. Iki ölçegli massiw, bir ölçegli massiwlerdir. Bu hakda ilkinji gezek eşidýän bolsaňyz, duruň we kelläňize surat beriň. Iki ölçegli massiw şuňa meňzeýär:
0 Bir ölçegli massiw Bir ölçegli massiw
1 Bir ölçegli massiw
2 Bir ölçegli massiw
3 Bir ölçegli massiw
4 Bir ölçegli massiw
5 Bir ölçegli massiw
6 Bir ölçegli massiw
7 Bir ölçegli massiw
Kodda:
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 bahasyny almak üçin matrisa elementine [4] [2] girmeli.
int number = matrix[4][2];
Üns berseňiz, matrisa koordinatlary nusgawy gönüburçly koordinat ulgamyndan (Kartezian koordinat ulgamy) tapawutlanýar. Matrisa gireniňizde ilki bilen y, soň bolsa x görkezýärsiňiz , matematikada ilki bilen x (x, y) kesgitlemek adaty zat. Özüňize: “Näme üçin hyýalyňyzdaky matrisany tersine öwrüp, elementlere adaty usulda (x, y) girip bilmersiňiz? Bu matrisanyň mazmunyny üýtgetmez "-diýdi. Hawa, hiç zat üýtgemez. Emma programmirleme dünýäsinde matrisalara “ilki y, soň x” görnüşinde ýüzlenmek adatydyr. Munuň üçin ähmiýet berilmeli däldir. Indi matrisany motorymyza (klasa) proýektirlemek barada gürleşeliň Game. Bilşiňiz ýaly, hereketlendirijide berlen koordinatlarda oýun meýdançasynyň öýjüklerini üýtgedýän köp usul bar. Mysal üçin setCellValue(int x, int y, String value). Koordinatlar (x, y) bilen belli bir öýjügi kesgitleýär value. Üns berşiňiz ýaly, bu usul ilki bilen nusgawy koordinat ulgamynda bolşy ýaly x alýar. Motoryň galan usullary hem edil şonuň ýaly işleýär. Oýunlar ösdürilende köplenç matrisanyň ýagdaýyny ekranda köpeltmek zerurlygy ýüze çykar. Muny nädip etmeli? Ilki bilen, aýlawda matrisanyň ähli elementlerini gaýtalamaly. Ikinjiden, olaryň her biri üçin INVERTED koordinatlary bilen görkezmegiň usulyna jaň ediň. Mysal:
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]));
        }
    }
}
Elbetde, inwersiýa iki ugurda işleýär. (I, j) usula setCellValuegeçip bilersiňiz , ýöne şol bir wagtyň özünde [j] [i] elementini matrisadan alyň. Terslik birneme kyn ýaly bolup görünmegi mümkin, ýöne ýatda saklamaly zat. Hemişe, haýsydyr bir mesele ýüze çyksa, ruçka bilen kagyz alyp, matrisa çyzyp, oňa nämeleriň bolup geçýändigini köpeltmeli.

5. Tötänleýin sanlar

Tötänleýin generator bilen nädip işlemeli? Synp Gameusuly kesgitleýär getRandomNumber(int). Kapotyň aşagynda Randomjava.util paketinden bir synp ulanýar, ýöne bu tötänleýin san generatory bilen işlemek prinsipini üýtgetmeýär. Argument hökmünde getRandomNumber(int)bitewi san alýar . Bu san generatoryň yzyna gaýdyp biljek iň ýokary çägi bolar. Aşakdaky çäk 0. Möhüm! Jenerator Hiç haçan ýokarky belgini yzyna gaýtarmaz. Mysal üçin, tötänleýin çagyrylsa, getRandomNumber(3)0, 1, 2 yzyna gaýdyp biler. Görşüňiz ýaly 3-ni yzyna gaýtaryp bilmez. Jeneratoryň ulanylyşy gaty ýönekeý, ýöne köp halatlarda örän täsirli. Käbir çäklerde tötänleýin san almaly: Üç sanly belgi (100..999) gerek diýip göz öňüne getiriň. Öňden bilşiňiz ýaly, yzyna gaýtarylan iň az san 0-dyr. Şeýlelik bilen, oňa 100 goşmaly bolarsyňyz. Thisöne bu ýagdaýda ýokary çäkden geçmezlik üçin seresap bolmaly. Iň ýokary tötänleýin baha hökmünde 999 almak üçin, 1000 argument bilen usula jaň etmeli. getRandomNumber(int)100öne 100-den soňky goşmaçany ýadymyzdan çykarmaýarys: bu ýokarky çäkleriň 100-den peseldilmelidigini aňladýar. Aagny, a almak üçin kod tötänleýin üç sanly san şeýle bolar:
int number = 100 + getRandomNumber(900);
Suchöne şeýle prosedurany ýönekeýleşdirmek üçin hereketlendiriji, getRandomNumber(int, int)ilkinji argument hökmünde gaýdyp gelmek üçin iň az san alýan usuly üpjün edýär. Bu usuly ulanyp, öňki mysaly täzeden ýazyp bolar:
int number = getRandomNumber(100, 1000);
Tötänleýin san elementini almak üçin tötänleýin sanlar ulanylyp bilner:
String [] names = {"Andrey", "Валентин", "Сергей"};
String randomName = names[getRandomNumber(names.length)]
Belli bir ähtimallyk bilen käbir hadysalary herekete getirmek. Adamyň daňy mümkin bolan ssenariýalara görä başlaýar: Artykmaç - 50%; Wagtynda turduň - 40%; Garaşylyşyndan bir sagat öň turdy - 10%. Adamyň ertir emulýatoryny ýazýandygyňyzy göz öňüne getiriň. Belli bir ähtimallyk bilen hadysalary başlamaly. Munuň üçin ýene-de tötänleýin san generatoryny ulanmaly. Amallar başgaça bolup biler, ýöne iň ýönekeýi aşakdaky algoritmden ugur almaly:
  1. sanyň döredilmeli çäklerini kesgitleýäris;
  2. tötänleýin san döretmek;
  3. Alnan belgini gaýtadan işleýäris.
Şeýlelik bilen, bu ýagdaýda çäk 10 bolar. Geliň, usula jaň edeliň getRandomNumber(10)we bize gaýdyp gelip biljek zatlaryny seljereliň. 10 san (0-dan 9-a çenli) yzyna gaýtaryp biler we hersi birmeňzeş ähtimallygy - 10%. Indi mümkin bolan netijeleri birleşdirip, mümkin bolan wakalarymyz bilen deňeşdirmeli. Göz öňüne getirişiňize baglylykda köp kombinasiýa bolup biler, ýöne iň düşnükli sesler: “Eger tötänleýin san [0..4] içinde bolsa, san [5..8” içinde bolsa, “Overslept” hadysasyna jaň ediň. ] - "Oýan" wagtynda "we diňe san 9 bolsa," garaşylýandan bir sagat öň turdum ". Hemme zat gaty ýönekeý: [0..4] içinde 5 san bar, olaryň her biri 10% ähtimallyk bilen gaýdyp biler, jemi 50% bolar; [5..8] içinde 4 san bar, 9-y bolsa 10% ähtimallyk bilen ýüze çykýan ýeke-täk san. Kodda, bu akylly dizaýn has ýönekeý görünýär:
int randomNumber = getRandomNumber(10);
if (randomNumber < 5) {
    System.out.println("Проспал ");
} else if (randomNumber < 9) {
    System.out.println("Встал вовремя ");
} else {
    System.out.println("Встал на час раньше положенного ");
}
Umuman, tötänleýin sanlary ulanmak üçin köp wariant bolup biler. Bularyň hemmesi diňe hyýalyňa bagly. Someöne haýsydyr bir netijäni gaýtalap almak zerur bolsa, olar has netijeli ulanylýar. Şonda bu netije öňki netijeden tapawutly bolar. Elbetde käbir ähtimallyk bilen. Bu hemmesi! Oýunlar bölümi barada has giňişleýin öwrenmek isleseňiz, kömek edip biljek käbir peýdaly resminamalar:
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION