CodeGym /Blog Jawa /Acak /bagean Games ing CodeGym: teori migunani
John Squirrels
tingkat
San Francisco

bagean Games ing CodeGym: teori migunani

Diterbitake ing grup
Ing bagean "Game" ing CodeGym, sampeyan bakal nemokake proyek menarik sing kalebu nulis game komputer populer. Pengin nggawe versi game populer 2048, Minesweeper, Snake, lan game liyane? Iku prasaja. Kita wis ngowahi nulis game dadi proses langkah-langkah. Bagean "Game" ing CodeGym: Teori sing migunani - 1Kanggo nyoba kabisan minangka pangembang game, sampeyan ora kudu dadi programmer majeng, nanging pesawat tartamtu saka kawruh Jawa perlu. Ing kene sampeyan bakal nemokake informasi sing bakal migunani kanggo nulis game .

1. Pusaka

Nggarap mesin game CodeGym kalebu nggunakake warisan. Nanging apa yen sampeyan ora ngerti apa iku? Ing tangan siji, sampeyan kudu ngerti topik iki: sinau ing Level 11. Ing tangan liyane, engine iki dirancang khusus kanggo dadi banget prasaja, supaya sampeyan bisa njaluk adoh karo kawruh entheng saka warisan. Dadi apa warisan? Kanthi prasaja, warisan minangka hubungan antarane rong kelas. Sing siji dadi wong tuwa, sing siji dadi anak (turunan). Kajaba iku, kelas wong tuwa bisa uga ora ngerti yen dheweke duwe keturunan. Ing tembung liya, ora entuk keuntungan tartamtu kanthi duwe keturunan. Nanging warisan menehi turunan akeh kaluwihan. Lan sing paling penting yaiku kabeh variabel lan metode kelas induk katon ing turunan kaya kode kelas induk disalin menyang kelas turunan. Iki dudu katrangan sing akurat, nanging cukup kanggo ngerteni warisan sing disederhanakake. Tuladha 1: Pusaka sing paling prasaja.

public class Parent {

}
Kelas Anak marisi kelas Induk nggunakake tembung kunci extends .

public class Child extends Parent {

}
Conto 2: Nggunakake variabel kelas induk.

public class Parent {

   public int age;
   public String name;
}
Kelas Anak bisa nggunakake variabel umur lan jeneng kelas Parent kaya - kaya diumumake ing kelas Parent .

public class Child extends Parent {

   public void printInfo() {

     System.out.println(name+" "+age);
   }
}
Conto 3: Nggunakake metode kelas induk.

public class Parent {

   public int age;
   public String name;

   public getName() {
      return name;
  }
}
Kelas Anak bisa nggunakake variabel lan metode kelas Induk kaya sing diumumake ing kelas Anak. Ing conto iki, kita nggunakake metode getName () .

public class Child extends Parent {

   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}
Iki minangka kelas Child kanggo kompiler:

public class Child extends Parent{

   public int age;  // Inherited variable
   public String name;  // Inherited variable

   public getName() {  // Inherited method.
      return name;
  }
   public void printInfo() {

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

2. Cara overriding

Kadhangkala ana kahanan sing nggawe kelas Anak dadi warisan kelas Induk sing migunani, bebarengan karo kabeh variabel lan metode, nanging sawetara metode kasebut ora bisa digunakake kaya sing dikarepake. Utawa ora kaya sing dikarepake. Apa sing bisa kita lakoni ing kahanan iki? Kita bisa ngganti cara sing ora disenengi. Iki gampang banget ditindakake: ing kelas Anak, kita mung ngumumake metode kanthi teken sing padha karo metode ing kelas Induk, banjur nulis kode dhewe ing kono. Conto 1: Ngganti metode.

public class Parent {

   public String name;

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

   public getName() {
      return name;
  }
}
Metode printInfo() bakal nampilake "Luke, Ora!!!"

public class Child extends Parent{

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

   public void printInfo() {
      setName("Luke");
      System.out.println(getName());
   }
}
Iki minangka kelas Child kanggo kompiler:

public Child extends Parent {

   public String name;  // Inherited variable

   public void setName(String nameNew)  // Overridden method instead of the inherited method {

       name = nameNew + ", No!!!";
   }
   public getName() {  // Inherited method.

      return name;
   }
   public void printInfo() {

     setName("Luke");
     System.out.println( getName());
   }
}
Conto 2: Sawetara sihir warisan (lan metode overriding).

public class Parent {

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

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

public class Child extends Parent {

   public getName() {
      return "Luke, I am your father";
  }
}
Ing conto iki, yen printInfometode (saka kelas Parent) ora ditindhes ing kelas Anak, nalika metode iki diarani obyek Anak, metode kasebut getName()bakal diarani tinimbang getName()metode kelas Parent.

Parent parent = new Parent ();
parent.printnInfo();
Kode iki nampilake "Lukas" ing layar.

Child child = new Child ();
child.printnInfo();
Kode iki nampilake "Lukas, aku bapakmu" ing layar.
Iki minangka kelas Child kanggo kompiler:

public class Child extends Parent {

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

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

3. Dhaptar

Yen sampeyan durung ketemu dhaptar (Dhaptar), iki ringkesan ringkes. Sampeyan bisa nemokake informasi lengkap ing Level 6-7 saka kursus CodeGym . Dhaptar duwe akeh sing padha karo array:
  • sampeyan bisa nyimpen akeh data saka jinis tartamtu;
  • dheweke ngidini sampeyan entuk item kanthi indeks;
  • indeks unsur diwiwiti saka 0.
Keuntungan saka dhaptar: Ora kaya array, dhaptar bisa ngganti ukuran kanthi dinamis. Nalika dhaptar digawe, ukurane 0. Nalika sampeyan nambahake item menyang dhaptar, ukurane mundhak. Iki conto nggawe dhaptar:

ArrayList<String> myList = new ArrayList<String>(); // Create a new ArrayList
Nilai ing kurung amba nuduhake jinis data sing dhaftar bisa nyimpen. 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 unsur saka dhaptar
Sampeyan bisa sinau luwih lengkap babagan dhaptar saka artikel ing ngisor iki:
  1. Kelas ArrayList
  2. ArrayList 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. Array siji-dimensi standar intkaton kaya iki:

int [] array = {12, 32, 43, 54, 15, 36, 67, 28};
Kita bisa nggambarake kaya iki:
0 1 2 3 4 5 6 7
12 32 43 54 15 36 67 28
Baris ndhuwur nuduhake alamat sel. Kanthi tembung liyane, kanggo entuk nomer 67, sampeyan kudu ngakses unsur array kanthi indeks 6:

int number = array[6];
Kabeh iku prasaja banget. Array loro-dimensi yaiku susunan array siji-dimensi. Yen sampeyan krungu bab iki kanggo pisanan, mungkasi lan mbayangno ing sirah. Array rong dimensi katon kaya iki:
0 Larik 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 ngrujuk menyang unsur matriks ing [4][2].

int number = matrix[4][2];
Sampeyan bisa uga ngerteni manawa koordinat matriks beda karo sistem koordinat persegi panjang klasik (sistem koordinat Cartesian). Nalika sampeyan ngakses matriks, sampeyan kudu nemtokake koordinat y lan banjur koordinat x. Ing matématika, umume nemtokake koordinat x luwih dhisik, yaiku (x, y). Sampeyan bisa uga mikir: "Inggih, kok ora muter perwakilan saka matriks banjur ngakses unsur ing cara biasanipun nggunakake (x, y)? Nindakake iki ora bakal ngganti isi matriks ". Ya, ora ana sing bakal owah. Nanging ing jagad pemrograman, praktik sing ditampa yaiku ngakses matriks "pisanan kanthi y, banjur kanthi x". Sampeyan kudu nampa iki minangka cara sing bener. Saiki ayo ngomong babagan proyeksi matriks menyang mesin kita (Gamekelas). Sing ngerti, mesin wis akeh cara sing ngganti sel saka lapangan playing ing koordinat tartamtu. Contone, setCellValue(int x, int y, String value)cara. Iki nyetel sel tartamtu kanthi koordinat (x, y) padha karo parameter nilai. Sampeyan bisa uga wis ngelingi yen cara iki njupuk x pisanan, kaya ing sistem koordinat klasik. Cara liya saka mesin bisa digunakake kanthi cara sing padha. Nalika ngembangake game, asring perlu kanggo ngasilake kahanan matriks ing layar. Kepiye carane nindakake? Pisanan, sampeyan kudu ngulang kabeh unsur matriks ing daur ulang. Kapindho, nelpon cara tampilan kanggo saben wong, nggunakake koordinat REVERSED. Tuladhane:

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, kuwalikan bisa ing loro arah. Sampeyan bisa pass (i, j) kanggo setCellValuecara lan bebarengan njupuk unsur [j][i] saka matriks. Ngganti koordinat bisa uga rada angel, nanging sampeyan kudu ngelingi. Lan mesthi, yen sampeyan nemoni masalah, sampeyan kudu njupuk selembar kertas lan pena, nggambar matriks, lan ngasilake proses sing nglibatake matriks.

5. Nomer acak

Carane sampeyan bisa karo generator nomer acak? Kelas Gamenemtokake getRandomNumber(int)cara. Ing hood, nggunakake Randomkelas saka paket java.util, nanging cara sampeyan bisa karo generator nomer acak ora ngganti. getRandomNumber(int)njupuk integer minangka argumen. Iki nomer bakal watesan ndhuwur apa generator bisa bali. Watesan ngisor yaiku 0. Penting! Generator ora bakal bali nomer watesan ndhuwur. Contone, yen sampeyan nelpon getRandomNumber(3), bakal acak bali 0, 1, utawa 2. Nalika sampeyan bisa ndeleng, iku ora bisa bali 3. Nggunakake generator cara iki cukup prasaja, nanging Highly efektif ing akeh kasus. Upaminipun sampeyan kudu njaluk nomer acak ing sawetara sawetara: Mbayangno sampeyan kudu nomer telung digit ing sawetara [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 njaluk 999 minangka nilai acak maksimum, nelpon inggetRandomNumber(int)metode karo argumen 1000. Nanging saiki kita ngelingi yen kita nambahake 100 menyang asil: iki tegese wates ndhuwur kudu dikurangi 100. Ing tembung liyane, kode kanggo njaluk nomer telung digit acak bakal katon kaya iki. :

int number = 100 + getRandomNumber(900);
Nanging kanggo nyederhanakake prosedur iki, mesin menehi getRandomNumber(int, int)cara kang parameter pisanan nomer minimal kanggo bali. Nggunakake metode iki, conto sadurunge bisa ditulis maneh kaya ing ngisor iki:

int number = getRandomNumber(100, 1000);
Nomer acak bisa digunakake kanggo njupuk unsur array acak:

String [] names = {"Sarah", "Val", "Sergey"};
String randomName = names[getRandomNumber(names.length)]
Ngasilake acara tartamtu kanthi kemungkinan. Kanggo manungsa, esuk diwiwiti kanthi sawetara skenario sing bisa ditindakake: Overslept - 50% kasempatan; Tangi ing wektu - 40% kasempatan; Tangi jam awal - 10% kasempatan. Bayangake yen sampeyan nulis generator asil esuk. Sampeyan kudu nggawe acara kanthi kemungkinan tartamtu. Kanggo nindakake iki, sampeyan maneh kudu nggunakake generator nomer acak. Implementasi sing beda bisa ditindakake, nanging sing paling gampang kudu adhedhasar algoritma ing ngisor iki:
  1. nyetel watesan sing digunakake kanggo ngasilake nomer;
  2. ngasilake nomer acak;
  3. proses nomer dijupuk.
Ing kasus iki, maksimum bakal 10. Telpon inggetRandomNumber(10)cara lan nganalisa sing bisa bali. Bisa bali 10 nomer (saka 0 kanggo 9), saben karo kemungkinan padha - 10%. Saiki kita kudu gabungke kabeh asil bisa lan peta menyang acara kita bisa. Imajinasi sampeyan bisa uga mikirake akeh kombinasi sing bisa ditindakake, nanging iki sing paling jelas: "Yen nomer acak ana ing kisaran [0..4], kita duwe acara" Overslept "; yen nomer kasebut ana ing kisaran [5] ..8], kita duwe acara "Woke up on time", lan yen nomer 9, banjur kita duwe acara "Woke up a hour early". Kabeh iku prasaja banget. Ana 5 nomer ing kisaran [0] ..4], saben bisa bali kanthi kemungkinan 10%, kanthi total 50%, ana 4 angka ing kisaran [5..8], lan 9 mung siji nomer sing katon probabilitas 10%.

int randomNumber = getRandomNumber(10);
if (randomNumber < 5) {
    System.out.println("Overslept");
} else if (randomNumber < 9) {
    System.out.println("Woke up on time");
} else {
    System.out.println("Woke up an hour early");
}
Umumé, ana akeh cara kanggo nggunakake nomer acak. Sampeyan mung diwatesi dening imajinasi sampeyan. Nanging paling efektif digunakake yen sampeyan kudu bola-bali entuk asil. Banjur asil anyar bakal beda karo sing sadurunge. Kanthi sawetara kemungkinan, mesthi. Sing kabeh kanggo saiki! 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