1.继承

要使用 CodeGym 游戏引擎,您需要使用继承。但是,如果您不知道那是什么怎么办?一方面,你确实需要了解和研究这个话题。另一方面,该引擎被特别设计得非常简单,所以你对继承稍有了解就可以搞定。

那么什么是继承呢?简单来说,继承就是两个类之间的一种关系。其中一个充当父类,另一个成为子(后代)类。更重要的是,父类甚至可能不知道它有子类。换句话说,父类不会从拥有后代类中获得太多好处。

但是继承给子类带来了很多好处。其中最重要的是,父类的所有变量和方法都出现在子类中,就好像把父类的代码直接复制到子类中一样。这并不完全准确,但足以对继承有一个基本的了解。

下面是一些示例,可以帮助您更好地理解继承。

示例 1 — 这是最简单的示例

public class Parent
{
}
类在关键字的帮助下Child继承类。Parentextends
public class Child extends Parent
{
}

示例 2——使用父类的变量

public class Parent
{
  public int age;
  public String name;
}
Child可以使用类的age和字段,就好像它们是在类本身中声明的一样。nameParentChild
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 游戏引擎有两种可用于生成随机数的方法。这些方法是:

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。以这种方式使用随机数生成器相当简单,但适用于许多情况。

第二种方法——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

在游戏中使用随机数的方法有很多种。你只受限于你的想象力。编写您自己的游戏,完善它们,并享受这个过程。

每个人都可以玩游戏,但只有程序员才能创造游戏。