1. 継承

CodeGym ゲーム エンジンを使用するには、継承を使用する必要があります。しかし、それが何なのかわからない場合はどうすればよいでしょうか? 一方で、このトピックを理解し、勉強する必要があります。一方、エンジンは非常にシンプルになるように特別に設計されているため、継承に関する表面的な知識だけで問題なく対処できます。

では、継承とは何でしょうか?簡単に言えば、継承は2 つのクラス間の関係です。そのうちの 1 つは親クラスとして機能し、もう 1 つは子 (子孫) クラスになります。さらに、親クラスは、子孫クラスがあることさえ知らない可能性があります。言い換えれば、親は子孫クラスを持つことであまりメリットを得られません。

しかし、継承は子クラスに多くの利点をもたらします。その中で最も重要なのは、親クラスのコードが子クラスに直接コピーされたかのように、親クラスのすべての変数とメソッドが子クラスに表示されることです。これは完全に正確ではありませんが、継承の基本を理解するには十分です。

継承をより深く理解するのに役立ついくつかの例を次に示します。

例 1 — これは最も単純な例です

public class Parent
{
}
クラスはキーワードを使用してクラスをChild継承します。Parentextends
public class Child extends Parent
{
}

例 2 — 親クラスの変数を使用する

public class Parent
{
  public int age;
  public String name;
}
クラスは、クラスのおよびフィールドを、クラス自体で宣言されているかのようにChild使用できます。agenameParentChild
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

例 3 — 親クラスのメソッドの使用

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
クラスChildは、親クラスの変数とメソッドを、Childクラス内で宣言されているかのように使用できます。この例では、getName()メソッドを使用します。
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

一部の詳細は省略しますが、Java コンパイラーの観点からは、親クラスのコードを子クラスのコードにコピーしただけであると言えます。

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);
   }
}
Childコンパイラの観点からクラスがどのように見えるかは次のとおりです。


2. メソッドのオーバーライド

Child場合によっては、クラスに非常に便利なParentクラスを継承させ、子に親の変数とメソッドをすべて継承させる状況が発生します。しかし、それらの方法の中には、私たちが望むように機能しないものや、まったく期待どおりに機能しないものもあります。

この場合どうしますか? 実装が気に入らないメソッドをオーバーライドできます。これは簡単なことです。Childクラス内で、クラス内のメソッドと同じシグネチャを持つメソッドを宣言しParent、その中に独自のコードを記述するだけです。

例 1 — メソッドのオーバーライド

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

   public getName() {
      return name;
   }
}
このprintInfo()メソッドでは次のフレーズが表示されます。
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

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

状況をやや単純化しすぎますが、継承により親クラスのコードが子クラスにコピーされます。ただし、子孫クラスがすでに祖先クラスに存在するメソッドである場合、そのメソッドは祖先クラスからコピーされません。ここでは、子クラスのメソッドが親クラスのメソッドをオーバーライドすると言います。以下の例を見てください。おそらく、それは物事をもう少し明確にするのに役立つでしょう:

コンパイラの観点から Child クラスがどのように見えるかを次に示します。
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());
   }
}

例 2 - ちょっとした継承マジック (およびメソッドのオーバーライド)

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

printInfo()メソッドが型に対して呼び出された場合Parent、今度はクラスgetName()のメソッドが呼び出されますParent

printInfo()オブジェクトに対してメソッドが呼び出された場合Child、今度はクラスgetName()のメソッドが呼び出されますChild

つまり、printInfo()メソッドはクラス内でのみ宣言されますParentが、オブジェクトに対してメソッドが呼び出される場合は、クラスgetName()のメソッドが呼び出されます。ChildprintInfo()Child

例:

Parent parent = new Parent();
parent.printnInfo();
このコードは、画面に次のテキストを表示します。
Luke
Child child = new Child();
child.printnInfo();
このコードは、画面に次のテキストを表示します。
Luke, I am your father

それはすべて、コンパイラの観点 (非常に簡素化されたバージョン) から見ると、クラスのコードはChild次のように見えるためです。

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

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Childコンパイラの観点からクラスがどのように見えるかは次のとおりです。


3. リスト

リスト ( ) について簡単に覚えておきますList。リストには配列と多くの共通点があります。

  • 特定の種類のデータを大量に保存できます。
  • インデックスを使用して要素を取得できます。
  • 要素のインデックスは から始まります0

リストの利点:

配列とは異なり、リストはサイズを動的に変更できます。作成直後のリストのサイズは です0。項目がリストに追加されると、そのサイズが増加します。リストの作成例:

ArrayList<String> myList = new ArrayList<String>();
新しいものを作成するArrayList

山括弧内に示された値は、リストに格納できるデータ型です。

リストを操作するためのいくつかのメソッドを次に示します。

コード 簡単な説明
ArrayList<String> list = new ArrayList<String>();
文字列の新しいリストを作成する
list.add("name");
リストの最後に要素を追加します
list.add(0, "name");
リストの先頭に要素を追加します
String name = list.get(5);
インデックスで要素を取得する
list.set(5, "new name");
インデックスによって要素を変更する
int count = list.size();
リスト内の要素の数を取得します
list.remove(4);
リストから要素を削除する

リストの詳細については、次の記事を参照してください。



4. 乱数

CodeGym ゲーム エンジンには、乱数の生成に使用できる 2 つのメソッドがあります。これらの方法は次のとおりです。

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

最初のメソッド — — は、、、 、 ...getRandomNumber(int max)の範囲の乱数を返します。内部ではパッケージのクラスを使用しますが、乱数の使用方法は変わりません。012max-1Randomjava.util

getRandomNumber(int)引数として整数を受け入れます。この数値は、乱数ジェネレーターが返すことができる数値の上限になります。下限は 0 です。注意してください。乱数ジェネレーターは決して上限の値を返しません。たとえば、 を呼び出すとgetRandomNumber(3)、0、1、または 2 のいずれかがランダムに返されます。ご覧のとおり、3 は返されません。この方法で乱数ジェネレーターを使用するのはかなり単純ですが、多くの場合に適しています。

2 番目のメソッド — getRandomNumber(int min, int max)— は範囲内のランダムな整数を返します[min, max-1]。より小さい数値を返すことはなくmin、 より大きい数値を返すこともありませんmax-1

これらの方法は実際にどのように使用できるのでしょうか?

1.サイコロ

サイコロの目をシミュレートし、範囲内の乱数を取得するとします1-6。どうやってやりますか?これは次のようなコードで実行できます。

int dice = getRandomNumber(1, 7);

このメソッドは、範囲内のランダムな整数を返します1-6

2. ターゲット練習

ターゲットへの射撃をシミュレートする必要があり、射撃の精度には から までの範囲で変化するランダムな要素が含まれているとし-10ます+10。これは次のようなコードで実行できます。

int dx = getRandomNumber(-10, 11);

-10このメソッドは、から までの範囲のランダムな整数を返します+10

ゲームで乱数を使用する方法はたくさんあります。あなたが制限されるのはあなたの想像力だけです。独自のゲームを作成し、改良し、そのプロセスを楽しんでください。

ゲームは誰でもプレイできますが、ゲームを作成できるのはプログラマーだけです。