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.
Kanggo 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;
public String name;
public getName() {
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;
public void setName(String nameNew)
name = nameNew + ", No!!!";
}
public getName() {
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
printInfo
metode (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>();
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:
- Kelas ArrayList
- ArrayList ing gambar
- 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
int
katon 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 (
Game
kelas). 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
setCellValue
cara 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
Game
nemtokake
getRandomNumber(int)
cara. Ing hood, nggunakake
Random
kelas 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 ing
getRandomNumber(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:
- nyetel watesan sing digunakake kanggo ngasilake nomer;
- ngasilake nomer acak;
- proses nomer dijupuk.
Ing kasus iki, maksimum bakal 10. Telpon ing
getRandomNumber(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: