要點:
1.船的走法為靠左邊走,或靠右邊走完全程。
2.船的所在地,即箭頭,在地圖的位置是固定的,在改變的只有地圖而已,因此,
以箭頭為中心,八個方向,總共九個格子,才是有用的資訊。例如:
海圖:
|← 0X →||← 1X →||← 2X →||← 3X →||← 4X →||← 5X →||← 6X →|
1234567890123456789012345678901234567890123456789012345678901234567890
\
☆
∣\
\
↑──☆─
∣
∣
☆
∣
箭頭在行中的位置是第36-37字元,所以要取得的部份是34-35、36-37、37-38
這三格,初次取出的部份如下圖藍色表示,最多有27格:
|← 0X →||← 1X →||← 2X →||← 3X →||← 4X →||← 5X →||← 6X →|
1234567890123456789012345678901234567890123456789012345678901234567890
\
☆
∣\
\
↑──☆─
∣
∣
☆
∣
存入指定的變數做成list string格式後如下(分隔字元為"|"):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
" | | | | | | | | |\| | | |↑|─| |∣| | |∣| | |☆| |
25 26 27
|∣| "
與上圖藍色部份相對照,上表欄位1代表藍色範圍左上角34-35字元的資料,欄位2
為藍色範圍第一行35-36字元的資料,欄位4則為藍色範圍第二行34-35字元的資料,
依序類推。而箭號位在上表中第14欄的位置,以該欄為中心,向左右各取出四格欄位
共九格,就是可用的九宮格地圖了,如下表:
1 2 3 4 5 6 7 8 9
"\| | | |↑|─| |∣| "
有時候箭頭所在的行會是地圖中的首行,這時候箭頭的位置會從上表的5移到2,為
方便後續的判斷,當前述的情形發生時,就在前方插入三欄空白,使箭頭能固定在5
的位置。
3.給予九個格子編號,由左至右,從上而下,接著再給予八個方向編號,採順時針
或逆時針皆可,這裡採逆時針方向,兩者的比對如下:
↖ ↑ ↗
╔═╦═╦═╗ ╔═╦═╦═╗
║1║2║3║ ║7║6║5║
╠═╬═╬═╣ ╠═╬═╬═╣
║4║ ║5║ ←║8║ ║4║→
╠═╬═╬═╣ ╠═╬═╬═╣
║6║7║8║ ║1║2║3║
╚═╩═╩═╝ ╚═╩═╩═╝
↙ ↓ ↘
接著在左圖找出有路的格子後,在將格子編號套成右圖的方向編號即可。
4.判斷該走哪個方向,假設船的航向為1,當沿左邊走時,應從4開始判斷有無路
線可走,再依序3>2>1>8>7>6>5判斷,若沿右邊走,則依6>7>
8>1>2>3>4>5順位判斷。
5.轉舵則依目前方向與決定的航線之夾角來決定,如果夾角是負數,則加上8補正。
6.清空不會覆蓋內容的變數。如海圖變數,航線變數等。
7.決定油量剩餘多少該做什麼?加油,撞山等等。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Pattarn:
^(%s)({㊣|★|£|◎|&|─|☆|←|→|↗|↙|↑|↓|↖|↘|/|\|∣})
Commands:
#var test3 %line
#var test4 %copy(@test3,34,2)|%copy(@test3,36,2)|%copy(@test3,38,2)
#var map %additem(@test4,@map)
#if (%ismember(%copy(@test3,36,2),@boatlist2)>0) {#var boat2 %copy(@test3,36,2)}
#var map %replace(@map,"\","K")
說明:
Pattarn:這個句子就是地圖的格式,前方必為空白:^(%s)
第一個字可能出現:㊣★£◎&─☆←→↗↙↑↓↖↘/\∣等符號。
Commands:
01行:用%line將地圖逐行寫入test3。
02行:箭號所在位置為每行第36字元起2個字元寛度,以%copy函數將該字及左右
字依A|B|C格式放入test4。
03行:將test4值遞增寫入map中。
04行:順便將箭號找出來,因為在執行本條觸發時,箭號位置相對固定,比較容
易操作,boatlist2是自設好的變數,內容為↙|↓|↘|→|↗|↑|↖|←,
如果每行的%copy(@test3,36,2)內容在boatlist2中,就將它存入boat2中
05行:\有時候會有亂碼問題,早早用別的符號代替,這裡用K。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Pattarn:
^%s油 量 : (%1)
Commands:
boatlist2="↙|↓|↘|→|↗|↑|↖|←"
#var map %replace(@map," ","0")
#case %ismember(%ismember(@boat2,@map),2) {#var map 0|0|0|@map} {#noop}
#var map %delitem(@boat2,%copy(@map,%eval(%pos(@boat2,@map)-12),26))
#loop %numitems(@map) {#if (%item(@map,%i)<>0) {#var maproad
%additem(%item(7|6|5|8|4|1|2|3,%i),@maproad)}}
#say 海圖:@map 目前航向:@boat2 上一步航向:@boatlast
#case @boatlast {boatrun="4|3|2|1|8|7|6|5"} {boatrun="5|4|3|2|1|8|7|6"}
{boatrun="6|5|4|3|2|1|8|7"} {boatrun="7|6|5|4|3|2|1|8"}
{boatrun="8|7|6|5|4|3|2|1"} {boatrun="1|8|7|6|5|4|3|2"}
{boatrun="2|1|8|7|6|5|4|3"} {boatrun="3|2|1|8|7|6|5|4"}
#var boatwill 8
#forall @maproad {#if (%ismember(%i,@boatrun)<@boatwill) {#var boatwill
%ismember(%i,@boatrun)}}
#var boatlast %item(@boatrun,@boatwill)
#say 新航向:@boatlast 第@boatwill筆:(@boatrun)
#var turn1 %eval(%ismember(@boat2,@boatlist2)-@boatlast)
#if (@turn1<0) {#var turn1 %eval(@turn1+8)}
#case @turn1 {turn 45} {turn 90} {turn 90
turn 45} {turn 90
turn 90} {turn -90
turn -45} {turn -90} {turn -45} {#noop}
#say 夾角 @turn1 轉舵指令:%lastinput 油量:%pos(※,%1)
#forall map|maproad {#var %i ""}
#case (%ismember(%pos(※,%1),1|5))+1 {#noop} {turn 90
#var dowhat "turn 90"} {@dowhat
repair box}
說明:
Patterm:強制前方須為空白字元:^%s,後方再把油量表存入變數。
Commands:
01行:建立名為boatlist的變數,內容是八個航向的符號。
02行:從前條觸發得到的地圖map,裡面的" "用0取代。
03行:如果箭號在map中的欄位是第二個,就加上0|0|0|,將箭號推回第五個欄位。
04行:取出以箭號為中心,左右四個欄位長度的字串,再寫回map中,用%copy取出時,
需有起始字元位置和字串長度,此時分隔字元"|"也必需計為一個字元,如圖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
123456789012345678901234567890123456789012345678901234567890123456789012
" | | | | | | | | |\| | | |↑|─| |∣| | |∣| | |☆| |
12345678901234567890123456
25 26 27
31234567
|∣| "
起始字元在箭頭前12個字元的位置,全長26個字元,用%pos和boat2找出箭頭
所在位置,再減12,代入%copy執行,即可取得所要的九格欄位資料。此時就
不再需要箭頭欄位,順便再用%delitem刪去,就會剩下地圖的資料。
05行:綠色代表同一行,現在map的字串欄位編號就像下方左圖:
╔═╦═╦═╗ ╔═╦═╦═╗
║1║2║3║ ║7║6║5║
╠═╬═╬═╣ ╠═╬═╬═╣
║4║ ║5║ → ║8║ ║4║
╠═╬═╬═╣ ╠═╬═╬═╣
║6║7║8║ ║1║2║3║
╚═╩═╩═╝ ╚═╩═╩═╝
用#loop依序比對map各欄位的資料是否≠0,是的話就把第X次比對中的X代入
#var maproad %additem(%item(7|6|5|8|4|1|2|3,%i),@maproad)
中的%i,上行中的7|6|5|8|4|1|2|3即上方右圖的方向代號依左圖編號排成的
list,利用%item的功能,把第%i欄的數字取出,依序存入maproad中。
06行:監控用,同時也代表各個變數的功能。
07行:依boatlast裡的值,選出boatrun,boatrun的內容為判定航路的順序,boatlast
啟始值可以在1-8間自設,如果不在前述範圍內,會撞山。依序後方各行的執
行,boatlast會紀錄觸發前次執行的轉舵方位,來解決亂流造成的迴圈問題。
08行:將boatwill的值設定為8,給下一行比大小用。
09行:依序將maproad的值帶入(%ismember(%i,@boatrun)<@boatwill)中的%i與
boatrun比對,求出該值在boatrun中的位置,接著和boatwill比大小,若小於
boatwill,就把該值寫入boatwill,最後boatwill會是正確航路在boatrun中
的位置。
10行:依上行得到的boatwill,取出boatrun相應位置的值,寫入boatlast中。
11行:監控用,同時也代表各個變數的功能。
12行:求出現行航向與將行航路的夾角,並寫入turn1中。
13行:如果turn1的值為負數,則加8轉為正數。
14行:依夾角值決定轉舵的方式。
15行:監控用,同時也代表各個變數的功能。
16行:將map和maproad清空。
17行:油量控制段,油量5格時,執行dowhat的內容,如加油或撞山,油量1格時,
執行撞山並將dowhat改成turn 90,結束打MVP怪的策略,改行收集油箱的方
針。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Pattarn:
Bom...船撞到冰山了....
Commands:
#var boatlast 1
說明:
Commands:
將boatlast 設成1,無論如何,不要為0或大於8的值即可。