JavaRush /Java Blog /Random-TW /JavaRush 上的「遊戲」部分:有用的理論

JavaRush 上的「遊戲」部分:有用的理論

在 Random-TW 群組發布
在JavaRush 的「遊戲」部分中,您將找到用於編寫流行電腦遊戲的令人興奮的項目。您想創建自己的流行“2048”、“工兵”、“貪吃蛇”等遊戲版本嗎?這很簡單。我們已經將遊戲編寫變成了一個循序漸進的過程。章節要嘗試成為遊戲開發人員,您不必成為高級程式設計師,但仍需要一定的 Java 知識。在這裡您將找到在編寫遊戲時有用的信息

1. 繼承

使用 JavaRush 遊戲引擎涉及使用繼承。但如果你不知道它是什麼怎麼辦?一方面,你需要了解這個主題:它是在11 級學習的。另一方面,引擎被故意設計得非常簡單,因此您只需了解繼承的膚淺知識就可以了。那麼,什麼是繼承呢?簡單來說,繼承就是兩個類別之間的關係。其中一個成為父級,第二個成為子級(後繼類別)。在這種情況下,父類別甚至可能不知道它有後代類別。那些。它不會從繼承類別的存在中獲得任何特殊的好處。但繼承為後代類別提供了許多優點。而且最主要的是父類別的所有變數和方法都出現在子類別中,就好像父類別的程式碼被複製到了子類別中一樣。這並不完全正確,但為了簡化對繼承的理解,它就可以了。以下是一些範例,可以幫助您更好地理解繼承。 例1:最簡單的繼承。
public class Родитель {

}
Child類別使用extends關鍵字從Parent類別繼承。
public class Потомок extends Родитель {

}
範例 2:使用父類別變數。
public class Родитель {

   public int age;
   public String name;
}
Child類別可以使用Parent類別的年齡姓名變量,就像在其中聲明它們一樣。
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(name+" "+age);
   }
}
範例 3:使用父類別方法。
public class Родитель {

   public int age;
   public String name;

   public getName() {
      return name;
   }
}
類別可以使用類別的變數和方法,就好像它們是在父類別中聲明的一樣。在此範例中,我們使用getName () 方法。
public class Потомок extends Родитель {

   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}
從編譯器的角度來看, 後代類別是這樣的:
public class Потомок extends Родитель {

   public int age; //  унаследованная переменная
   public String name; //  унаследованная переменная

   public getName() { //  унаследованный метод.
      return name;
  }
   public void printInfo() {

     System.out.println(getName()+" "+age);
   }
}

2. 方法重寫

有時,我們從一些非常有用的父類別繼承了後代類別以及所有變數和方法,但有些方法並未完全按照我們想要的方式運作。或者根本不是我們不想要的方式。在這種情況下該怎麼辦?我們可以重寫我們不喜歡的方法。這樣做非常簡單:在我們的後代類別中,我們只需聲明一個與父類別方法具有相同簽名(標頭)的方法,並在其中編寫我們的程式碼。 範例 1:方法重寫。
public class Родитель {

   public String name;

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

   public getName() {
      return name;
  }
}
printInfo() 方法將列印短語“Luke, No!!!”
public class Потомок extends Родитель {

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

   public void printInfo() {

      setName("Luke");
      System.out.println( getName());
   }
}
從編譯器的角度來看, 後代類別是這樣的:
public Потомок extends Родитель {

   public String name; //  унаследованная переменная

   public void setName (String nameNew) { //  Переопределенный метод взамен унаследованного

       name = nameNew + ", No!!!";
   }
   public getName() { //  унаследованный метод.

      return name;
   }
   public void printInfo() {

     setName("Luke");
     System.out.println(getName());
   }
}
範例 2:繼承(和方法重寫)的一點魔力。
public class Родитель {

   public getName() {
      return "Luke";
  }
   public void printInfo() {

     System.out.println(getName());
   }
}
public class Потомок extends Родитель {

   public getName() {
      return "I'm your father, Luke";
  }
}
在此範例中:如果在後代類別中未重寫某個方法printInfo(來自父類別),則當在後代類別的物件上呼叫此方法時,將呼叫其方法getName(),而不是getName()父類別。
Родитель parent = new Родитель ();
parent.printnInfo();
此代碼在螢幕上顯示“Luke”字樣。
Потомок child = new Потомок ();
child.printnInfo();
此代碼顯示銘文“我是你的父親,盧克;”
從編譯器的角度來看, 後代類別是這樣的:
public class Потомок extends Родитель {

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

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

3. 列表

如果您還沒有接觸過列表,這裡有一個快速入門知識。您可以找到有關JavaRush 課程 6-7 級的完整資訊。 列表與陣列有許多共同點:
  • 可以儲存大量某種類型的資料;
  • 允許您透過索引/編號檢索元素;
  • 元素索引從 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); 從清單中刪除項目
您可以從這些文章中了解有關清單的更多資訊:
  1. 數組列表類
  2. 圖片中使用 ArrayList
  3. 從 ArrayList 中刪除一個元素

4. 數組

什麼是矩陣?矩陣無非是一個可以填滿資料的矩形表格。換句話說,它是一個二維數組。您可能知道,Java 中的陣列是物件。標準的一維數組類型int如下所示:
int [] array = {12, 32, 43, 54, 15, 36, 67, 28};
讓我們直觀地想像一下:
0 1 2 3 4 5 6 7
12 32 43 54 15 36 67 28
最上面一行表示單元格位址。也就是說,要取得數字 67,您需要存取索引為 6 的陣列元素:
int number = array[6];
這裡一切都很簡單。二維數組是一維數組的數組。如果這是您第一次聽說這個,請停下來在腦海中想像一下。二維數組看起來像這樣:
0 一維數組 一維數組
1 一維數組
2 一維數組
3 一維數組
4 一維數組
5 一維數組
6 一維數組
7 一維數組
在程式碼中:
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
要取得值 47,您需要存取 [4][2] 處的矩陣元素。
int number = matrix[4][2];
如果您注意到,矩陣座標與經典直角座標系(直角座標系)不同。存取矩陣時,先指定 y,然後指定 x,而在數學中,通常先指定 x(x, y)。您可能會問自己,「為什麼不反轉您想像中的矩陣並透過 (x, y) 以通常的方式存取元素呢?這不會改變矩陣的內容。” 是的,什麼都不會改變。但在程式設計世界中,習慣上以「先是 y,然後是 x」的形式來引用矩陣。這必須被視為理所當然。現在讓我們來談談將矩陣投影到我們的引擎(類別Game)上。如您所知,引擎有許多方法可以改變給定座標處的運動場單元。例如,setCellValue(int x, int y, String value). 它將座標 (x, y) 的某個單元格設為值value。正如您所注意到的,該方法首先精確地取 x,就像在經典座標系中一樣。其餘引擎方法的工作方式類似。在開發遊戲時,經常需要在螢幕上重現矩陣的狀態。這個怎麼做?首先,在循環中,您需要迭代矩陣的所有元素。其次,對於它們中的每一個,呼叫一個方法來顯示反轉座標。例子:
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]));
        }
    }
}
當然,反轉有兩個方向。setCellValue您可以將 (i, j) 傳遞給方法,但同時從矩陣中取出元素 [j][i] 。反轉可能看起來有點困難,但要記住這一點。而且,如果出現任何問題,值得用筆拿起一張紙,繪製一個矩陣並重現正在發生的過程。

5. 隨機數

如何使用隨機數產生器? 該類別Game定義了一個方法getRandomNumber(int)。在底層,它使用Randomjava.util 套件中的類,但這並沒有改變使用隨機數產生器的原理。getRandomNumber(int)採用一個整數作為參數。該數字將是生成器可以返回的上限。下限為0。 重要的! 生成器永遠不會傳回上限數字。例如,如果getRandomNumber(3)隨機調用,它可以返回 0、1、2。如您所見,它不能返回 3。生成器的使用非常簡單,但在許多情況下非常有效。 您需要在一定限制內獲得一個隨機數字: 假設您需要一些三位數(100..999)。如您所知,返回的最小數字是 0。因此,您需要在其上添加 100。但在這種情況下,您需要注意不要超過上限。要獲得 999 作為最大隨機值,您應該getRandomNumber(int)使用參數 1000 來呼叫該方法。但是我們記得隨後添加了 100:這意味著上限應該降低 100。也就是說,獲取隨機三位數將如下所示:
int number = 100 + getRandomNumber(900);
但為了簡化這樣的過程,引擎提供了一種方法getRandomNumber(int, int),該方法將傳回的最小數字作為第一個參數。使用此方法,可以重寫前面的範例:
int number = getRandomNumber(100, 1000);
可以使用隨機數來取得隨機數組元素:
String [] names = {"Andrey", "Валентин", "Сергей"};
String randomName = names[getRandomNumber(names.length)]
以一定的機率觸發某些事件。 一個人的早晨是根據可能的情況開始的:睡過頭——50%;準時起床-40%;比預期早起一個小時——10%。想像一下您正在編寫一個人類早晨模擬器。你需要以一定的機率觸發事件。為此,您再次需要使用隨機數產生器。實作可能有所不同,但最簡單的應該遵循以下演算法:
  1. 我們設定需要產生的數量的限制;
  2. 產生一個隨機數;
  3. 我們處理結果數字。
因此,在本例中,限制將為 10。讓我們呼叫該方法getRandomNumber(10)並分析它可以傳回給我們什麼。它可以返回 10 個數字(從 0 到 9),每個數字的機率相同 - 10%。現在我們需要結合所有可能的結果並將它們與我們可能發生的事件相匹配。可能有很多組合,取決於您的想像力,但最明顯的聲音是:「如果隨機數在[0..4] 範圍內- 如果數字在[5..8] 範圍內,則稱該事件為“睡過頭” ] - “準時起床”,只有當數字是 9 時,那麼“我比預期早起一個小時。” 一切都很簡單:[0..4]內有5個數字,每個數字回傳的機率都是10%,總共就是50%;[5..8]中有4個數字,9是唯一出現機率為10%的數字。在程式碼中,整個巧妙的設計看起來更簡單:
int randomNumber = getRandomNumber(10);
if (randomNumber < 5) {
    System.out.println("Проспал ");
} else if (randomNumber < 9) {
    System.out.println("Встал вовремя ");
} else {
    System.out.println("Встал на час раньше положенного ");
}
一般來說,使用隨機數字有很多選擇。這一切只取決於您的想像。但如果您需要重複以獲得某些結果,那麼它們的使用最為有效。那麼這個結果就會和之前的不一樣。當然,有一定的機率。就這樣!如果您想了解有關遊戲部分的更多信息,這裡有一些有用的文檔可以提供幫助:
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION