精華區beta mud_sanc 關於我們 聯絡資訊
要點: 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 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的值即可。