點選上方圖示返回教學區。


 

 

RGSS之Array(組數)的運用

 

前言:
今天要講的是Array(組數)的運用,內容我盡量寫的白話基本簡單,
組數在做系統是非常重要的一個環節....
裡頭有運用迴圈和一些基本語法觀念,請參閱精華區RMXP基礎教學,此處就不再贅述

◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆Begin◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
一般做系統我們都會用到很多"變數"去比較來比較去,但是用內建的事件做實在是有
夠麻煩,代來代去代到自己都眼花了@@,此時我們可以用Array來幫我們解決這些麻煩

◆◆1.組數設定方法◆◆
data = [1,2,3,4,5,6,7,8,9,10]
這樣就是設定一個組數的方法,內容可以是數字,也可以是字串,所以他的實際用途
是十分廣泛的,不過大家看了這麼簡單的東西還要說明?其實這樣的組數是可以做出
很多種變化的,請繼續耐心的看下去
------------------------------------------------------------------
push這個指令是將()內的資料依序添加到數組結尾
例:
a = [10]
a.push(2)
p a # a = [10,2]
push也能添加組數或其他變量
例:
b = [1]
b.push([10,2])
b.push("rmxp")
p b # b = [1,[10,2],"rmxp"]
------------------------------------------------------------------
組數做成資料庫的實際做法如下
data = []
for i in 1..100
data.push($game_variables[i])
end
p data
首先定義一個空組數使data=[]
將i從1循環到100
這樣在p data的時候你就會看到[0,0,2,5,16,55,33,48,77.......]
裡頭有100筆資料,就是從變數1~100所有的值都紀錄在data裡
只要四行就能代入100個變數,有這種方便的功能可以幫你節省很多設定時間
------------------------------------------------------------------
另外用
data = []
for i in 1..100
data[i] = $game_variables[i]
end
做出來的效果跟用push做是一樣的,但是由於push不需去記組數的標記位址,所以在
製作一個新組數上會比直接指定index要來的方便,例:
data = []
for weapon in $data_weapons
if weapon.atk > 125
data.push(weapon.id)
end
end
p data # data = [10,15,16,17,18,19]
蒐尋所有武器,武器攻擊力大於125的武器id就被寫進data裡
再舉例
data = []
for armor in $data_armors
if $game_party.actors[0].equippable?(armor)
data.push(armor.id)
end
end
p data # data = [20,25,26,27,28,29]
蒐尋所有防具,當帶頭角色能裝備這個防具時,防具id就被寫進data裡
再舉例
data1 = []
data2 = []
for actor in $game_actors
if actor.level > 50
data1.push(actor.id)
else
data2.push(actor.id)
end
end
p data1 # data1 = [1,3,4,5]
p data2 # data2 = [2,6]
蒐尋所有資料庫中的隊員
當隊員的等級>50時,隊員id就被寫進data1裡
當隊員的等級<=50時,隊員id就被寫進data2裡

以上範例能夠很簡單的5~6行就能將以往用變數代的半死的指令完全搞定
是不是很歡樂呢?
------------------------------------------------------------------

◆◆2.組數判斷◆◆
有了用組數收集資料的本事之後,接下來就得學會用組數去判讀出你想要的結果
否則只會拼組數卻不會實戰也沒用...
------------------------------------------------------------------
判斷最大與最小值
例:
data = [5,8,6,3,1,5,9,11]
a = data.max
b = data.min
p a # a = 11
p b # b = 1
max顧名思義就是最大,min顧名思義就是最小
------------------------------------------------------------------
數值上下限的限制
我們可以在Game_Battler中發現大量類似的語句:
設定hp加減值:
def hp=(hp)
@hp = [[hp, maxhp].min, 0].max
......下略

假設hp這個值是3000,角色的maxhp=2000
由於[hp, maxhp].min會抓出最小值(等同於[3000,2000].min)=2000
結果就變成[2000,0].max=2000(最大值是2000)

假設hp這個值是-1000,角色的maxhp=2000
由於[hp, maxhp].min會抓出最小值(等同於[-1000,2000].min)=-1000
結果就變成[-1000,0].max=0(最大值是0)

這樣一來就能保證角色hp增加時不會超過最大hp,hp減少時不會低於0
------------------------------------------------------------------
判斷組數是否存在某值
例:
data = [3,4,6,8,10]
if data.include?(8)
p "yes"
end
當data裡有8的時候,秀出"yes"

