JavaRush /Blog Jawa /Random-JV /Bagean "Game" ing JavaRush: Teori migunani

Bagean "Game" ing JavaRush: Teori migunani

Diterbitake ing grup
Ing bagean "Game" JavaRush sampeyan bakal nemokake proyek sing nyenengake kanggo nulis game komputer sing populer. Apa sampeyan pengin nggawe versi dhewe saka "2048", "Sapper", "Snake" lan game liyane? Iku prasaja. Kita wis ngowahi nulis game dadi proses langkah-langkah. BabKanggo nyoba dhewe minangka pangembang game, sampeyan ora kudu dadi programer majeng, nanging pesawat tartamtu saka kawruh Jawa isih dibutuhake. Ing kene sampeyan bakal nemokake informasi sing bakal migunani nalika nulis game .

1. Pusaka

Nggarap mesin game JavaRush kalebu nggunakake warisan. Nanging apa yen sampeyan ora ngerti apa iku? Ing tangan siji, sampeyan kudu ngerti topik iki: sinau ing tingkat 11 . Ing sisih liya, mesin kasebut sengaja dirancang kanthi gampang banget, supaya sampeyan bisa entuk kawruh babagan warisan sing entheng. Dadi, apa warisan? Kanthi gampang banget, warisan minangka hubungan antarane rong kelas. Salah sijine dadi wong tuwa, lan sing nomer loro dadi anak (kelas penerus). Ing kasus iki, kelas induk bisa uga ora ngerti yen dheweke duwe kelas turunan. Sing. iku ora nampa keuntungan tartamtu saka ngarsane kelas inheritor. Nanging warisan menehi akeh kaluwihan kanggo kelas turunan. Lan sing utama yaiku kabeh variabel lan metode kelas induk katon ing kelas anak, kaya-kaya kode kelas induk disalin menyang kelas anak. Iki ora kabeh bener, nanging kanggo pangerten simplified saka warisan bakal nindakake. Kene sawetara conto kanggo luwih ngerti warisan. Tuladha 1: pusaka sing paling prasaja.
public class Родитель {

}
Kelas Anak diwenehi warisan saka kelas Induk nggunakake tembung kunci extends .
public class Потомок extends Родитель {

}
Conto 2: Nggunakake variabel kelas induk.
public class Родитель {

   public int age;
   public String name;
}
Kelas Anak bisa nggunakake variabel umur lan jeneng kelas Induk kaya-kaya diumumake.
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(name+" "+age);
   }
}
Conto 3: Nggunakake metode kelas induk.
public class Родитель {

   public int age;
   public String name;

   public getName() {
      return name;
   }
}
Kelas Anak bisa nggunakake variabel lan metode kelas Induk kaya sing diumumake. Ing conto iki, kita nggunakake metode getName ().
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}
Iki minangka kelas Descendant saka sudut pandang kompiler:
public class Потомок extends Родитель {

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

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

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

2. Metode overriding

Kadhangkala ana kahanan sing kita warisake kelas turunan saka sawetara kelas Induk sing migunani banget, bebarengan karo kabeh variabel lan metode, nanging sawetara cara ora bisa digunakake kanthi cara sing dikarepake. Utawa ora kabeh ing cara kita ora pengin. Apa sing kudu ditindakake ing kahanan iki? Kita bisa ngatasi cara sing ora disenengi. Iki ditindakake kanthi gampang: ing kelas Descendant kita mung ngumumake metode kanthi tandha (header) sing padha karo metode kelas Induk lan tulis kode kita ing kono. Tuladha 1: Metode overriding.
public class Родитель {

   public String name;

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

   public getName() {
      return name;
  }
}
Metode printInfo() bakal nyithak ukara "Lukas, Ora!!!"
public class Потомок extends Родитель {

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

   public void printInfo() {

      setName("Luke");
      System.out.println( getName());
   }
}
Iki minangka kelas Descendant saka sudut pandang kompiler:
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());
   }
}
Conto 2: sihir pusaka sethithik (lan metode overriding).
public class Родитель {

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

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

