跳轉到內容

建立你自己的模擬遊戲/陣列之旅

來自華夏公益教科書,開放世界開放書籍

在上節課中,我們講解了如何建立一個函式,如何使用一些PHP內建函式,以及如何處理會話。現在我們將更進一步。

如果你嘗試過我們現在設定的小遊戲,你就會同意我的觀點,它不僅無聊,而且非常非常無聊。現在,你可以點選一個按鈕,要麼贏得遊戲,要麼輸掉遊戲。從大局來看,我們希望我們的角色在不同的地圖上四處走動,從一個地方移動到另一個地方,以及在他們死亡之前與敵人戰鬥或掉入陷阱。

但坦率地說,你還做不到這一點。所以,我們再次退一步,從一個更簡單的方法著手——讓角色在一個更大的區域內四處走動,然後再遇到找到寶藏或掉入陷阱的可能性。假設我們有一張這樣的地圖

地圖名稱:教程地圖

地圖等級:1(數字越小,離地面越近,數字越大,離地面越深)

W    W    W    W    W    W    W
W    S    E    E    E    E    W
W    W    E    X    E    E    W
W    E    E    E    T    X    W
W    W    W    W    W    W    W

S 標記著我們角色在地圖上的起始位置。數字 E 代表空地,這意味著角色可以移動到那裡。數字 W 代表牆壁;角色不能移動到那個位置。X 代表陷阱,T 代表我們的寶藏。現在我們已經有了更加有趣的遊戲。為了讓我們的角色擁有更多的移動能力,我們可以使用資料庫或陣列。由於資料庫在某種程度上是一個非常大的陣列,我們將從陣列開始,這樣你就不用擔心資料庫中出現的所有繁瑣問題,然後才能過渡到資料庫。

簡而言之,陣列是一種在同一個地方存放大量資訊的方式。陣列有兩種型別:一維陣列和多維陣列。我們先講解一維陣列。

最簡單的理解陣列的方式是將它視為一個專案列表。列表總是從零開始,並按數字遞增。我們來看一下我建立的一個名為 path 的簡單陣列。在 path 中的每個欄位,我都儲存了關於你可能在那裡找到的專案型別的資訊(寶藏、牆壁或空地)

<?php

$path[0] = "S";
$path[1] = "E";
$path[2] = "E";
$path[3] = "E";
$path[4] = "W";

?>

如你所見,我們的路徑有一個角色的起始位置,三個空地,然後是一堵牆。如果我們嘗試使用這個陣列來構建任何型別的角色移動,這將非常困難。角色將從位置零開始,能夠向前移動最多 3 個空格,然後在到達位置 4 的牆壁時卡住。這個角色唯一的選擇就是轉身回到起始位置。這樣的東西有多無聊?我們希望我們的角色能夠向多個方向移動,而不僅僅是向前和向後。這就是多維陣列發揮作用的地方。看看這個...

<?php

$path[0][0] = "W"; $path[0][1] = "W"; $path[0][2] = "W"; $path[0][3] = "W";

$path[1][0] = "W"; $path[1][1] = "S"; $path[1][2] = "E"; $path[1][3] = "W";

$path[2][0] = "W"; $path[2][1] = "E"; $path[2][2] = "E"; $path[1][3] = "W";

$path[3][0] = "W"; $path[3][1] = "E"; $path[3][2] = "T"; $path[3][3] = "W";

$path[4][0] = "W"; $path[4][1] = "W"; $path[4][2] = "W"; $path[4][3] = "W";

?>

這看起來熟悉嗎?很好!應該很熟悉!這是一個多維陣列。我試圖將它寫出來,以便它看起來與我們上面計劃好的地圖相似,只是這是一個更小的版本。使用多維陣列,你可以一次儲存多個座標。現在我們可以有左右方向以及上下方向。

在多維陣列中,我們的角色從我們用 S 標記的位置開始,位於 (1,1)。這種符號 (1,1) 我們稱之為座標。它記錄了角色的 x 和 y 位置 (x,y)。

如果這個角色向上移動,我們將從 x 座標中減去 1。如果他們想向下移動,我們將向 x 座標中新增 1。如果他們想向左或向右移動,我們將向 y 座標中新增或減去 1。現在如果角色從 (1,1) 開始,他們向右移動會發生什麼?他們會被賦予位置 (1,(1+1)) 或 (1,2)。向上滾動並檢視陣列。位置 (1,2) 有沒有空地?如果有,那麼我們希望允許這種移動。如果位置 (1,2) 有牆,那麼我們將向角色顯示一條錯誤訊息。

現在輪到你來嘗試了。寫出你需要從角色的起始位置到達寶藏所需的座標。實際上有幾種方法可以做到;你能找到不止一種方法嗎?

一旦我們擁有了更大的陣列,我們必須在角色從一個地方移動到另一個地方時始終測試這兩個座標,否則我們將無法從迷宮中獲取準確的資訊。以下是測試陣列在特定位置的值的方法。

<?php

$x = 0; //first coordinate

$y = 0; //second coordinate

echo $path[$x][$y]; //now we show the value of the path for the given coordinates

?>

我相信你已經看到了這一點。你可以像測試任何其他變數一樣測試陣列的值。

<?php

$x = 0;

$y = 0;

if ($path[$x][$y] == "E")

{

echo "You're on an empty space!";

}

else if ($path[$x][$y] == "W")

{

echo "How did you get stuck in a wall?!?";

}

?>

就是這樣!看起來很簡單,不是嗎?

在本節課中,我們講解了一維陣列和多維陣列。為了完成本節課,你需要了解如何為多維陣列賦值,如何訪問陣列中的值,如何顯示陣列中的值,然後編寫 if-else 語句,根據陣列中給定位置的值以不同的方式做出響應。

為了使本節課更容易,我包含了一個自定義函式,該函式將地圖繪製到螢幕上,並顯示角色在移動時的位置。角色以紅色繪製,直到你找到寶藏,然後它會變成綠色!

遊戲檔案

[編輯 | 編輯原始碼]

工作版本: character.php -- 我們已經有了足夠的功能遊戲,你可以自己開始玩了!

原始碼: character.txt

自己嘗試: character2.txt

課程推理

[編輯 | 編輯原始碼]

本節課幫助我們完成角色移動,該移動基於來自另一個數據源的值。現在我們使用的是我們自己輸入的資料,但很快我們將從我們的資料庫中獲取這些資訊。這只是從資料庫讀取的下一級,它將幫助你瞭解角色移動的基本原理,然後才能新增 SQL 的複雜性。

現在的問題是:我們可以在玩遊戲時更改地圖嗎?假設,我們希望角色找到寶藏後不是結束遊戲,而是進入新地圖。這聽起來很容易,但地圖越多,難度就越大!

你有沒有注意到製作自定義地圖需要多長時間?我們不想為遊戲中所有關卡都這樣做。我們需要更快、更強大的東西,這讓我們想到了下一節課。

在下一節課中,你將學習如何從檔案中動態載入不同的地圖檔案到地圖陣列中,而無需將其鍵入角色頁面。這樣一來,我們就可以讓角色在找到寶藏後轉移到另一個地圖。此外,我們將建立一個地圖編輯器,以便我們可以快速輕鬆地製作地圖檔案。

完成這兩項工作後,我們就可以繼續將所有角色移動新增到資料庫表中,直接在資料庫中建立地圖並儲存它們,以及讓我們的角色使用梯子在地圖等級之間上下移動。

下一章

[編輯 | 編輯原始碼]

閱讀下一章

華夏公益教科書