4.3 認證規則的內容
4.3.3 基本指令的特性及格式
認證規則是由一連串的基本指令所構成的,這些基本指令就代表了使 用者能對網格所進行的操作或運算動作,包括 GET、CALCULATE、
DIRECTION、INDIRECT、OUTPUT,為了避免使用者對於指令種類過多
38 section_num 目前所在 section,可能值 1~4
39
full_grid_num 目前規則所選定的 grid 編號(全域),可能值 1~36 round 目前為第幾回合的認證,可能值 1~5
這些系統參數被放在規則當中時,就會依當時的情況而代換成對應數值來 使用,其中 round 由於會對應到目前的認證回合數值,有類似 C 語言中 for 迴圈的 i 值(index)的特性可利用,例如搭配稍後會介紹的使用者自訂 String 資料,可以達到每回合的認證規則有些許變化的效果。
Section 和 Full_Grid 就可以當作「範圍」的參數,至於範圍編號就由後面緊 接著的「數值」參數來指定。
因此,範圍類型的參數會有 Grid、Section、Full_Grid、Line、Direction、String 這幾種合法寫法。
其他
數值和範圍以外的資料,例如做四則運算的加減乘除之類的符號參數。
以上就是三種參數類型的介紹,接下來就要舉出各個基本指令的實際
40
格式,一共有五個指令,GET、CALCULATE、DIRECTION、INDIRECT、
OUTPUT。
GET
這個指令的用途就是去找某個範圍內的某個資料,也就是類似模擬使用者 去看某個地方資料的功能,例如 Grid 裡的資料,它的格式如下,而表 2 是 參數內容:
GET data_info1, data_info2 IN area_type, area_number
表 2:GET 指令參數內容
data_info1 data_info2 area_type area_number 描述 數值:1~36
取得目前 Section 中某 grid 的內容
1~string 長 度
41
其他:y (無) 範圍:Line(N) (無) 取得某 Line 回傳 的第三筆資料 如先前所提到,雖然網格上的資料是以字元方式顯示在螢幕上,不過以系 統觀點來看都是 1-36 的數字而已,所以對使用者來說,data_info1 的允許數 值為 1-Z 跟系統觀點的 1-36 是不互相衝突的。而 data_info 由於在表示座標 以外的資料時不一定會兩個參數都用到,因此 data_info2 的部分以括號註明,
而有些參數會有本身的合適範圍,例如普通 grid 編號只有 0-9,使用者設定 參數或是規則運算中當作此參數的數值超出這個範圍的話,會將數值自動 對應回此範圍內,利用取循環回來的方式,像是 10 超過了最大 grid 編號 9,
就當作超過 9 之後又跳回 0,因此 grid 10 就當作 grid 0 來處理。
在表中還出現的一個特殊的範圍指定法,利用 direction 來指定,它的用意 是去指定目前 grid(grid 0)的周圍的其他 grid 的用法,我們在前面的設定 部分介紹到,一個 section 有九個 grid,就類似九宮格一般,而我們給這九 個 grid 的編號就跟鍵盤上 numpad 的排列方式一樣,現在就要依照這種編號 方式來說明 direction 用於指定範圍的情況,假設目前 grid(grid 0)是位在 grid 9 這個位置,當我們用 direction 2(下)來指定位置時,就等於是指定 目前 grid 的下方的 grid 這個範圍,也就是 grid 6,注意,目前 grid(grid 0)
是作為那個回合認證時的基準點,在一回合的認證未完成之前都不會變動,
因為目前設定是只能靠 Next Grid 的運行才會去選擇其他 gird 來當次一回合 的基準點(grid 0),而 Next Grid 是在 Rule 執行完一次後才會跟著執行的,
也就是說我們在同一回合的接下來使用 direction 6(右)來指定位置的話,
一樣是以 grid 9 為基準,只是這次改為指定它的右方的 grid,由於 grid 9 的 右方不存在(同 section 的)grid,此時會採用一個繞回的方式,因此就變 成指定 grid 7,同理當使用 direction 8(上)時,會往上繞回而去指定 grid 3。
42
圖 28:GET 指令範例所用之基本網格
由於前面兩數值參數均有指定,因此是當作座標處理,而後半部參數指定 範圍的部分,則是指定 grid 0,也就是本回合的目前所在位置的 grid,這個 指令就等於去抓目前 grid 中座標(3,4)的地方的資料,如同先前介紹的統一 回傳格式,等於回傳了三筆資料,也就是 D,3 和 4,代表得到的內容為 D,
而其座標在(3,4)這個位置,附帶一提,假如今天的指令為
GET D,”” IN grid, 0
且同樣是套用在上圖的 grid 的話,那麼他回傳的資料一樣是 D,3 和 4。在 這邊要再詳細一點說明關於字元跟數值的關係,由於 GET 回傳的資料中有 字元類的資料,前面有提到說字元資料是對於使用者的觀點而言,實際上 在系統內是把字元當成一般數值,1-Z 對應到 1-36 的詳細對應方式為:
1 2 3 4 5 6 7 8 9 0 對應到 1 2 3 4 5 6 7 8 9 10 A B C D…Y Z 對應到 11 12 13 14…35 36
其中字元 0 不直接對應到 0 的原因是,0 這個資料在網格中被抓出來運算時,
如果當作零的話,用在後續計算上意義不是很大,例如不論何數乘以 0 結 果都是 0,這樣就缺少了由計算來產生多種結果的效果。
CALCULATE
GET 主要是取得某資料,因此 CALCULATE 就是對資料作運算了,這裡的 運算只是單純的兩數值參數作數學運算,格式如下,表 3 為參數內容:
CALCULATE data1, data2, operation
表 3:CALCULATE 指令參數內容
data1 data2 operation 描述
43 CALCULATE 很容易就超過這個區間,超過區間的數當作密碼輸入時沒有 問題,因為密碼是用數字表示,不過當使用者要把區間外的數值當作字元 成存有第一筆資料的字元型態在目前 grid(grid 0)中的座標,所以一般規 則制定雖然不禁止使用者去用 CALCULATE 回傳的第二或第三筆資料,不 過這種用法的實用性有待討論。
DIRECTION data1, data2, grid, num
44
表 4:DIRECTION 指令參數內容
data1 data2 grid num 描述 數值:1~36 數值:1~36 範圍:grid 數值:0~9 使用目前
Section 中的某 grid
數值:1~36 數值:1~36 範圍:full_grid 數值:1~36 使用整個畫面 上的某 grid 數值:1~36 數值:1~36 範圍:direction 數值:1~9 目前 grid 旁某
方位的 grid 以下舉一個例子說明,假設指令是
DIRECTION W, E, full_grid, D
由於他所用的範圍是用全域 grid 型式,因此我們要去看整個畫面上三十六 個 grid 中第 D(數值 14)個 grid 的內容,假設全域編號 14 的 grid 內容如 圖 29:
圖 29:DIRECTION 指令範例所用之基本網格
那麼這個指令所回傳的第一筆資料就是 9,因為由 W 為原點的話,E 在 W 的右上角,也就是 numpad 中 9 的方位,而這個回傳的數字 9 就可以例如拿 去給計算指令用,至於第二筆跟第三筆資料目前則是預留位置而不使用,
假如使用者誤用而去取這第二三筆資料,可以同 CALCULATE 指令的情況 處理。
INDIRECT
45
這個指令是讓使用者去使用間接選取的功能,在前幾節的地方舉過一個例 子,就是用鄰近兩個 section 中的兩個物件來選取目前 section 中某 grid 裡的 資料位置,他所回傳的是兩個物件的位置資訊組合成的座標,以及該座標 對應到此 section 中的字元內容。它的格式如下,參數內容於表 5:
INDIRECT selector1, selector2, target
表 5:INDIRECT 指令參數內容
selector1 selector2 target 描述
數值:1~36 數值:1~36 數值:1~36 target 使用的是目 前 grid 中的資料
這個指令要配合範例才能清楚了解,由於這個指令牽涉到的是 Section 級的 範圍(18x18),為了示意上的簡單,我們用 6X6 的範圍來說明,但套用在 Section 上也是一樣的意思。假如指令如下
INDIRECT S, A, R
表示使用者的目標是目前網格中的 R 字元,然後是用 A 和 S 來進行間接選 取,而我們知道以 Section 的排列方式,周圍只會有兩個 Section 跟自己鄰 近,假設目前網格是在左上的位置,那麼左下和右上的 Section 就是與自己 鄰近的 Section,如圖 30:
46
圖 30:INDIRECT 作用示意圖
從圖中可以發現,我們先找到 R 的位置,並橫向搜尋 S 所在的位置,再來 也是由 R 出發,縱向尋找 A 的位置,這種作法由圖中即可了解,會類似在 用 S 和 A 定位出 R 的位置,因為他們交錯的點正好是 R。
而這項動作一樣會回傳三筆資料,第一筆是由第二和第三筆資料所形成的 全域座標所含的資料,在這個例子是 E,這是因為第二筆跟第三筆是定位資 訊,也就是 S 的全域 X 座標和 A 的全域 Y 座標,在這個以 6x6 範圍代替 section 的例子來說,全域座標的範圍變成 1-12,S 位於全域 X 座標 3,A 位於全域 Y 座標 1,也就是此指令回傳的資料為 E、3、1,也因此第一筆回 傳的資料是全域座標(3,1)的資料:E。以上是範圍大小簡化過的例子,所以 在實際套用在 Section 上時,第二筆和第三筆資料的值的範圍是可以有 1-36 的。
而在這邊會有一個問題,要是搜尋時出現不只一個定位字元會如何,例如 在這個例子中橫向搜尋結果發現有兩個 S 時,這時只要取第一個看到的 S 來當參考即可(也就是取全域 X 座標較小的)。那麼還有一個可能是搜尋 時定位字元沒出現,雖然在整個畫面的範圍下一整個橫排或縱列均有 36 個
47 要只到三個 section 的大小,而且出發點(target 參數)仍然是在目前 grid,
再加上使用者搜尋 selector 時只要找與出發點同一列或同一排的資料即可,
48
其中 pattrenA 是指使用者這次 output 要輸入幾筆資料,patternB 則是要在第 幾筆資料時輸入 data,因此在 patternA 筆資料中,只有第 patternB 位置的資 料是實際資料,其它都是假資料,在認證時也只會對照 patternB 所指定的 果使用者設定或是變數運算結果使然,造成 patternB 大於 patternA,那麼 patternA 的數值會自動和 patternB 互換,以符合 A 需要大於 B 的情形,例