t9540513

從零開始寫出屬於自己的腳本 - 透過陣列做到隨機抽獎

發表於 2023-1-27 17:38:39
t9540513 發表於 2023-1-27 17:38:39 | 顯示全部樓層 |閱讀模式
001.png

本篇教學會教各位腳本所有構成跟詳細寫法,會有詳細的圖文教學,
在教學的過程中,會跟大家介紹每個區段與函數在做什麼


先給大家看看實際抽獎的效果

002.png

這裡不直接貼給大家完整寫法,我用別種腳本,透過改寫,寫出我要的功能,
這邊會教大家整個改寫過程。

請各位先下載教學檔   楓葉兌換.rar (1.63 KB, 下載次數: 1765)

【教學開始】

首先我們先確定這個腳本要做什麼
NPC會有簡單的介紹 → 介紹看完後直接抽獎並顯示抽到的內容。

知道腳本方向後,就能開始改寫了。

003.png

紅框處是用不到的地方,先砍掉。

004.png

接著看到陣列內容,綠色的地方名稱可以自訂,並沒有規定要叫什麼名字。
而這邊有個ˊ觀念,每一種開始括號 "「 " 一定會有結束括號 " 」",不曉得什麼意思的話,
請滑鼠點擊括號位置,軟體會告訴你該括號與哪個括號有關聯。

005.png

看到紅線處,這就代表這個區段內的所有東西,都屬於這個括號在跑的。



接著我們繼續看到陣列內容,紅框處的地方,是每個陣列內參數要有的數值," 兌換物 " 這個已經被砍掉了,
所以等等要刪除,我們現在要思考抽獎的內容要達到什麼功能 1. 要有道具代碼 2. 要有物品數量 3. 要有物品天數
這代表每個陣列內要有三種數值,結合以上改出來會長這樣。


005.png

定義的名稱我修改了,陣列內容我也改掉了。
接著我們要寫出隨機抽獎的功能。

007.png

這邊請看紅框處,在兌換腳本中,有一個奇怪的方法,這段方法的整體架構請不用理解太多,
但這邊教大家如何粗略理解,在 getRandom 這個方法中,他會要一個最小值 " min "跟一個最大值 " max "
這個方法會在這之間抽出一個數字。

那該抽出哪個區間的數字呢?我們要寫出來告訴程式,這就是綠框處在做的事。

var ItemRandom = getRandom(1, 10);

ItemRandom = 自訂的名稱
getRandom(1, 10) = 調用方法,其中最小值是 1 最大值是 10,會抽出這之間的數字。

了解這方法的用法後,我們就可以開始改了,但只需要改綠框處。

008.png

這邊綠框處我們改成抽 0 ~ 4 這區間的數字,但為什麼會這樣抽?
原因在於紅框處的陣列數目。在介紹之前,要跟大家講一個觀念,程式是從0為開頭,並不是從1開始。
因此我們看到紅框處的陣列數目並不是1、2、3、4、5個,而是0、1、2、3、4,總數一樣是5種,
但起始的計算數字不一樣。

009.png

然後我們看到方法 start 通常腳本開頭都會有這個,而這邊為什麼要這樣寫不多介紹,
請大略知道這個方法是告訴 action 他的起始參數是多少就行。

接著就要開始刪減了,由於我們的腳本只是簡單的對話+抽獎,所以有很多不必要的需要砍掉。

010.png

每個腳本幾乎都一樣 if (status == 0) 都是腳本的開頭,他會跑的內容就是他括弧的內容,
與陣列括弧邏輯相同,一個左起始一定會有一個右結束,就如下圖一樣。

011.png  

至於括弧的種類,這就是JAVA既定的寫法,請死背。



我們在看到綠線處,因為是腳本的開頭,因此我們知道他是顯示對話的,而為什麼遊戲會知道這邊該顯示對話,
也是因為有調用函數 sendNext 。網站有很多函數用法,可以參考這篇 大部分服務端通用的函數作用大全
當然,網站還有很多篇函數介紹,都可以參考。

我們將綠線處的文字改成我們要的後就像這樣

012.png

然後紫框處是用不到的,我們先砍掉。
至於砍的範圍,就是那個括弧的範圍連同括弧都要刪掉。

013.png

else if (status == 2) 這裡面的內容是有關指定陣列內容的部分,我們要用到這裡的東西,
但有些是不必要的。
紅線處 if (store) = 這裡要判斷 store 裡面的內容,如果單寫 store 本身並沒有意義,是在上一段中有寫出 store 他是什麼。
但那一段已經被砍掉了,所以這邊用不到因此砍掉。

綠線處 switch (selection) 是另一種寫法,仔細看這邊指定了很多原先陣列有的東西,但那些陣列大多沒用了,所以這邊也用不到。

粉紅線處 selection2 = selection; selection2 被指定了 selection 裡面的值,如果 selection 是 2 那 selection2 就等於 2
此處也用不到,砍掉。

咖啡色處 if (storeInfo.length == 0) = 會判斷 storeInfo.length 這是不是空值。這段用不到砍掉。

深咖啡色處  for (var i = 0; i < storeInfo.length; ++i) 這是一種迴圈寫法,詳細我也不會解釋,但請看到  storeInfo.length ,
他會一直印出 storeInfo.length 裡面的東西,而 storeInfo 如果有印象的話,可以看到綠線處,他被指定的內容就是那些陣列內容。

綠框處 = 這邊請留下,這裡是指定陣列內容的地方。

改完後會長這樣。

014.png

這裡請注意到紅線處,刪減完後,else if (status == 2) 的括號內容,應該是正確的保住裡面的程式碼,而不會包到其他內容。

016.png

上面所有畫線的地方,都是用不到的,請全部按照他括弧的範圍刪除。

017.png

這邊是整個刪減完的初步模型。
我們下一步就要開始告訴腳本,玩家抽獎該怎麼抽與怎麼拿獎品

019.png

紅線處是定義名稱,可以自己取自己好記的名字。
綠線處是這個定義裡面會有什麼,我們看到他代表 storeInfo[0] ,
首先 storeInfo 我們已經知道他會被指定某個陣列內容,
因此我們可以將他改寫成  " 被抽的寶物 "

020.png

為什麼會叫做 " 被抽的寶物 " 因為原先陣列就是這樣命名

021.png



我們再來看到綠線處的 裡面的 i 他會是一個值,告訴程式要挑第幾個種類的陣列內容。
但由於 i 原先的迴圈被刪除了,我們要重新告訴程式他該怎麼挑選道具,
這邊就要用到開頭寫的 ItemRandom 功能,他會隨機從 0~4 中挑選一格值,
改寫完會長這樣

022.png

我們再看到紅線處旁邊的 [0] ,這邊是說明我們要找到這個參數中的第幾項,
透過白話文解釋的話就會是,「請程式幫我抓取,被抽的寶物中的第 ? 項的第 0 個內容物」
這邊假設 ItemRandom 是 0 ,那就會是 「請程式幫我抓取,被抽的寶物中的第 0 項的第 0 個內容物」
為了更好方便各位理解,我做成一個圖做介紹。

023.png

紅色是大類,也就是 ItemRandom 會抓到的值,綠色則是大類中每個小類的順序。
因此 「請程式幫我抓取,被抽的寶物中的第 0 項的第 0 個內容物」 = 4460007

瞭解這個觀念後,我們就能改寫成我們要的樣子

024.png

現在已經指定好隨機數了,我們就能開始實現給道具的功用

我們要使用函數 gainItem 這個功能,這個函數在源碼中的功能解釋是這樣 gainItem(代碼、數量、天數)
至於你的端口有沒有這樣的方法,就要各位自己翻源碼了,這邊假定你的端口有這功能,那麼就能這樣寫。

026.png

接下來,我們再給予一些文字介紹點綴一下。

在介紹前給各位一篇文章,能幫助各位大概理解 java 一些基礎語言。
JAVA 基礎運算子分享 快來創造更豐富有趣的腳本

上面的一些用法例如 += 或 = 都有詳細解釋。

027.png

紅線與綠線處都是一個區間,但為什麼會這樣使用,就要參考端口腳本寫法公式
在上方的  大部分服務端通用的函數作用大全  就有解釋到那些#配合字母會有什麼效果。
理解後我們就可以改成我們要的樣子,裡面的 wepId 跟 wepIdcost 已經被我們改名賦予了不同名字,

028.png

而我們還想顯示天數,但有些天數是 -1 如果顯示 -1 會很醜,因此我們要使用一個 java 語言寫法
?: = 條件選擇

寫完會長這樣

029.png

這裡告訴程式,如果 抽到的道具數量天數的值 大於 0 ,就跑 ()括弧內「 : 」 的左邊內容,也就是紅線處。
如果不是就跑「 : 」右邊的內容,右邊我沒寫任何東西。

030.png

接著紅線處的 storeText 所有 += 內容,會累積起來統一被綠線處的對話函數 sendSimple 顯示出來。

效果長這樣

031.png




這樣就完成了整篇透過陣列去抽獎的腳本,如有問題再提出。

瀏覽 4072 回復 2

您需要登錄後才可以回帖 登錄 | 註冊會員

:學起來了 謝謝分享 2023-01-30 08:00回復
:谢谢分享,很详细 2023-01-28 09:29回復
返回頂部