   public getName() {
      return "I'm your father, Luke";
  }
}
Ing conto iki: yen metode printInfo(saka kelas Parent) ora ditindhes ing kelas Descendant, nalika metode iki diarani obyek saka kelas Descendant, metode kasebut bakal diarani getName(), lan dudu getName()kelas Parent.
Родитель parent = new Родитель ();
parent.printnInfo();
Kode iki nampilake tulisan "Lukas" ing layar .
Потомок child = new Потомок ();
child.printnInfo();
Kode iki nampilake tulisan "Aku bapakmu, Lukas;" .
Iki minangka kelas Descendant saka sudut pandang kompiler:
public class Потомок extends Родитель {

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

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

3. Dhaptar

Yen sampeyan durung kenal karo Lists, iki minangka sepisanan cepet. Sampeyan bisa nemokake informasi lengkap babagan level 6-7 kursus JavaRush . Dhaptar duwe akeh sing padha karo array:
  • bisa nyimpen akeh data saka jinis tartamtu;
  • ngidini sampeyan njupuk unsur kanthi indeks / nomer;
  • indeks unsur diwiwiti saka 0.
Kaluwihan saka dhaptar: Ora kaya array, dhaptar bisa ngganti ukuran kanthi dinamis. Sanalika sawise nggawe, dhaptar duwe ukuran 0. Nalika sampeyan nambahake unsur ing dhaptar, ukurane mundhak. Conto nggawe dhaptar:
ArrayList<String> myList = new ArrayList<String>(); // создание нового списка типа ArrayList
Nilai ing kurung sudut yaiku jinis data sing bisa disimpen ing dhaptar. Ing ngisor iki sawetara cara kanggo nggarap dhaptar:
Kode Katrangan singkat babagan apa kode kasebut
ArrayList<String> list = new ArrayList<String>(); Nggawe dhaptar strings anyar
list.add("name"); Tambah unsur ing mburi dhaftar
list.add(0, "name"); Tambah unsur ing wiwitan dhaptar
String name = list.get(5); Entuk unsur kanthi indeks
list.set(5, "new name"); Ngganti unsur kanthi indeks
int count = list.size(); Entuk nomer unsur ing dhaptar
list.remove(4); Mbusak item saka dhaptar
Sampeyan bisa sinau luwih lengkap babagan dhaptar saka artikel iki:
  1. Kelas ArrayList
  2. ArrayList kerja ing gambar
  3. Mbusak unsur saka ArrayList

4. Susunan

Apa matriks? Matriks ora luwih saka tabel persegi panjang sing bisa diisi data. Ing tembung liyane, iku array loro-dimensi. Kaya sing sampeyan ngerteni, array ing Jawa minangka obyek. Jinis array siji-dimensi standar intkaton kaya iki:
int [] array = {12, 32, 43, 54, 15, 36, 67, 28};
Ayo mbayangno iki kanthi visual:
0 1 2 3 4 5 6 7
12 32 43 54 15 36 67 28
Baris ndhuwur nuduhake alamat sel. Yaiku, kanggo entuk nomer 67, sampeyan kudu ngakses unsur array kanthi indeks 6:
int number = array[6];
Kabeh prasaja banget ing kene. Array loro-dimensi yaiku susunan array siji-dimensi. Yen iki pisanan sampeyan krungu bab iki, mungkasi lan gambar ing sirah. Array loro-dimensi katon kaya iki:
0 Array siji-dimensi Array siji-dimensi
1 Array siji-dimensi
2 Array siji-dimensi
3 Array siji-dimensi
4 Array siji-dimensi
5 Array siji-dimensi
6 Array siji-dimensi
7 Array siji-dimensi
Ing kode:
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
Kanggo entuk nilai 47, sampeyan kudu ngakses unsur matriks ing [4][2].
int number = matrix[4][2];
Yen sampeyan ngerteni, koordinat matriks beda karo sistem koordinat persegi panjang klasik (sistem koordinat Cartesian). Nalika ngakses matriks, sampeyan nemtokake y dhisik banjur x , dene ing matematika umume nemtokake x(x, y) dhisik. Sampeyan bisa uga takon dhewe, "Yagene ora mbalikke matriks ing imajinasi sampeyan lan ngakses unsur kasebut kanthi cara biasanipun liwat (x, y)? Iki ora bakal ngganti isi matriks. Ya, ora ana sing bakal owah. Nanging ing jagad pemrograman, umume ngrujuk matriks kanthi bentuk "pisanan y, banjur x." Iki kudu dijupuk kanggo diwenehake. Saiki ayo ngomong babagan proyeksi matriks menyang mesin kita (kelas Game). Sing ngerti, mesin wis akeh cara sing ngganti sel saka lapangan playing ing koordinat tartamtu. Contone, ing setCellValue(int x, int y, String value). Iki nyetel sel tartamtu kanthi koordinat (x, y) menyang nilai value. Kaya sing sampeyan ngerteni, cara iki pisanan njupuk persis x, kaya ing sistem koordinat klasik. Liyane saka cara engine dianggo ing cara sing padha. Nalika ngembangake game, bakal kerep perlu kanggo ngasilake negara matriks ing layar. Carane nindakake iki? Pisanan, ing daur ulang sampeyan kudu ngulang kabeh unsur matriks. Kapindho, kanggo saben wong, nelpon cara kanggo nampilake koordinat INVERTED. Tuladha:
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]));
        }
    }
}
Alamiah, inversi dianggo ing rong arah. setCellValueSampeyan bisa pass (i, j) kanggo cara , nanging ing wektu sing padha njupuk unsur [j][i] saka matriks. Inversi bisa uga katon rada angel, nanging kudu dieling-eling. Lan tansah, yen ana masalah, iku worth njupuk Piece saka kertas karo pena, teken matriks lan reproducing proses apa wis kedados.

5. Nomer acak

Carane bisa karo generator nomer acak? Kelas Gamenemtokake cara getRandomNumber(int). Ing hood, nggunakake kelas Randomsaka paket java.util, nanging iki ora ngganti prinsip karya karo generator nomer acak. getRandomNumber(int)Njupuk integer minangka argumen . Nomer iki bakal dadi wates ndhuwur sing generator bisa bali. Watesan ngisor yaiku 0. Penting! Generator ora bakal ngasilake nomer wates ndhuwur. Contone, yen diarani getRandomNumber(3)kanthi acak bisa ngasilake 0, 1, 2. Kaya sing sampeyan ngerteni, ora bisa bali 3. Panggunaan generator iki cukup prasaja, nanging efektif banget ing pirang-pirang kasus. Sampeyan kudu njaluk nomer acak ing sawetara watesan: Mbayangno sing perlu sawetara nomer telung digit (100..999). Kaya sing wis dingerteni, jumlah minimal sing bali yaiku 0. Dadi, sampeyan kudu nambah 100. Nanging ing kasus iki, sampeyan kudu ngati-ati supaya ora ngluwihi wates ndhuwur. Kanggo entuk 999 minangka nilai acak maksimum, sampeyan kudu nelpon metode getRandomNumber(int)kanthi argumen 1000. Nanging kita ngelingi babagan tambahan 100 sabanjure: iki tegese wates ndhuwur kudu diturunake 100. Yaiku, kode kanggo entuk a nomer telung digit acak bakal katon kaya iki:
int number = 100 + getRandomNumber(900);
Nanging kanggo nyederhanakake prosedur kasebut, mesin menehi cara getRandomNumber(int, int)sing njupuk nomer minimal kanggo bali minangka argumen pisanan. Nggunakake metode iki, conto sadurunge bisa ditulis maneh:
int number = getRandomNumber(100, 1000);
Nomer acak bisa digunakake kanggo njupuk unsur array acak:
String [] names = {"Andrey", "Валентин", "Сергей"};
String randomName = names[getRandomNumber(names.length)]
Micu acara tartamtu kanthi kemungkinan tartamtu. Esuk wong diwiwiti miturut skenario sing bisa ditindakake: Overslept - 50%; Bangun ing wektu - 40%; Bangun jam luwih awal tinimbang sing dikarepake - 10%. Bayangake yen sampeyan nulis emulator esuk manungsa. Sampeyan kudu micu acara kanthi kemungkinan tartamtu. Kanggo nindakake iki, maneh, sampeyan kudu nggunakake generator nomer acak. Implementasi bisa beda-beda, nanging sing paling gampang kudu ngetutake algoritma ing ngisor iki:
  1. kita nyetel watesan ing kang nomer kudu kui;
  2. ngasilake nomer acak;
  3. We proses nomer asil.
Dadi, ing kasus iki, watesan bakal dadi 10. Ayo nelpon metode kasebut getRandomNumber(10)lan nganalisa apa sing bisa bali menyang kita. Bisa bali 10 digit (saka 0 kanggo 9) lan saben karo kemungkinan padha - 10%. Saiki kita kudu nggabungake kabeh asil sing bisa ditindakake lan cocog karo acara sing bisa ditindakake. Bisa uga ana akeh kombinasi, gumantung saka bayangan sampeyan, nanging sing paling jelas yaiku: "Yen nomer acak ana ing [0..4] - micu acara" Overslept, yen nomer kasebut ana ing [5.. 8] - "Wake up" ing wektu, lan mung yen nomer 9, banjur "Aku tangi jam luwih awal tinimbang sing dikarepake." Kabeh iku banget prasaja: ing [0..4] ana 5 nomer, saben kang bisa bali karo kemungkinan 10%, kang total bakal 50%; ing [5..8] ana 4 nomer, lan 9 mung nomer sing katon karo kemungkinan 10%. Ing kode, kabeh desain pinter iki katon luwih prasaja:
int randomNumber = getRandomNumber(10);
if (randomNumber < 5) {
    System.out.println("Проспал ");
} else if (randomNumber < 9) {
    System.out.println("Встал вовремя ");
} else {
    System.out.println("Встал на час раньше положенного ");
}
Umumé, ana bisa dadi akèh opsi kanggo nggunakake nomer acak. Iku kabeh gumantung mung ing bayangan. Nanging sing paling efektif digunakake yen sampeyan kudu njaluk sawetara asil bola-bali. Banjur asil iki bakal beda karo sing sadurunge. Kanthi sawetara kemungkinan, mesthi. Iku kabeh! Yen sampeyan pengin sinau luwih lengkap babagan bagean Game, iki sawetara dokumentasi migunani sing bisa mbantu:
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION