OX論壇
Would you like to react to this message? Create an account in a few clicks or log in to continue.

RGSS之Array(組數)的運用

+2
愚零鬥武多
6 posters

向下

RGSS之Array(組數)的運用 Empty RGSS之Array(組數)的運用

發表  愚零鬥武多 周三 4月 09, 2008 10:51 pm

前言:
今天要講的是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◆◆◆◆◆◆◆◆◆◆◆◆◆

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

文章數 : 421
注冊日期 : 2008-04-06

回頂端 向下

RGSS之Array(組數)的運用 Empty 回復: RGSS之Array(組數)的運用

發表  嵐 周日 8月 24, 2008 3:27 pm

完全不懂 (汗)

可以出一篇術語解釋嗎@@?

組數是什麼 我看不懂
嵐
運送彩色內褲的貨車司機
運送彩色內褲的貨車司機

文章數 : 92
注冊日期 : 2008-07-09

回頂端 向下

RGSS之Array(組數)的運用 Empty 回復: RGSS之Array(組數)的運用

發表  盼月 周二 8月 26, 2008 4:50 am

如果我可以看懂的話...
我想這功能應該會很方便吧..0.0||

雖然不知道此功能可以套用在哪方面..XD ~~~ 謎:明明就不懂!!飛踢 =0)) @ 0 @) ;.:':";.
盼月
盼月
拿著衝鋒槍瘋狂掃射的瘋子
拿著衝鋒槍瘋狂掃射的瘋子

文章數 : 130
注冊日期 : 2008-08-10
年齡 : 37
來自 : 葡萄糖

http://www.wretch.cc/mypage/seexlive

回頂端 向下

RGSS之Array(組數)的運用 Empty 或許我太笨了...

發表  ★暒星☆ 周五 8月 29, 2008 2:13 am

看不懂...
最大問題是有些剛好看懂,
但是不會應用在實際的RGSS裡面!
例如:有一個提到1..100
也不知道RGSS能用在哪邊...
★暒星☆
★暒星☆
拿著木劍的戰士
拿著木劍的戰士

文章數 : 28
注冊日期 : 2008-08-28
年齡 : 31

回頂端 向下

RGSS之Array(組數)的運用 Empty 回復: RGSS之Array(組數)的運用

發表  雲的彼方 周五 8月 29, 2008 2:59 am

★暒星☆ 寫到:看不懂...
最大問題是有些剛好看懂,
但是不會應用在實際的RGSS裡面!
例如:有一個提到1..100
也不知道RGSS能用在哪邊...

很多地方都要用到Game_Screen類就有用到
內建的模組裡也有用到
假裝你要一次做好幾個相同的物件(譬如說你說的100個)
你就可以用
@object_arr = []
for i in 1..100
@object_arr[i] = class.new
end
要更新的話
for i in @object_arr
i.update
end

雲的彼方
拿著木劍的戰士
拿著木劍的戰士

文章數 : 48
注冊日期 : 2008-08-09

回頂端 向下

RGSS之Array(組數)的運用 Empty 回復: RGSS之Array(組數)的運用

發表  @~刀光劍影~@ 周五 8月 29, 2008 11:37 am

看過Ruby的書籍,有介紹破壞性的方法,他是在執行動作(不知形容對不對)後加驚嘆號(!)
如以下愚大寫的範例,不知道有加驚嘆號和沒加的差別在哪?
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]
@~刀光劍影~@
@~刀光劍影~@
運送彩色內褲的貨車司機
運送彩色內褲的貨車司機

文章數 : 58
注冊日期 : 2008-06-06
年齡 : 29

http://blog.yam.com/r901042004

回頂端 向下

RGSS之Array(組數)的運用 Empty 回復: RGSS之Array(組數)的運用

發表  雲的彼方 周五 8月 29, 2008 6:19 pm

exit跟exit!有什麼差別嗎?

雲的彼方
拿著木劍的戰士
拿著木劍的戰士

文章數 : 48
注冊日期 : 2008-08-09

回頂端 向下

回頂端


 
這個論壇的權限:
無法 在這個版面回復文章