導航:首頁 > 源碼編譯 > 星際爭霸演算法

星際爭霸演算法

發布時間:2024-07-31 14:59:46

❶ 星際爭霸2的尋路演算法思路是怎樣的

首先地圖整體開始前,會用多層可達矩陣演算法,算出路徑關鍵點
2,創建關鍵節點可達矩陣
3,再每個兵當前位置對關鍵節點進行路徑計算
這樣可以最小化資源佔用就可以完成路徑計算了,高數的離散數學,挺容易解的

❷ 人工智慧有無可能打《星際爭霸》,贏一個星際的高手

人類是不可能戰勝ai的。大道理不說,圍棋是人類的游戲,ai贏了,星際爭霸是電腦的游戲,在人家的地盤上,你還搞毛毛啊。

人類能操作兩線作戰的,就是高手了,能操作三線作戰的,我在自己的游戲生涯中沒有見到,可能世界頂尖高手能做到吧。我拿我早期的一個游戲實例說明下,lost temple,pvz,z一隊刺蛇在地圖中央,和p的叉子,電兵周旋,你不動他就打你,你打他就跑,趁你不注意,點死你一個兵就跑,p無奈了,在他忙於操作這里的時候,家裡被Z空投了。

還有一次,TV,被進攻的T和進攻的T兵力相當,進攻的T用雷達掃了下對方,發現他的機槍和MM在門口集合,雙方兵力相當,可能防守的還多些,進攻方打了下興奮劑,護士加上血,直接a過去了。對方發現的時候,如果不打興奮劑,死得很慘,打興奮劑是30血的槍兵對40血的槍兵,也是很慘。。。。

如果是ai,他會把這些發揮到極致,操作6個槍兵打4個XX絕對和玩一樣。所以,這個ai和人類打星際的新聞有那麼一句不知道你們注意看了沒有。ai製作方要制定一個規則,這樣才能和人類公平的競技。所以說,人類選手面對的是一個被限制的ai,這樣人類才有取勝的可能。

❸ 星際爭霸2編輯器這個隊伍怎麼設置想要設置一個2打4的對局2個人機敵方人員4個玩家攻擊他

製作一個最簡單的塔防地圖

在本教程中,你可以通過跟隨教程製作一個簡單的塔防地圖,來了解一些製作炮塔防禦類地圖的相關知識。

注意,本教程假設你已經看過以下二篇暴雪官方教程,或已具備同等的基礎知識:

地形模塊、觸發模塊

以上二篇教程介紹了星際爭霸II編輯器中繪制地形和使用觸發器的最基本知識。了解它們是學習本教程的先決條件。

關於TD(塔防)地圖

就本質上來說,TD(炮塔防禦)地圖是很簡單的東西,簡單到連簡陋的星際爭霸I地圖編輯器都可以把它做出來。最初的塔防地圖就是星際爭霸I裡面的,它在星際爭霸I和隨後的魔獸爭霸III平台上不斷發展,最終變成了一個獨立的游戲類型。

雖然現在TD游戲已經衍生出各種各樣的風格,但是說到底TD就是:玩家通過建造炮塔來防守電腦不斷刷出來的兵。在通常TD游戲中,玩家方會有一些關鍵建築物,被摧毀就算輸。而有些TD游戲不一定有勝利條件,某些無限刷兵的TD玩的就是比誰撐得久。但是這些都不是規定死的,基本上,只要符合玩家通過建造炮塔來防守電腦不斷刷出來的兵這一點的地圖都算TD,其餘的規則可由作者隨便定義。

所以,本教程就圍繞這個核心規則,來帶大家製作一張最簡單樸素的單人TD地圖。這張地圖將包含兩條電腦進攻路線,每一波共100個怪物。玩家使用光子炮進行防守。勝利規則很簡單:撐過所有9波攻擊。失敗規則為關鍵建築物(神器)被毀。

當然,這張地圖僅僅是一張製作塔防的入門教程,所有兵種數據皆採用默認,請勿指望本地圖有什麼平衡性可言。有興趣的同學可以在平衡性方便自行探索。


准備地形和主角

由於本教程並不是地形教程,所以關於如何繪制地形的部分,大家可以參考官方教程《地形模塊》。但是這里我也會對關鍵部分做一些說明。下面給出我用來演示本教程的地圖所採用的地形圖片。這張地形圖僅僅是一個例子,大家完全可以按照自己的喜好來繪制自己的TD地圖的地形。要注意的也就2點:1]確保我們構造的道路足夠寬,免得電腦連路都走不進來。2]炮塔可以建造的那些位置必須能確實地攻擊到電腦部隊的進攻路線。

注意:如果你想要完全按照本篇教程的步驟來進行每一步操作,請務必在創建地圖時選擇搭載「戰役」Mod。具體搭載戰役Mod的方法,在官方教程《地形模塊》中已有說明。

本教程為單人TD地圖,但是設計了兩條攻擊路線。所以我們能在地圖上看到2條通往中心的路。我們還可以看到,大路的上方和下方都有延伸出來的馬路部分,電腦部隊將創建在這里,並一路侵入中心部分。而在實際游戲中,我們會讓玩家看到的區域比這里略小一些。這樣,在玩家眼中,我們創建的電腦部隊就好像是從地圖外走進來的了。

我們可以直接在地圖中心擺上我們想要防守的關鍵建築物。這里我們選用的是戰役中出現過的大殺器:薩爾納加神器。

選中它並沒有什麼特殊原因,僅僅是因為我們可以在危急的時候使用神器的全屏秒殺技能:能量新星來救場。畢竟本地圖僅僅是個教程示例,所以游戲難度是很低的。如果想要適當加大游戲難度,大家可以選用別的建築。

由於本地圖分為了2層。而下層是電腦的進攻路線。而我們不希望玩家可以在下層建造炮塔,否則會阻塞電腦的進攻路線(本地圖中的炮塔設定為無敵的,無法被攻擊)。所以我們需要進入地形編輯器的路徑層,來畫出我們禁止建造建築的區域。

通過地形模塊菜單中的層->路徑來進入路徑層(或者按快捷鍵H)。然後在地形模塊左側的地形筆刷中選擇添加路徑,類型為不可有建築物。


然後我們就可以用筆刷在地圖上塗抹禁止建造建築物的區域了。如下圖將整個下層區域全部填滿即可。

另外,神器的周圍也必須禁止建造建築,以免玩家用炮塔將神器圍住。


保險起見,我們需要在周圍的河道里也塗上禁止建造的筆刷,免得玩家把炮塔造到河裡。弄得不倫不類。

最後,我們在地圖上放上我們用來建造炮塔的農民,我們這里選用Protoss的探測器。注意,這里我們把農民和神器都歸到玩家1。


接下去,我們要為後面的刷兵觸發器指定兩個刷兵點。點擊菜單中的層->點,然後在地圖的上下兩個入口放下兩個點。


然後我們來進行觸發模塊中的最後一項操作。上面已經提過,我們要縮小玩家實際看到的地圖范圍,讓玩家看到的電腦部隊看起來像是從地圖外走進來的那樣。於是我們就需要畫好玩家的可見區域,把上面的兩個刷新點排除在該區域外。點擊菜單中的層->區域,進入區域層。

然後新建一個區域,命名為Game Region,覆蓋我們想要讓玩家看到的部分,我們之後會使用觸發器來將玩家的鏡頭限制在這格區域。(注意,由於鏡頭角度關系,玩家實際在游戲中可以看到的部分會比我們畫出的略大,所以我們在畫區域時要稍微畫小一些。)

玩家屬性

本地圖中,我們將把左路和右路進攻的電腦分成2個不同的玩家。所以這張地圖里總共需要一個真人玩家和二個電腦玩家。

使用菜單中的地圖->玩家屬性來對玩家屬性進行設置。將玩家1的種族設為人類,控制者設為用戶,玩家2和3的控制者設為電腦。


數據模塊

由於這是個簡易教程,所以我們不會對地圖中的兵種作任何平衡性設定,而是直接採用默認數據。但是一些基本的數據更改還是必要的:在本地圖的設計上,我們使用光子炮來作為防禦用的炮塔,而且炮塔和農民都必須是無敵的。我們使用的Protoss農民必須可以在場地上快速飛行,同時不會阻塞到進攻路線上的電腦部隊;而且它必須只能建造光子炮,無法建造任何其它建築。因此我們還是得拜訪一下數據模塊。

在菜單中,點擊模塊->數據就可以打開數據模塊。我們在數據類型那一欄中選擇「單位」就可以打開單位數據頁。我們在這里使用搜索功能來搜索來找到Protoss的農民:


我們可以看到右側的屬性列表列出了它的所有屬性。這里,我們修改它的UI - 高度屬性為1,這樣我們的探機看起來就是懸浮在半空的了。並將移動 - 碰撞屬性設為飛行,移動 - 移動器屬性也設為飛行,這樣探機就會真正地可以飛行,也不會擋住地面單位了。為了讓探機能在場地上快速移動,我們再將它的移動 - 速度屬性設為5。

注意:如果你看到的數據模塊右側窗格的數據並不是以列表模式顯示的,請將右側窗格上方的5個按鈕全部按下。


我們對探機的設置還沒有結束,我們找到探機的單位 - 標旗這一屬性,在彈出的對象值窗口中勾上無敵,這樣,探機便無法被傷害了。


我們還需要修改一下探機的命令面板。由於這個游戲里,探機只需要建造光子炮。因此我們可以完全拋棄建造頁面按鈕和採集按鈕,直接把建造光子炮的按鈕放到探機的默認按鈕頁里。下圖是我們希望實現的效果:


按照以下步驟來實現:

在數據模塊中找到探機的技能 - 命令面板屬性並雙擊之,可以看到一個設置命令按鈕的對話框。


我們選中第二行和第三行的所有按鈕,將它們全部刪除(點擊圖中的紅色X按鈕)。

然後選中左下方的空白格,點擊對話框上的綠色+X按鈕來新建一個按鈕。使用的按鈕為「折躍光子炮台」。並按照下圖所示對命令按鈕、技能、技能命令三項進行設置。這樣便可將該按鈕與折躍光子炮技能相綁定。


但光這樣還不能直接建造光子炮台。默認狀態下,光子炮必須在建好鍛爐以後才能建造。我們同樣需要去掉這一限制。

我們選中探機,並在數據模塊左下角的關聯瀏覽器窗格中選擇技能分類下的探機 - 折躍(探機)這一技能(如下圖所示)。


雙擊其技能 - 信息 +屬性。在跳出的對話框中雙擊折躍光子炮台。


在跳出的建造信息對話框中,點擊所需條件下面的紅色X按鈕。這樣既可將建造光子炮台的前置條件清空並點擊確定。:


於是,探機的修改已經完成了,我們尚需要對光子炮台本身進行修改。

我們在數據模塊中找到光子炮台,並如法炮製地將光子炮台設為無敵的。


但是我們的光子炮台並不只需要無敵,默認的光子炮台無法建造在水晶矩陣之外。而我們的地圖要求光子炮可以建造在任何地方,因此要去掉只能建造在水晶矩陣內的限制。

找到光子炮的行為 - 行為 +屬性。將其中的能量使用者這一行為刪除,只留下偵測單位和正在建造。


這樣,建造光子炮台所需的一切限制都已被去除了。我們在數據模塊的工作也已經結束。差不多該開始考慮觸發器的編寫了。

觸發器框架構思

在動手編寫觸發器之前,我們先來考慮一下我們希望用觸發器來做些什麼,並將它們分一下類。

以本地圖為例,我們要做的事情大致有三大塊:

一、地圖初始化觸發器

所謂地圖初始化觸發器,即是地圖在載完畢後要做的一些准備工作。 這一部分中要做的工作很雜,大體上有清除戰爭迷霧、開啟電腦的自殺性進攻AI、設置電腦的結盟關系、給玩家初始資金、顯示一個刷兵的倒計時,並設置一些全局數據(比如電腦每一波刷兵時具體要刷什麼類型的兵)。

在本地圖中,我們計劃用一個名為Init的觸發器來做這些准備工作。

二、電腦的刷兵與進攻

這是本地圖的核心觸發。正如本文最初所說,TD地圖的核心就是拿炮塔來防守電腦刷出來的兵。造炮塔的工作是由玩家完成的,所以我們只需要讓觸發器負責刷兵,並讓他們進攻既可。在這張地圖的設計中,電腦總共會發動9波攻擊,每波100隻怪物,左路和右路各50隻。怪物的強度隨著波次增加。

第一波:跳蟲

第二波:爆蟲

第三波:蟑螂

第四波:刺蛇

第五波:屠獵者

第六波:畸變體