再舉例:
if $game_party.actors[0].skills.include?(10)
$game_switches[1] = true
end

$game_party.actors[0].skills就是帶頭角色所學會的特技ID資料
本身也是一個組數型態,所以我們可以用include?去判讀出帶頭角色是否學會
ID=10的特技,若有的話將開關1打開
------------------------------------------------------------------
判斷組數的資料數量
例:
data = [2,5,5,3]
p data.size # 4
size顧名思義就是組數裡有幾個資料筆數

再舉例:
if $game_party.actors[0].states.size > 3
$game_switches[1] = true
end
$game_party.actors[0].states就是帶頭角色所附加的狀態ID資料
本身也是一個組數型態,所以我們可以用size去判讀出帶頭角色身上的狀態數量
如果大於3時就將開關1打開

再舉例(取出亂數):
data = [1,4,8,6,2,17]
a = data[rand(data.size)]
p a # a = 組數內隨機亂數

rand這個函數就是求取隨機數用的,rand(2)的結果有0,1兩種可能
data[rand(data.size)]等同於data[rand(6)]
假設rand(6)=3 a = data[3]結果就是6
假設rand(6)=2 a = data[2]結果就是8....
用這個方法就能輕鬆的從組數資料裡挑出隨機數

◆◆3.組數資料整理◆◆
以下說明一些常用到的資料整理技巧,可以讓你更方便的去控制這些資料參數

------------------------------------------------------------------
刪除組數中的資料
例:
data = [1,2,3,4,5,6,7,8]
for i in data
if i % 2 == 0
data.delete(i)
end
end
p data # data = [1,3,5,7]

循環將i值代入組數中的每筆資料
當i可以被2整除時(餘2為0時)就將組數中的該筆資料刪除
最後我們就能得到一個內容完全為奇數的組數
------------------------------------------------------------------
拷貝組數
若你用變數去定義一個組數
例:
data = [2,3]
a = data
data = []
p a # a = []
你會發現奇怪了,為何我明明只是改data的內容,但a為何也跟著變?
別害怕這不是程式本身的bug,而是組數的特有特性,但我要暫存data改變前的值那
要怎麼做呢?
data = [2,3]
a = data.clone
data = []
p a # a = [2,3]
利用clone或dup方法就能夠拷貝組數的內容

再舉例:
在事件中使用腳本指令:
weapon = $data_weapons[1].clone
weapon.id = $data_weapons.size
weapon.name += "改"
weapon.atk += 10
$data_weapons.push(weapon)
b = $data_weapons.size-1
$game_party.gain_weapon(b,1)
$data_classes[1].weapon_set.push(b)

從ID為1的武器(青銅劍)拷貝到weapon($data_weapons本身就是組數型態)
weapon的ID就是資料庫武器數上限數+1
weapon的名字加個改,攻擊力直接+10
獲得這個新武器1隻
職業ID=1的職業(戰士)添加可以裝備的新武器ID
這樣你執行事件後打開道具欄就會發現多了一隻青銅劍改,攻擊力比青銅劍高10
這就是衝武器的簡單範例
如果你不用clone方法可是會把原先的青銅劍也改掉了喔

------------------------------------------------------------------
從尾部依序刪除組數

data = [1,2,3,4,5,6]
for i in 0..2
data.pop
end
p data # data = [1,2,3]
迴圈執行3次後將尾部的4,5,6刪除
------------------------------------------------------------------
從頭部刪除組數

data = [1,2,3,4,5,6]
for i in 0..2
data.shift
end
p data # data = [4,5,6]
迴圈執行3次後將頭部的1,2,3刪除
------------------------------------------------------------------
從小到大進行組數排列

data = [9,6,5,7,3]
data.sort!
p data # data = [3,5,6,7,9]
這會自動比較組數內容大小,並由小到大的順序排列
------------------------------------------------------------------
組數逆排列

data = [1,2,3,4,5]
data.reverse!
p data # data = [5,4,3,2,1]
這會自動將組數的內容全部逆序重新排列
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆end◆◆◆◆◆◆◆◆◆◆◆◆◆

以上就是常用到的組數運用法,雖然都是很基本的東西
部份新手雖然知道有些全域變數代表的意義,但是卻不知要如何去運算數字
和整理製作資料庫來寫系統,學習基本的組數運用是個入門的好方法
這樣總比用變數在那邊代來代去寫一堆條件分歧來的有效率多了

 

   

inserted by FC2 system