CodeGym /Java Blog /Acak /Bagian game di CodeGym: Teori yang berguna
John Squirrels
Level 41
San Francisco

Bagian game di CodeGym: Teori yang berguna

Dipublikasikan di grup Acak
Di bagian "Game" di CodeGym, Anda akan menemukan proyek menarik yang melibatkan pembuatan game komputer populer. Ingin membuat sendiri versi game populer 2048, Minesweeper, Snake, dan game lainnya? Itu mudah. Kami telah mengubah penulisan game menjadi proses langkah demi langkah. Bagian "Game" di CodeGym: Teori yang berguna - 1Untuk menguji kemampuan Anda sebagai pengembang game, Anda tidak harus menjadi pemrogram tingkat lanjut, tetapi diperlukan pengetahuan Java yang spesifik. Di sini Anda akan menemukan informasi yang berguna dalam penulisan game .

1. Warisan

Bekerja dengan mesin game CodeGym melibatkan penggunaan warisan. Tetapi bagaimana jika Anda tidak tahu apa itu? Di satu sisi, Anda perlu memahami topik ini: dipelajari di Level 11. Di sisi lain, mesinnya dirancang khusus agar sangat sederhana, sehingga Anda dapat lolos dengan pengetahuan dangkal tentang warisan. Jadi apa itu warisan? Sederhananya, warisan adalah hubungan antara dua kelas. Salah satunya menjadi orang tua, dan yang lainnya menjadi anak (keturunan). Selain itu, kelas induk bahkan mungkin tidak mengetahui bahwa ia memiliki keturunan. Dengan kata lain, tidak mendapatkan keuntungan tertentu dengan memiliki keturunan. Tetapi warisan memberi keturunan banyak keuntungan. Dan yang paling penting adalah bahwa semua variabel dan metode kelas induk muncul di keturunan seolah-olah kode kelas induk disalin ke kelas keturunan. Ini bukan deskripsi yang sepenuhnya akurat, tetapi cukup untuk pemahaman yang disederhanakan tentang warisan. Contoh 1: Warisan paling sederhana.

public class Parent {

}
Kelas Anak mewarisi kelas Induk menggunakan kata kunci extends .

public class Child extends Parent {

}
Contoh 2: Menggunakan variabel kelas induk.

public class Parent {

   public int age;
   public String name;
}
Kelas Anak dapat menggunakan variabel umur dan nama kelas Induk seolah - olah mereka dideklarasikan di kelas Induk .

public class Child extends Parent {

   public void printInfo() {

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

public class Parent {

   public int age;
   public String name;

   public getName() {
      return name;
  }
}
Kelas Anak dapat menggunakan variabel dan metode kelas Induk seolah- olah mereka dideklarasikan di kelas Anak. Dalam contoh ini, kami menggunakan metode getName() .

public class Child extends Parent {

   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}
Seperti inilah tampilan kelas Anak bagi 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. Mengganti metode

Kadang-kadang ada situasi di mana kita membuat kelas Anak kita mewarisi beberapa kelas Induk yang sangat berguna, bersama dengan semua variabel dan metodenya, tetapi beberapa metode tidak berfungsi seperti yang kita inginkan. Atau sama sekali tidak seperti yang kita inginkan. Apa yang dapat kita lakukan dalam situasi ini? Kita dapat mengganti metode yang tidak kita sukai. Ini sangat mudah dilakukan: di kelas Anak, kita cukup mendeklarasikan metode dengan tanda tangan yang sama dengan metode di kelas Induk, lalu menulis kode kita sendiri di dalamnya. Contoh 1: Mengganti metode.

public class Parent {

   public String name;

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

   public getName() {
      return name;
  }
}
Metode printInfo() akan menampilkan "Luke, No!!!"

public class Child extends Parent{

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

   public void printInfo() {
      setName("Luke");
      System.out.println(getName());
   }
}
Seperti inilah tampilan kelas Anak bagi 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());
   }
}
Contoh 2: Beberapa sihir warisan (dan penggantian metode).

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";
  }
}
Dalam contoh ini, jika printInfometode (dari kelas Induk) tidak ditimpa di kelas Anak, saat metode ini dipanggil pada objek Anak, metodenya getName()akan dipanggil alih-alih getName()metode kelas Induk.

Parent parent = new Parent ();
parent.printnInfo();
Kode ini menampilkan "Luke" di layar.

Child child = new Child ();
child.printnInfo();
Kode ini menampilkan "Luke, aku ayahmu" di layar.
Seperti inilah tampilan kelas Anak bagi kompiler:

public class Child extends Parent {

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

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

3. Daftar

Jika Anda belum pernah bertemu daftar (Daftar), berikut ikhtisar singkatnya. Anda dapat menemukan informasi lengkap di Level 6-7 kursus CodeGym . Daftar memiliki banyak kesamaan dengan array:
  • Anda dapat menyimpan banyak data dari jenis tertentu;
  • mereka membiarkan Anda mendapatkan item berdasarkan indeks mereka;
  • indeks elemen mulai dari 0.
Manfaat daftar: Tidak seperti array, daftar dapat mengubah ukuran secara dinamis. Saat daftar dibuat, ukurannya adalah 0. Saat Anda menambahkan item ke daftar, ukurannya bertambah. Berikut adalah contoh membuat daftar:

ArrayList<String> myList = new ArrayList<String>(); // Create a new ArrayList
Nilai dalam kurung sudut menunjukkan tipe data yang dapat disimpan oleh daftar. Berikut adalah beberapa metode untuk bekerja dengan daftar:
Kode Deskripsi singkat tentang apa yang dilakukan kode
ArrayList<String> list = new ArrayList<String>(); Buat daftar string baru
list.add("name"); Tambahkan elemen ke akhir daftar
list.add(0, "name"); Tambahkan elemen ke awal daftar
String name = list.get(5); Dapatkan elemen dengan indeksnya
list.set(5, "new name"); Ubah elemen dengan indeksnya
int count = list.size(); Dapatkan jumlah elemen dalam daftar
list.remove(4); Hapus elemen dari daftar
Anda dapat mempelajari lebih lanjut tentang daftar dari artikel berikut:
  1. kelas ArrayList
  2. ArrayList dalam gambar
  3. Menghapus elemen dari ArrayList

4. Array

Apa itu matriks? Matriks tidak lebih dari tabel persegi panjang yang dapat diisi dengan data. Dengan kata lain, ini adalah array dua dimensi. Seperti yang mungkin Anda ketahui, array di Java adalah objek. Array satu dimensi standar intterlihat seperti ini:

int [] array = {12, 32, 43, 54, 15, 36, 67, 28};
Kita bisa memvisualisasikannya seperti ini:
0 1 2 3 4 5 6 7
12 32 43 54 15 36 67 28
Baris atas menunjukkan alamat sel. Dengan kata lain, untuk mendapatkan angka 67, Anda perlu mengakses elemen array dengan indeks 6:

int number = array[6];
Semuanya sangat sederhana. Array dua dimensi adalah array dari array satu dimensi. Jika Anda mendengar tentang ini untuk pertama kalinya, hentikan dan bayangkan di kepala Anda. Array dua dimensi terlihat seperti ini:
0 Array satu dimensi Array satu dimensi
1 Array satu dimensi
2 Array satu dimensi
3 Array satu dimensi
4 Array satu dimensi
5 Array satu dimensi
6 Array satu dimensi
7 Array satu dimensi
Dalam 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
Untuk mendapatkan nilai 47, Anda perlu mengacu pada elemen matriks di [4][2].

int number = matrix[4][2];
Anda mungkin telah memperhatikan bahwa koordinat matriks berbeda dari sistem koordinat persegi panjang klasik (sistem koordinat Cartesian). Saat Anda mengakses matriks, Anda terlebih dahulu menentukan koordinat y dan kemudian koordinat x. Dalam matematika, biasanya menentukan koordinat x terlebih dahulu, yaitu (x, y). Anda mungkin bertanya-tanya: "Nah, mengapa tidak memutar representasi matriks Anda dan kemudian mengakses elemen dengan cara biasa menggunakan (x, y)? Melakukan ini tidak akan mengubah isi matriks". Ya, tidak ada yang akan berubah. Namun dalam dunia pemrograman, praktik yang diterima adalah mengakses matriks "pertama dengan y, kemudian dengan x". Anda harus menerima ini sebagai cara yang tepat. Sekarang mari kita bicara tentang memproyeksikan matriks ke mesin kita (Gamekelas). Seperti yang Anda ketahui, mesin memiliki banyak metode yang mengubah sel lapangan permainan pada koordinat tertentu. Misalnya setCellValue(int x, int y, String value)metode. Ini menetapkan sel tertentu dengan koordinat (x, y) sama dengan parameter nilai. Anda mungkin telah memperhatikan bahwa metode ini membutuhkan x terlebih dahulu, seperti pada sistem koordinat klasik. Metode mesin lainnya bekerja dengan cara yang sama. Saat mengembangkan game, seringkali diperlukan untuk mereproduksi status matriks di layar. Bagaimana kita melakukannya? Pertama, Anda perlu mengulangi semua elemen matriks dalam satu lingkaran. Kedua, panggil metode tampilan untuk masing-masing, menggunakan koordinat TERBALIK. Misalnya:

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]));
        }
    }
}
Secara alami, pembalikan bekerja di kedua arah. Anda dapat meneruskan (i, j) ke setCellValuemetode dan sekaligus mengambil elemen [j][i] dari matriks. Membalikkan koordinat mungkin tampak agak sulit, tetapi Anda perlu mengingatnya. Dan selalu, jika Anda menemui masalah, Anda harus mengambil selembar kertas dan pulpen, menggambar matriks, dan mereproduksi proses yang melibatkan matriks.

