1. Warisan

Untuk bekerja dengan enjin permainan CodeGym, anda perlu menggunakan warisan . Tetapi bagaimana jika anda tidak tahu apa itu? Di satu pihak, anda perlu memahami dan mengkaji topik ini. Sebaliknya, enjin direka khas untuk menjadi sangat mudah, jadi anda boleh bertahan dengan pengetahuan yang cetek tentang warisan.

Jadi apa itu warisan? Secara ringkasnya, pewarisan ialah hubungan antara dua kelas. Salah seorang daripada mereka bertindak sebagai kelas induk, dan satu lagi menjadi kelas anak (keturunan). Lebih-lebih lagi, kelas induk mungkin tidak tahu bahawa ia mempunyai kelas keturunan. Dalam erti kata lain, ibu bapa tidak mendapat banyak faedah daripada mempunyai kelas keturunan.

Tetapi warisan memberi banyak kelebihan kepada kelas kanak-kanak. Yang paling penting ialah semua pembolehubah dan kaedah kelas induk muncul dalam kelas anak, seolah-olah kod kelas induk disalin terus ke dalam kelas anak. Ini tidak sepenuhnya tepat, tetapi ia akan mencukupi untuk pemahaman asas tentang warisan.

Berikut ialah beberapa contoh untuk membantu anda memahami warisan dengan lebih baik.

Contoh 1 — berikut ialah contoh paling mudah

public class Parent
{
}
Kelas Childmewarisi Parentkelas dengan bantuan kata extendskunci.
public class Child extends Parent
{
}

Contoh 2 — menggunakan pembolehubah kelas induk

public class Parent
{
  public int age;
  public String name;
}
Kelas Childboleh menggunakan agedan namemedan kelas Parentseolah-olah ia diisytiharkan dalam Childkelas itu sendiri.
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

Contoh 3 — menggunakan kaedah kelas induk

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
Kelas Childboleh menggunakan pembolehubah dan kaedah kelas Induk seolah-olah ia diisytiharkan dalam Childkelas. Dalam contoh ini, kami menggunakan getName()kaedah.
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

Dengan meninggalkan beberapa butiran, kita boleh mengatakan bahawa dari perspektif pengkompil Java, kita hanya menyalin kod kelas induk ke dalam kod kelas anak:

public class Child extends Parent
{
   public int age;        // An inherited variable
   public String name;    // An inherited variable
   public getName() {     // An inherited method
      return name;
   }

   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}
Begini cara Childkelas kelihatan dari sudut pandangan pengkompil


2. Kaedah mengatasi

Kadangkala terdapat situasi di mana kita menjadikan Childkelas kita mewarisi kelas yang sangat berguna Parent, menyebabkan kanak-kanak itu mewarisi semua pembolehubah dan kaedah ibu bapa. Tetapi sesetengah kaedah itu mungkin tidak berfungsi seperti yang kita mahukan atau tidak sama sekali seperti yang kita mahukan.

Apa yang anda lakukan dalam kes ini? Kita boleh mengatasi kaedah yang pelaksanaannya tidak kita sukai . Ini adalah perkara yang mudah untuk dilakukan: dalam Childkelas kami, kami hanya mengisytiharkan kaedah dengan tandatangan yang sama seperti kaedah dalam Parentkelas dan kemudian menulis kod kami sendiri di dalamnya.

Contoh 1 — kaedah mengatasi

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

   public getName() {
      return name;
   }
}
Kaedah ini printInfo()akan memaparkan frasa berikut:
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

Memudahkan keadaan agaknya, warisan menyebabkan kod kelas induk disalin ke dalam kelas anak. Tetapi jika kelas keturunan sudah menjadi kaedah yang wujud dalam kelas nenek moyang, maka kaedah itu tidak disalin dari kelas moyang. Di sini kita mengatakan bahawa kaedah dalam kelas kanak-kanak mengatasi kaedah dalam kelas induk. Lihat contoh di bawah. Mungkin ia akan membantu menjadikan perkara lebih jelas:

Begini cara kelas Kanak-kanak muncul dari sudut pandangan pengkompil:
public class Child extends Parent
{
   public String name;    // An inherited variable

   public void setName(String nameNew)  // The overridden method replaces the inherited one
   {
      name = nameNew + ", No!!!";
   }

   public getName()    // An inherited method
   {
      return name;
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

Contoh 2 - sedikit sihir warisan (dan kaedah mengatasi)

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";
   }
}

Jika printInfo()kaedah dipanggil pada Parentjenis, ia pula memanggil getName()kaedah kelas Parent.

Jika printInfo()kaedah dipanggil pada Childobjek, ia pula memanggil getName()kaedah kelas Child.

Dalam erti kata lain, printInfo()kaedah diisytiharkan hanya dalam Parentkelas, tetapi ia memanggil getName()kaedah kelas Childjika printInfo()kaedah dipanggil pada Childobjek.

Contoh:

Parent parent = new Parent();
parent.printnInfo();
Kod ini memaparkan teks berikut pada skrin:
Luke
Child child = new Child();
child.printnInfo();
Kod ini memaparkan teks berikut pada skrin:
Luke, I am your father

Dan semuanya kerana dari sudut pandangan pengkompil (versi yang sangat mudah), kod kelas Childkelihatan seperti ini:

public class Child extends Parent
{
   public getName() {
      return "Luke, I am your father";
   }

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Begini cara Childkelas kelihatan dari sudut pandangan pengkompil


3. Senarai

Berikut ialah peringatan ringkas tentang senarai ( List). Senarai mempunyai banyak persamaan dengan tatasusunan:

  • Mereka boleh menyimpan banyak data daripada jenis tertentu.
  • Mereka membenarkan anda mendapatkan elemen mengikut indeks mereka.
  • Indeks unsur bermula pada 0.

Kelebihan senarai:

Tidak seperti tatasusunan, senarai boleh menukar saiz secara dinamik. Sejurus selepas penciptaan, saiz senarai ialah 0. Apabila item ditambahkan pada senarai, saiznya bertambah. Contoh membuat senarai:

ArrayList<String> myList = new ArrayList<String>();
Mencipta yang baruArrayList

Nilai yang ditunjukkan dalam kurungan sudut ialah jenis data yang boleh disimpan oleh senarai.

Berikut ialah beberapa kaedah untuk bekerja dengan senarai:

Kod Penerangan ringkas
ArrayList<String> list = new ArrayList<String>();
Mencipta senarai rentetan baharu
list.add("name");
Tambahkan elemen pada penghujung senarai
list.add(0, "name");
Tambahkan elemen pada permulaan senarai
String name = list.get(5);
Dapatkan elemen mengikut indeksnya
list.set(5, "new name");
Tukar elemen mengikut indeksnya
int count = list.size();
Dapatkan bilangan elemen dalam senarai
list.remove(4);
Alih keluar elemen daripada senarai

Untuk maklumat lanjut tentang senarai, anda boleh membaca artikel berikut:



4. Nombor rawak

Enjin permainan CodeGym mempunyai dua kaedah yang boleh digunakan untuk menjana nombor rawak. Kaedah-kaedah ini ialah:

int getRandomNumber(int max)
int getRandomNumber(int min, int max)

Kaedah pertama — getRandomNumber(int max)— mengembalikan nombor rawak dalam julat 0, 1, 2, ... max-1. Di bawah tudung, ia menggunakan Randomkelas dari java.utilpakej, tetapi itu tidak mengubah cara anda menggunakan nombor rawak.

getRandomNumber(int)menerima integer sebagai hujah. Nombor ini akan menjadi sempadan atas pada nombor yang boleh dipulangkan oleh penjana nombor rawak. Had bawah ialah 0. Perhatian! Penjana nombor rawak TIDAK akan mengembalikan nilai sempadan atas. Sebagai contoh, jika anda memanggil getRandomNumber(3), ia akan kembali secara rawak sama ada 0, 1, atau 2. Seperti yang anda lihat, ia tidak akan kembali 3. Menggunakan penjana nombor rawak dengan cara ini agak mudah, tetapi ia sesuai untuk banyak kes.

Kaedah kedua — getRandomNumber(int min, int max)— mengembalikan integer rawak dalam julat [min, max-1]. Ia tidak akan mengembalikan nombor yang kurang daripada min, dan ia tidak akan mengembalikan nombor yang lebih besar daripada max-1.

Bagaimanakah kaedah ini boleh digunakan dalam amalan?

1. Dadu

Katakan anda ingin mensimulasikan gulungan dadu dan mendapatkan nombor rawak dalam julat 1-6. Bagaimana anda akan melakukannya? Ini boleh dilakukan dengan kod seperti ini:

int dice = getRandomNumber(1, 7);

Kaedah ini akan mengembalikan integer rawak dalam julat 1-6.

2. Amalan sasaran

Katakan anda ingin mensimulasikan penangkapan pada sasaran, dan ketepatan pukulan termasuk komponen rawak yang berbeza-beza dalam julat dari -10kepada +10inklusif. Ini boleh dilakukan dengan kod seperti ini:

int dx = getRandomNumber(-10, 11);

Kaedah ini akan mengembalikan integer rawak dalam julat -10kepada +10.

Terdapat banyak cara untuk menggunakan nombor rawak dalam permainan. Anda hanya terhad oleh imaginasi anda. Tulis permainan anda sendiri, perhalusinya dan nikmati prosesnya.

Semua orang boleh bermain permainan, tetapi hanya pengaturcara boleh menciptanya.