第七波:雷獸

第八波:莽獸

第九波:王獸

當然,這是個簡易的教程,以上兵種採用的都是默認數據。大家若想要做一個平衡的TD地圖的話,尚需好好地考慮兵種數據的設置問題。

另外,本地圖打算使用這樣的刷兵規則:在前一波怪物死光後再等待20秒鍾才會刷下一波怪。

我們計劃用一個名為WaitForNextWave的觸發器來判斷目前這波怪物是否已死完,然後進行20秒倒計時。並在倒計時結束後用一個名為SendWave的觸發器來刷下一波兵。

那進攻觸發呢?其實我們並不需要在每一波怪物刷新後用觸發器讓他們進攻。我們只需要在地圖初始化時准備一個自殺AI。那樣電腦就會隨時派出手頭的全部兵力對玩家進行自殺性攻擊。

三、勝利、失敗觸發器

確切地說,我們只需要一個失敗觸發器。在神器被毀以後讓游戲失敗。而玩家的勝利判斷可以放在混合進上面的WaitForNextWave觸發器中。因為WaitForNextWave會判斷目前這波怪物是否已經死完。這樣,只要在判斷這個的時候附帶判斷一下目前這波怪物是否已經是最後一波,若是,立刻讓玩家獲勝既可。

我們計劃用一個名為Defeat的觸發器來進行失敗判定。

觸發器的編寫

我們正式開始編寫觸發器:

一、地圖初始化

在這一段,我們來實現Init觸發器。在這個觸發器中,我們要清除戰爭迷霧,然後把玩家1的鏡頭限制在Game Region區域內,給玩家1初始啟動資金。開動兩個電腦玩家的AI,讓他們一直進行自殺性攻擊。當然,為了避免兩撥電腦自殺殘殺,我們還需要讓它們結盟。最後,設置好刷兵數據,並開動第一波刷兵的倒計時(20秒)。

接下來我們來按部就班地編寫這個觸發器:

由於在這格觸發器中,我們要開啟一個20秒的倒計時,還要把倒計時給顯示出來,所以我們需要一個計時器和一個計時器窗口,還要准備兩個全局變數來記錄它們。

新建兩個全局變數,分別取名T和TW。T的類型為計時器,TW為計時器窗口。初始值保留默認。


我們還需要一個全局數組來保存我們每一波要刷新的怪物的單位類型。所以再新建一個名為WaveType的全局變數,類型為「單位類型」。並勾上數組的鉤子,然後在大小的第一行中填上100。


這樣意味著我們新建了一個容量為100的單位類型數組。可以保存最多100波怪物的單位類型。當然,在本地圖中我們只需要保存9個。

准備完全局變數後,我們就開始編寫Init了。新建一個觸發器,起名Init。事件為地圖初始化。代表本觸發器的動作全部都在地圖載入完畢後執行。

先讓大家預覽一下Init觸發器最終的樣子:


-動作

在前二句中,我們使用啟用或禁用可見性這條動作,分別將黑色遮罩和戰爭迷霧禁用掉。這樣,我們在游戲里就看不到戰爭迷霧了,相當於打了地圖全開秘技。因為戰爭迷霧在這個游戲里毫無意義。

在第三句中,我們使用設置鏡頭界限這個動作來將所有玩家的鏡頭限制在Game Region區域內。以下為該動作的參數詳情:

設置鏡頭界限

玩家: 所有玩家

界限: Game Region

小地圖: 執行

小地圖參數設為執行,這樣我們在限制玩家游戲區域的同時,也會影響到玩家的小地圖,玩家的小地圖將只顯示玩家能看到的那一部分地形。

第四句,使用動作為玩家啟用戰役AI來為玩家2(電腦)啟用AI。

第五句,使用動作全局自毀來讓玩家2進行自殺性攻擊,只要全局自毀開著,玩家2將會不斷地派出自己手頭的所有兵力來進行自殺性攻擊,所以每一波進攻的時候,我們只需要給電腦補充兵力,具體進攻的命令AI會自己來完成。

第六第七句重復以上兩句,對玩家3如法炮製。因為我們有2個電腦玩家。

第八句,使用修改玩家屬性動作來修改玩家1的初始晶礦數量。這里設為600。因為每個光子炮需要150晶礦,所以開局時,玩家可以造4座炮塔。該動作的詳細參數如下:

修改玩家屬性

玩家: 1

屬性: 晶體礦

運算: 設為

值: 600

第九句,使用設置同盟動作來讓兩個電腦玩家結盟,以免它們在地圖中央交匯以後開始自相殘殺。

設置同盟

源玩家: 2

目標玩家: 3

同盟設定: 以共享視野的方式結盟

第十-十八句,我們在這里用設置變數動作來預先設定好每一波要刷的怪物的類型,方便後面的刷兵觸發來調用。

變數 -設置WaveType[1] = 跳蟲

變數 -設置WaveType[2] = 爆蟲

變數 -設置WaveType[3] = 蟑螂

變數 -設置WaveType[4] = 刺蛇

變數 -設置WaveType[5] = 屠獵者

變數 -設置WaveType[6] = 畸變體

變數 -設置WaveType[7] = 雷獸

變數 -設置WaveType[8] = 莽獸

變數 -設置WaveType[9] = 王獸

注意,這里為方便起見,我們從下標1開始賦值,WaveType[0]留空。

第十九句,我們使用開始計時器為第一波怪啟動一個20秒的倒計時,使用的計時器為我們剛才新建的那個計時器變數。

開始計時器

計時器: T

重復: 一次性

時間類型: 游戲時間

持續時間: 20.0

在後面的觸發器中,我們還會重復利用計時器T,在每一波怪物被消滅之後,下一波怪物刷新之前進行20秒的倒計時。

第二十句,雖然我們已經建立了一個計時器,但是不以計時器窗口來把它的時間顯示出來的話,玩家是看不到的。所以我們用創建計時器窗口來創造一個計時器窗口。

創建計時器窗口

計時器: T

標題: "下一波攻擊倒計時"

已流逝: 剩餘的

可見的: 可見

這樣,在地圖初始化時,屏幕右上角就會出現一個標題為"下一波攻擊倒計時"的窗口,並顯示剩餘時間。

本觸發器最後一句動作,用變數TW來把剛才創建的計時器窗口記錄下來,這樣,以後就可以隨時對這個窗口進行顯示和隱藏的操作了。

變數 -設置TW = (上一次創建的計時器窗口)

二、刷兵間隔觸發器

在這一段,我們來實現WaitForNextWave觸發器在每波怪物死光後發動,為下一波攻擊啟動一個20秒的倒計時。如果最後一波攻擊死光,那麼立刻讓玩家獲勝。

要判斷當前這波怪物有沒有死光,我們需要一個全局變數來記錄別的刷兵觸發器所創造的攻擊部隊,以便WaitForNextWave觸發器檢查這個部隊里的剩餘人數。

於是我們新建一個名為AttackingGroup的全局變數,類型為單位組,初始值留空。


我們還需要兩個整數變數,一個記錄目前的這次攻擊是第幾波攻擊。另一個決定這場游戲總共會創造幾波攻擊(本地圖設定為9)。因為WaitForNextWave中需要進行一個勝利條件判定,看目前死完的這波怪物是否已經是最後一波。

於是我們新建一個名為WaveNumber的整數類型變數,初始值為0,一個名為WaveCount的整數類型變數,初始值為9

為了管理方便,我們新建一個名為Wave的觸發器文件夾,以後刷兵相關的觸發器和變數都放進這個文件夾。我們把AttackingGroup、WaveType、WaveNumber、WaveCount這四個變數全部都拖進去。

然後我們正式開始編寫WaitForNextWave觸發器。新建一個名為WaitForNextWave的觸發,拖動到Wave文件夾里。

下面是WaitForNextWave觸發器最終樣子的預覽:


-事件

我們使用任意單位死亡作為事件,因為單位組死光必定是以最後一個單位死掉為契機的。

-條件

我們使用單位組中的單位數量函數來計算AttackingGroup中活著的單位,如果為0則代表AttackingGroup(目前進攻的這波怪物)已經死光。這樣才執行我們設定的動作。

-動作

先使用開啟或關閉觸發器動作來關閉當前觸發,以免這個觸發器在不恰當的場合下被觸發。

然後我們使用If Then Else來進行一次勝利條件判斷。就是看當前死完的這一波怪物的是否就是最後一波怪:即判斷WaveNumber==WaveCount。如果確實相等,那麼立刻讓玩家1獲勝。

如果還不是最後一波,那麼重新顯示(因為在後面的觸發器中,我們會在計時器T走到0後隱藏掉這個計時器窗口)計時器窗口TW。並重新啟動計時器T,進行20秒鍾的倒計時。

顯示TW用的是顯示或隱藏計時器窗口這個動作。

顯示或隱藏計時器窗口

玩家: 所有玩家

顯示: 顯示

窗口: TW

啟動T的動作和初始化時啟動T的動作完全一樣,只要復制過來即可。

三、

刷兵觸發器

在這一段,我們來實現SendWave觸發器。這個觸發器將在計時器T每次走到0時發動。為電腦玩家創造出下一波部隊。由於我們已經在地圖初始化時開啟了兩個電腦的自殺性攻擊開關,因此在創造部隊以後無需用觸發器來命令他們進攻,他們會自己一個個地排隊沖向我們的神器(因為這是地圖上唯一一個可以攻擊的目標)。

不過這不是本觸發器唯一要做的事情。作為TD地圖,我們需要一個收入資金的渠道,否則無以在游戲進行中建造更多的炮塔。一個最常見的收入方式便是殺怪得錢。只是,通常來說要改怪物掉落的晶礦,需要去數據編輯器里進行調整,而我們這里有9種怪物,一個個改有點麻煩。因此我們這里一並用觸發器來解決了,在創建怪物的時候,一並設置好殺死它們所獲得的晶礦數量,並設定一個每一波怪的晶礦獎勵數量公式即可。

於是我們開始編寫SendWave觸發器。新建一個名為SendWave的觸發,拖動到Wave文件夾里。

下面是SendWave觸發器最終樣子的預覽:


由於在Init和WaitForNextWave兩個觸發器中都是用計時器T來做倒計時,而計時器到期後要做的事情又都是一樣的(都是刷兵)。所以我們可以用SendWave來統一處理它們的到期事件。

-事件

我們使用計時器結束事件來捕捉計時器T走到0的瞬間。

-動作

第一句,我們使用播放音效動作來給玩家播放警報聲。這是為了方便玩家注意到下一波怪物已經來了。因為玩家不可能一刻不停地注意著屏幕右上角的倒計時窗口。以下是詳細參數

播放音效

玩家: 所有玩家

音效鏈接: UI_TerranKlaxonAlert

音量: 100.0

偏移量: 0.0

第二句,由於刷兵倒計時到了,所以我們需要刷下一波兵,因此我們先得將記錄當前波次的變數加1。使用修改變數 (整數)動作可以簡單地將WaveNumber的值加1 。

第三句,由於倒計時走完了,讓顯示著00:00:00的計時器窗口繼續晾在那兒只有礙眼,而且還會誤導玩家,故而我們在每次計時器走完後,使用顯示或隱藏計時器窗口來隱藏計時器窗口TW:

顯示或隱藏計時器窗口

玩家: 所有玩家

顯示: 隱藏

窗口: TW

接下去要做的工作,我們得在刷兵點A創建50個屬於玩家2的單位,在刷兵點B創建50個屬於玩家3的單位,單位類型為我們在WaveType中事先設定好的當前波次對應的單位類型。然後用AttackingGroup單位組來記錄下這些單位。

閱讀全文

與星際爭霸演算法相關的資料

熱點內容
集合運演算法則差集 瀏覽:303
x2pdf 瀏覽:267
python源碼cs 瀏覽:99
數控機床自動編程軟體 瀏覽:736
方舟的伺服器號是什麼 瀏覽:109
沒有伺服器怎麼發現其他節點 瀏覽:337
文明傳奇怎麼開伺服器 瀏覽:56
javalistint 瀏覽:675
程序員到公司當領導 瀏覽:225
用演算法控制玩家的行為 瀏覽:482
androidsdk17下載 瀏覽:792
怎麼給單獨表格添加密碼 瀏覽:12
下載壓縮密碼 瀏覽:259
android系統上編程 瀏覽:470
單片機模擬i2c從機 瀏覽:238
教育年報系統伺服器如何開啟 瀏覽:842
對稱密鑰加密後的長度 瀏覽:294
微製造編程軟體下載 瀏覽:108
旋住宿酒店用哪個App最好 瀏覽:61
三菱編程中怎麼創建子程序 瀏覽:201