5. Angka acak

Bagaimana Anda bekerja dengan generator nomor acak? Kelas Gamemendefinisikan getRandomNumber(int)metode. Di balik tudung, ia menggunakan Randomkelas dari paket java.util, tetapi cara Anda bekerja dengan penghasil bilangan acak tidak berubah. getRandomNumber(int)mengambil bilangan bulat sebagai argumen. Angka ini akan menjadi batas atas apa yang dapat dikembalikan oleh generator. Batas bawah adalah 0. Penting! Generator TIDAK AKAN PERNAH mengembalikan angka batas atas. Misalnya, jika Anda memanggil getRandomNumber(3), ia akan mengembalikan 0, 1, atau 2 secara acak. Seperti yang Anda lihat, ia tidak dapat mengembalikan 3. Menggunakan generator dengan cara ini cukup sederhana, tetapi sangat efektif dalam banyak kasus. Misalkan Anda perlu mendapatkan angka acak dalam beberapa rentang: Bayangkan Anda memerlukan angka tiga digit dalam rentang [100..999]. Seperti yang sudah Anda ketahui, angka minimum yang dikembalikan adalah 0. Jadi, Anda perlu menambahkan 100. Namun dalam hal ini, Anda harus berhati-hati agar tidak melebihi batas atas. Untuk mendapatkan 999 sebagai nilai acak maksimum, panggilgetRandomNumber(int)metode dengan argumen 1000. Tapi sekarang kita ingat bahwa kita menambahkan 100 ke hasil: ini berarti batas atas harus dikurangi 100. Dengan kata lain, kode untuk mendapatkan angka tiga digit acak kita akan terlihat seperti ini :

int number = 100 + getRandomNumber(900);
Tetapi untuk menyederhanakan prosedur ini, mesin menyediakan getRandomNumber(int, int)metode yang parameter pertamanya adalah angka minimum yang akan dikembalikan. Dengan menggunakan metode ini, contoh sebelumnya dapat ditulis ulang sebagai berikut:

int number = getRandomNumber(100, 1000);
Angka acak dapat digunakan untuk mendapatkan elemen array acak:

String [] names = {"Sarah", "Val", "Sergey"};
String randomName = names[getRandomNumber(names.length)]
Menghasilkan peristiwa tertentu dengan beberapa probabilitas. Bagi manusia, pagi hari dimulai dengan beberapa kemungkinan skenario: Ketiduran – 50% kemungkinan; Bangun tepat waktu – peluang 40%; Bangun satu jam lebih awal – peluang 10%. Bayangkan Anda sedang menulis generator hasil pagi. Anda perlu membuat acara dengan probabilitas tertentu. Untuk melakukan ini, Anda perlu menggunakan generator nomor acak lagi. Implementasi yang berbeda dimungkinkan, tetapi yang paling sederhana harus didasarkan pada algoritme berikut:
  1. atur batas yang digunakan untuk menghasilkan angka;
  2. menghasilkan nomor acak;
  3. memproses nomor yang diperoleh.
Dalam hal ini, maksimumnya adalah 10. HubungigetRandomNumber(10)metode dan menganalisis bahwa kita dapat kembali. Itu dapat mengembalikan 10 angka (dari 0 hingga 9), masing-masing dengan probabilitas yang sama — 10%. Sekarang kita perlu menggabungkan semua kemungkinan hasil dan memetakannya ke kemungkinan kejadian kita. Imajinasi Anda mungkin memikirkan banyak kemungkinan kombinasi, tetapi inilah yang paling jelas: "Jika angka acak berada dalam rentang [0..4], kami memiliki acara "Ketiduran"; jika angka berada dalam rentang [5 ..8], kami memiliki acara "Bangun tepat waktu"; dan jika angkanya 9, maka kami memiliki acara "Bangun satu jam lebih awal". Semuanya sangat sederhana. Ada 5 angka dalam rentang [0 ..4], yang masing-masing dapat dikembalikan dengan probabilitas 10%, dengan total 50%; ada 4 angka dalam rentang [5..8], dan 9 hanyalah satu angka yang muncul dengan 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");
}
Secara umum, ada banyak cara untuk menggunakan angka acak. Anda hanya dibatasi oleh imajinasi Anda. Tetapi mereka paling efektif digunakan jika Anda perlu mendapatkan hasil berulang kali. Maka hasil baru akan berbeda dari yang sebelumnya. Dengan beberapa kemungkinan, tentu saja. Itu saja untuk saat ini! Jika Anda ingin mempelajari lebih lanjut tentang bagian "Permainan", berikut beberapa dokumentasi bermanfaat yang dapat membantu:
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION