




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
《視機器》實驗告
::
:二零一六年一月第1章
目錄背景和意第2章系統(tǒng)方案設(shè)計.第3章硬件設(shè)計.3.1電腦鼠基本硬件組成3.2電腦鼠基本動作第4章軟件設(shè)計.4.1電腦鼠軟件設(shè)計概要說明4.2等高圖制作模塊.............................................114.3沖刺模塊...................................................124.4轉(zhuǎn)彎模塊...................................................124.5搜索模塊...................................................134.6迷宮地圖相對方向與絕對方向的建立...........................134.7墻壁資料存儲...............................................154.8電腦鼠搜索策略.............................................16參考文獻.附件第1章
背景和意義電腦鼠可看作是一種具有人工智能的小型機器人依照比賽規(guī)則當電腦鼠放入“迷宮”起點,按下啟動鍵之后,它就必須自行決定搜尋法則并且在迷中前進、轉(zhuǎn)彎、記憶迷宮墻壁資料、計算最短路徑、搜尋終點等功能。電腦鼠結(jié)合了機械、電機、電子、控制、光學、程序設(shè)計和人工智能等多方面的科技識。國際電工和電子工程學會(IEEE)每年都要舉辦一次國際性的電腦鼠走迷宮競賽。首場電腦鼠迷宮競賽年于紐約舉行年以來年都有世界級的比賽。2007,國內(nèi)開始舉行標準電腦鼠走迷宮邀請賽自舉辦以來高校參賽踴躍,許多大學還開設(shè)了“電腦鼠原理和制作”選修課程。電腦鼠走迷宮競賽具有一定難度是一項富有挑戰(zhàn)性和趣味性的比賽電腦鼠可看作一個集多項工程學科知識于一體的小型系統(tǒng)功的設(shè)計者通常都是合作團體們必須考慮電子、電氣、機械以及計算機各方面的問題,重量、速度、功耗、傳感技術(shù)重心以及程序各方面都是設(shè)計中需要決定和綜合考慮的因素電腦鼠結(jié)合了多學科知識對于提升我們的動手能力團隊協(xié)作能力和創(chuàng)新能力促進課堂知識的消化和擴展自身的知識面都非常有幫助;另外成立小組合作參賽,不僅使我們學到了知識,而且加強了同學之間的交流交際能力語言表達能力等也得到了鍛煉和提升最后電腦鼠走迷宮競賽極具趣味性容易得到學生的認同及參與并能很好的激發(fā)和引導學生這方面的興趣和愛好,為繼續(xù)參加比賽和深入學習提供了良好的條件。第系統(tǒng)方案設(shè)計硬件部分設(shè)計概要:軟件部分結(jié)構(gòu)設(shè)計:第硬件設(shè)計3.1腦基硬組電腦鼠的硬件大致分為以下幾部分:傳感器、執(zhí)行部件、微處理器、機械結(jié)構(gòu),如圖3-1所示電腦鼠傳感器紅外傳感器
執(zhí)行部件步進電機
微處理器
機械結(jié)構(gòu)車身設(shè)計圖電鼠件結(jié)構(gòu)圖1.傳感器它是電腦鼠感知外界環(huán)境的窗口是電腦鼠的雙眼好的傳感器是電腦鼠準確獲取外部環(huán)境信息以做出正確判斷的依據(jù)是電腦鼠靈敏快捷的保證紅外測距方式在電腦鼠上應用最廣。常見的紅外如圖所示本次電腦鼠使用6組紅外傳感器組紅外傳感器由紅外發(fā)線射器和紅外線接收器組成用于檢測迷宮墻壁信息,分別用于檢測左、左前、前、前、右前和右六個方向的墻壁信息。我們用U1-U5表示紅外線接收頭傳感器,RF1-RF5發(fā)送紅外線裝置,使用6組可調(diào)電阻W1-W5控制紅外信號發(fā)射強度,調(diào)整可見距離。信號采用載波調(diào)制,增強抗干擾性。傳感器由高功率880nm紅外發(fā)射管和高靈敏度紅外接收管組成,傳感器返回數(shù)據(jù)為模擬量,通過ADC讀取,通過數(shù)值,可估算障礙物的距離。圖紅外傳感器2.執(zhí)行部件電機是電腦鼠的動力源是電腦鼠的四肢只有具備健壯且靈活的四肢的電腦鼠才有可能在比賽中高效的解開迷宮機不但要能輸出足夠的馬力還要便于控制在此基礎(chǔ)上再配以合適的控制算法就能使電腦鼠快速而精確的行走電腦鼠中常用的是步進電機和直流電機步進電機控制容易但直流電機使電腦鼠控制更加靈敏。本次電腦鼠上有兩個兩相四線制的步進電機電機和右電機用來控制電腦鼠前進左轉(zhuǎn)和右轉(zhuǎn)停止進電機是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機構(gòu)。當步進驅(qū)動器接收到一個脈沖信號就驅(qū)動步進電機按設(shè)定的方向轉(zhuǎn)動一個固定的角度(稱為“步距角”)它的旋轉(zhuǎn)是以固定的角度一步一步運行的可以通過控制脈沖個數(shù)來控制角位移量從而達到準確定位的目的同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度從而達到調(diào)速的目的四相步進電機如圖3-3所示,電機驅(qū)動采用ROHM公司MOS全橋芯片驅(qū)動,壓降低,給電機提供較大的輸入電壓電機控制簡單每個電機采用三個控制信號個I/O控制電機的正反轉(zhuǎn)、剎車,一個PWM控制電機調(diào)速,PWM范圍20KHz~100KHz圖四相步進電機3.微處理器微處理器是電腦鼠的核心部分是電腦鼠的大腦幾乎所有的信息包括墻壁信息位置信息角度信息和電機狀態(tài)信息等都需要經(jīng)過微處理器處理并做出相應的判斷所有的數(shù)據(jù)分析算法實現(xiàn)和執(zhí)行指令的發(fā)出等都需要由微處理器來完成。主控芯片STM32F103RET6具有72MHz的主頻,512KFlash,64KRAM,加個外部Flash,足夠比較使用。4.機械結(jié)構(gòu)電腦鼠要能夠在迷宮里面靈活穿梭必須有一副好身板有適合在迷宮中快速運行的身體結(jié)構(gòu)首先他必須結(jié)實擁有兩只東倒西歪的輪子的電腦鼠是很難不在迷宮中碰壁的其次身材嬌小的電腦鼠在迷宮里是會更靈活的它有更大的空間用于完成轉(zhuǎn)彎有更大的空間用于糾正姿最后體重太大和沒有平衡感的老鼠也是不適宜迷宮競賽的基于如此多的考慮一只學富五車而又嬌小玲瓏的電腦鼠要求我們從機械上面有更多創(chuàng)新。電腦鼠的機械結(jié)構(gòu)如圖所示。圖電腦鼠的機械結(jié)構(gòu)3.2腦基動電腦鼠基本動作包括路口檢測,行走控制和轉(zhuǎn)彎。路口檢測:由安裝在前、右、左的三個紅外線發(fā)射對管和接收部件實現(xiàn),利用時鐘中斷來控制,實現(xiàn)遠紅外測距功能,探測前、右、左有無障礙。行走控制:由左、右45?個紅外線發(fā)射對管和接收部件實現(xiàn),利用時鐘中斷來控制實現(xiàn)近紅外測距功能保持電腦鼠在中軸線上行走免撞墻。轉(zhuǎn)彎由于電機采用的是步進電機只要對一個電機的步數(shù)進行設(shè)定電機采用PWM進行驅(qū)動另外一個電機停止或者反轉(zhuǎn)同樣的步數(shù)當然這個步數(shù)要自己實際測量。第4章軟件設(shè)計4.1腦軟設(shè)概說電腦鼠的軟件主要可以分為等高圖制作模塊、沖刺模塊、轉(zhuǎn)彎模塊、搜索模塊相對方向與絕對方向轉(zhuǎn)變模塊墻壁資料存儲模塊和電腦鼠搜索策略模塊這七個模塊。如圖3-5所示。
電腦鼠軟件主要模塊等高圖制
沖刺模塊
轉(zhuǎn)彎模塊
搜索模塊
相對方向
墻壁資料
電腦鼠搜作模塊
與絕對方向
存儲模塊
索策略模塊轉(zhuǎn)變模塊圖4-1軟件主要模塊圖下面介紹一下電腦鼠運行中必須要知道的一些參數(shù)其在程序運行過程中的用途。電腦鼠在運行中可以劃分為四個狀態(tài):等待,啟動,搜索迷宮和沖刺狀態(tài)。1.等待狀態(tài)在該狀態(tài)中電腦鼠靜止在起點等待開始命令同時實時顯示傳感器檢測結(jié)果和電池電壓,這樣方便調(diào)試傳感器的靈敏度和更換電池。當控制啟動的按鍵按下后,電腦鼠進入啟動狀態(tài)。2.啟動狀態(tài)在該狀態(tài)中,電腦鼠根據(jù)第一次轉(zhuǎn)彎的方向判斷起點是在坐標的00)點還是在(15,0)點。其程序流程圖見圖3-6示:圖4-2判起點坐標程序流圖3.搜索迷宮狀態(tài)在該狀態(tài)中,電腦鼠的任務(wù)就是搜索并記憶迷宮地圖,以采用右手搜索法則為例搜索全迷宮,其流程圖如圖3-7所示。圖迷宮搜索流程圖4.沖刺狀態(tài)迷宮搜索完畢后根據(jù)算法找出一條最優(yōu)路徑?jīng)_刺到終點沖刺結(jié)束后返回到起點。等高制作模塊等高圖就是等高線地圖的簡稱,有如一般地圖可以標出同一高度的地區(qū)范圍,或有如氣象報告時的等氣壓的范圍和大小。那么等高圖運用在迷宮地圖上,可以標出每個迷宮格到起點相等步數(shù)的關(guān)系多封閉路徑的逃脫與沖刺的關(guān)卡都可以在制作出等高圖后迎刃而解,使電腦鼠更容易逃脫,少走一些彎路。首先開辟一塊16的二維數(shù)組空間MapStep[16][16]),其中每一個元素代表迷宮的一個方格用以計算后儲存各方格至起點的最短路徑步(所謂步數(shù)即為路徑中經(jīng)過的方格數(shù)當起點坐標處標識為1時可以直接達到的相鄰方格均為2,再遠的方格的等高值依次遞增,這樣距離越遠的地方等高值越大。沖刺塊沖刺函數(shù)的實現(xiàn)是建立在等高圖已經(jīng)建立好的基礎(chǔ)上的電腦鼠要進行沖刺的時候調(diào)用沖刺函數(shù)時首先會調(diào)用等高圖制作函數(shù)將等高圖制作好然后該函數(shù)通過等高圖和墻壁信息來進行電腦鼠的行進控制當然我們認為電腦鼠在走直道的時候應該會比走彎道的時候來的更快一點所以我們沒有進行特殊的加權(quán),直接是走直道的。電腦鼠從起點開始,一直利用等高圖信息和墻壁信息進行一格一格的對比,只有當這一格在電腦鼠絕對方向上時這一格才算記錄到進行直道沖刺同時直道格數(shù)加一當遇到電腦鼠要轉(zhuǎn)彎的時候已經(jīng)將要走的步數(shù)記錄下來了接下來直接調(diào)用行進函數(shù)控制電腦鼠走完記錄好的步數(shù)后即走到電腦鼠要轉(zhuǎn)彎的地方后,再進行轉(zhuǎn)彎,然后接著繼續(xù)進行上一步的動作。轉(zhuǎn)彎塊轉(zhuǎn)彎也是電腦鼠運行時必不可少一部分時轉(zhuǎn)彎也分為靜止轉(zhuǎn)彎和行進中轉(zhuǎn)彎靜止轉(zhuǎn)彎要求電腦鼠首先要停止主要用在電腦鼠進行搜索中這時要求電腦鼠要絕對的穩(wěn)定所以采用靜止轉(zhuǎn)彎比較好行進中轉(zhuǎn)彎的特點是消除了靜止轉(zhuǎn)彎的要求電腦鼠停止的弊端可以節(jié)省一些時間主要用在電腦鼠進行沖刺時這時要求電腦鼠要以竟可能短的時間從起點到達終點所以行進中轉(zhuǎn)彎可以節(jié)省不少的時間。靜止轉(zhuǎn)彎時,對兩個電機設(shè)置走相同的步數(shù),如當要轉(zhuǎn)左轉(zhuǎn)90?置左電機向后走40右電機向前走步通過兩個電機走的方位不同來實現(xiàn)靜止轉(zhuǎn)彎但靜止轉(zhuǎn)彎的缺點就是在轉(zhuǎn)彎前首先要讓電機停止然后再對電機的要走的步數(shù)進行賦值,這樣會浪費一點時間。行進中轉(zhuǎn)彎時,讓一個輪子停止,一個輪子進行運轉(zhuǎn)來實現(xiàn)。如當要左轉(zhuǎn)90?置左電機停止轉(zhuǎn)動,右電機轉(zhuǎn)動80。與靜止轉(zhuǎn)彎區(qū)別開來的是,電機的步數(shù)在其他的函數(shù)中賦值好了轉(zhuǎn)彎函數(shù)中只要一開始將一個電機停止轉(zhuǎn)動就可以了不用一開始就將兩個電機都停止后對電機的步數(shù)進行賦值,這樣的話,就可以節(jié)省一些不必要的時間。搜索塊電腦鼠一開始進行迷宮搜索時必須要用到這個模塊過這個模塊電腦鼠進行迷宮的墻壁信息的采集,電腦鼠所走過的每個坐標都會有一個相應的墻壁信息,這些墻壁信息是電腦鼠后來進行等高圖制作和沖刺的基礎(chǔ)。在進行搜索時電腦鼠的紅外是在時鐘中斷下不停地被驅(qū)動的這一連串的動作有發(fā)射短波紅外發(fā)射長波紅外和接受紅外處理器通過讀取紅外接收器對應引腳的信息來判斷四周的情況時將迷宮的信息進行編碼后存儲在對應坐標的一個迷宮情況數(shù)組中。當遇到岔路時程序跳出搜索函數(shù)回到主函數(shù)中將岔路坐標進行處理將這個坐標進行入?;氐剿阉骱瘮?shù)中所選用的搜索法則選擇好一條路后,繼續(xù)搜索,并這樣一直下去直到電腦鼠運行到終點。迷宮圖相對方與絕對方向的立迷宮是用18cm?大小的方格組成的,其行列各有16個方格。為了讓電腦鼠記住所走過的各個迷宮格的信息們就坐標的方法來對迷宮格進行編號根據(jù)坐標的的定義和比賽規(guī)則也為了把上下左右這四個方向參數(shù)轉(zhuǎn)換為微控制器能夠識別的符號,在本文中,將向上的方向定義為、向右為、向下為2向左為3,如圖所示。MOUSEMOUSE圖迷宮方向值定義只要有了迷宮的坐標和方向后腦鼠在迷宮行走就可以隨時知道自己所處的位置和方位了然而對于電腦鼠而言紅外線傳感器的位置和方向是固定不變的但是對于迷宮紅外線傳感器的位置和方向是隨著老鼠前進方向的變化而一起變化的是由于選擇參物的不同而引起的此引出了兩個方向的問題:相對方向和絕對方向。相對方向:以電腦鼠當前行走方向為參照的方向。絕對方向:以迷宮絕對坐標平面為參照的方向。那么傳感器所檢測到的信息如何才能更便于處理呢?周立功提到了如果以相對方向存儲的資料將是混亂的不僅要存儲麻煩而且要記錄起檢測時電腦鼠所處的方向存儲量比較大處理起來也非常麻煩而以絕對方向存儲就不需要考慮當前電腦鼠的方向。這樣就會經(jīng)常遇到相對方向和絕對方向的互換。在本文中采取了以變量Dir記錄電腦鼠前進方向上的絕對方向值,即前方的絕對方向值始終為Dir。這樣電腦鼠的相對方向轉(zhuǎn)換成絕對方向如表所示。表相對方向轉(zhuǎn)換成絕對方向相對方向電腦鼠前方電腦鼠右方電腦鼠后方電腦鼠左方
絕對方向Dir+1(Dir+1)(Dir+2)(Dir+3)有時候系統(tǒng)還需要根據(jù)絕對方向(Dir_dst)和當前的絕對方向(Dir)求出方向偏差值(△),如式所示?!?/p>
式為了使△的值落在0~3的范圍內(nèi),計算式進行式的轉(zhuǎn)換如下:△=(Dir_dst+4Dir)%4
式這時就可以根據(jù)方向偏差值求出電腦鼠的相對方向,如表所示。表絕對方向轉(zhuǎn)換成相對方向絕對方向差值eq\o\ac(△,())
相對方向電腦鼠前方電腦鼠右方電腦鼠后方電腦鼠左方假設(shè)電腦鼠已知當前位置坐標(X,),那么就可以求出在其某絕對方向上的相鄰坐標值,如表3.3所示。該表是可逆的,即可以根據(jù)坐標值的變化求出絕對方向。表3-3坐轉(zhuǎn)換絕對方向當前位置上方()右方()下方()左方()
坐標(X,)(XY+1)(,Y)(XY-1(,y)當電腦鼠達到一方格坐標時應根據(jù)傳感器檢測結(jié)果記錄下當前方格的墻壁資料為了方便管理和節(jié)省存儲空間每一個字節(jié)變量的低四位分別用來存儲一個方格四周的墻壁資料,如表3.4所示。因為迷宮共有?個方格,所以可以定義一個16?的二維數(shù)組變量來保存整個迷宮墻壁資料。表3-4墻資料存儲方式變量位bit0bit1bit2bit3bit7~
代表的絕對方向上方(0)右方(1)下方(2)左方(3)
備注:路,0:有墻壁:路,0:有墻壁:路,0:有墻壁:路,0:有墻壁保留位迷宮墻壁資料全部初始化為0,表示走過迷宮格至少有一方?jīng)]墻壁,即墻壁資料不為0這樣就可以通過單元格存儲的墻壁資料是否為0來確定該單元格是否曾搜索過。墻壁料存儲為了記憶迷宮的詳細信息需要對迷宮單元的位置進行線路標記全迷宮共有16?個單元組成采用二維坐標方式標記用每個單元的XY標表示,如起點可標記為(0,),終點為7)。此外,還需要對迷宮單元的可行進方向進行標記,可采用絕對方位或相對方位二種方式。絕對方位這是一種與電腦鼠行進方向無關(guān)的標記方式以一個四位的二進制數(shù),分別表示“東”﹑“西”﹑“南”和“北”四個方向。1表示允許行進(無墻壁),0表示不允許行進(有墻壁)。相對方位這是一種與電腦鼠行進方向有關(guān)的標記方式以一個三位的二進制數(shù)即可實現(xiàn)標記,分別表示“前”“左”“右”,1表示允許(無墻壁),0表示不允許(有墻壁)。電腦搜索策略電腦鼠走迷宮可以采用全迷宮探索策略,即將迷宮的所有單元均搜索一次,從中找出最佳的行走路徑。這種策略需要有足夠的時間或探測次數(shù),但在IEEE競賽規(guī)則中每場競賽只有15分鐘的時間,因此是不可能的。另一種方法是部分迷宮探索策略即在有限的時間或探測次數(shù)下只探測迷宮的一部分從中找出次最佳的路徑,顯然只能采用這種策略。電腦鼠在一巷道內(nèi)行走如果最后無路可走則該巷為死巷電腦鼠在任一單元內(nèi),可能的行走方向最多只有三(前、左、),如果有二個或二個以上的可能行走方向,稱為交叉,遇有交叉時,由于有多個可以行走的方向,在行走方向的選擇上,可有下面的幾種選擇法則:右手法則:遇有交叉時,以右邊為優(yōu)先的前進方向,然后是直線方向、左邊方向。左手法則:遇有交叉時,以左邊為優(yōu)先的前進方向,然后是直線方向、右邊方向。中左法則:遇有交叉時,以直線為優(yōu)先的前進方向,然后是左邊方向、右邊方向。與此類似的還有中右法則。亂數(shù)法則:遇有交叉時,取隨機值作為前進方向。向心法則:由于終點在迷宮的中心,遇有交叉時,以向迷宮中心的方向為優(yōu)先的前進方向。參考文獻[1]金東勇.ZigBee技術(shù)在智能家居控制系統(tǒng)中的應用研究[D].太原理工大學工學碩士學位論文2008:[2]郭天祥新概念51片機語言教程:入門、提高、開發(fā)、拓展全攻略(附光盤1張)2009-01-01[3]胡漢才單片機原理及其接口技術(shù)(第3版)(附CD-ROM光盤1張)2010-05-01[4]程國鋼51片機應用開發(fā)案例手冊2011-11-01附:電腦鼠原理圖:電腦鼠單片機控制程序:Info---------------------------------------------------------------------------------FileLastDate:LastVersion:V1.0Description:
????2ìD?μ?μ??1?D??¢£??1y???ü??¨??μ??ò??′2¢?íí?2?ˉ3ìD?′DD?--------------------------------------------------------------------------------------------------------By:LiaoMaogangdate:2007/09/08V1.0--------------------------------------------------------------------------------------------------------ModifiedMovedMyModifiedDescription:?óo?"stm32f10x.h""BitBand.h""Mouse_Drive.h"?auint8=/o??aê
/uint8GucYStart/?Y?aê
/uint8GucXGoal0XDST0;/?aê£?óDá??
/uint8GucXGoal1XDST1;uint8GucYGoal0YDST0;/?aê£?óDá??
/uint8GucYGoal1YDST1;uint8=WAIT;/?′ò??′ay/uint8={0xff};/a′?e?aê?
/MAZECOORGmcStack[MAZETYPEMAZETYPE]={0};/?úmapStepEdit()?D?e?1ó?/MAZECOORGmcCrossway[MAZETYPEMAZETYPE]={0};/′′?§???aê///externuint8GucGoHead;name:
?óêaoˉinputuiD:?óêa2?′?a?outputReturned?TvoiddelayuiD){for(;uiD;uiD--);}/name:
?e?aêa?eμ?μμ??input?μμo??aêuiY:?μμ???aêoutput?e?aê?Returned?TvoidmapStepEdit(int8cY){uint8=
/aê
/uint8=1;
/
?
/uint8ucStat
/
í?????uint8i,j;
/=cX;/=cY;//3?ˉ?e?aê?/for(i=i<MAZETYPE;i++){for(j=j<MAZETYPE;j++){=}}/?e?£??a?óDêyY|àííêa/{
//=ucStep++;/?//
/?a??aê??à??????í3?ucStatif((GucMapBlock[cX][cY]&0x01)&&/
??óD??/(GucMapStep[cX][cY(ucStep))){?′??ˉ?¨/
/
????????ó1/}
/
?if((GucMapBlock[cX][cY]&0x02)&&
/
??óD??/+1][cY]>(ucStep))){?′??ˉ?¨/
/
óò???????ó1/}if((GucMapBlock[cX][cY]&0x04)&&(GucMapStep[cX][cY->{?????ó1/}if((GucMapBlock[cX][cY]&0x08)&&-1][cY]>(ucStep))){?????ó1/}/??óD???????a???óa(chǎn)??è???????????/if0){n--;===}{
///
???if1){?????a?aê/
/
???cX;/aê/cY;/?aê/}/????????/
o???if((GucMapBlock[cX][cY]&0x01)&&
/
é???óD??/(GucMapStep[cX][cY(ucStep))){′?óúˉ?¨/
/
é????
/
??aê
/continue;}if((GucMapBlock[cX][cY]&0x02)&&
/
??óD??/+1][cY]>(ucStep))){?′??ˉ?¨/
/
óò??
/
??aê
/continue;}if((GucMapBlock[cX][cY]&0x04)&&
/
????óD??/(GucMapStep[cX][cY->{′?óúˉ?¨/
/
?????cY--;
/
??aê
/continue;}if((GucMapBlock[cX][cY]&0x08)&&
/
???óD??/-1][cY]>(ucStep))){?′??ˉ?¨/
/
????cX--;
/
??aê
/continue;}}}}void(void)//3′?{uint8ucTemp=0xff;int8=0;/???aê?a?e?????ea?aê/if(GucMapBlock[GucXGoal0][GucYGoal0]&0x0c){/?aê??ú/mapStepEdit(GucXGoal0,GucYGoal0);?e?/
/
?D???if(ucTemp>{??aê/cXdstcYdstucTemp=GucMapStep[GucXStart][GucYStart];}}
/
aif(GucMapBlock[GucXGoal0][GucYGoal1]&{?aê??ú/
/
?D???mapStepEdit(GucXGoal0,GucYGoal1);?e?/
/
if(ucTemp>{??aê/cXdstcYdstucTemp=GucMapStep[GucXStart][GucYStart];}}
/
aif(GucMapBlock[GucXGoal1][GucYGoal0]&{?aê??ú/
/
?D???mapStepEdit(GucXGoal1,GucYGoal0);?e?/
/
if(ucTemp>{??aê/cXdstcYdstucTemp=GucMapStep[GucXStart][GucYStart];}}
/
aif(GucMapBlock[GucXGoal1][GucYGoal1]&{?aê??ú/
/
?D???mapStepEdit(GucXGoal1,GucYGoal1);/
?e?/if(ucTemp>{/??aê/cXdstcYdstucTemp=GucMapStep[GucXStart][GucYStart];}}objectGoTo_L(cXdst,cYdst);???¨?aê/}voidobjectGoTocXdst,int8cYdst){uint8=1;int8cNBlock=0,cDirTemp;int8cX,cY;=GmcMouse.cX;=GmcMouse.cY;e?//??????aê?ˉa???/((cX!={=/è?????aa????????/
/
a/?if((GucMapBlock[cX][cY]&0x01)&&
/
é???óD??
/(GucMapStep[cX][cY{
/
é??????
/cDirTemp=UP;
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????
/continue;
/
1a?′?
/}}if((GucMapBlock[cX][cY]&0x02)&&/
??óD??
/+1][cY]<ucStep)){/
óò????
/cDirTemp=
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????/continue;a?′?/}}if((GucMapBlock[cX][cY]&0x04)&&óD??/
//
1????(GucMapStep[cX][cY-<{
/
???????
/cDirTemp=DOWN;
/
???????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????/cY--;continue;a?′?/}}if((GucMapBlock[cX][cY]&0x08)&&óD??/
//
1???-1][cY]<{
/
???????
/cDirTemp=
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????
/cX--;continue;
/
1a?′?
/}}cDirTemp=+GucMouseDir)%4;/
????/cDirTemp;if(cNBlock){mouseGoahead(cNBlock);?cNBlock/}
/
??cNBlock=0;
/
/???a/switch{mouseTurnright();break;break;break;}GmcMouse.cX=cX;GmcMouse.cY=cY;}/?D?????/if(cNBlock){mouseGoahead(cNBlock);GmcMouse.cX=cX;GmcMouse.cY=cY;}}voidobjectGoTo_L(int8cXdst,{uint8=1;int8cNBlock=0,cDirTemp;int8cX,cY;=GmcMouse.cX;=GmcMouse.cY;e?//??????aê?ˉa???/((cX!={=/è?????aa????????/
/
?if((GucMapBlock[cX][cY]&0x01)&&
/
é???óD??
/(GucMapStep[cX][cY{
/
é??????
/cDirTemp=UP;
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????/continue;a?′?/}}if((GucMapBlock[cX][cY]&0x02)&&óD??/
//
1??+1][cY]<ucStep)){
/
óò????
/cDirTemp=
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????
/continue;
/
1a?′?
/}}if((GucMapBlock[cX][cY]&0x04)&&/
????óD??
/(GucMapStep[cX][cY-<{/
???????
/cDirTemp=DOWN;
/
???????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????/cY--;continue;a?′?/}}if((GucMapBlock[cX][cY]&0x08)&&óD??/
//
1???-1][cY]<{
/
???????
/cDirTemp=
/
?????/if==GucMouseDir){?2ˉòa?a??/
/
ó??è?cNBlock++;
/
???????
/cX--;continue;
/
1a?′?/}}cDirTemp=+GucMouseDir)%4;???/cDirTemp;if(cNBlock){mouseGoahead(cNBlock);?cNBlock/}
//
???cNBlock=0;
/
/???a/switch{mouseTurnright();break;break;break;break;}GmcMouse.cX=cX;GmcMouse.cY=cY;}/?D?????/if(cNBlock){mouseGoahead(cNBlock);GmcMouse.cX=cX;GmcMouse.cY=cY;}}name:mazeBlockDataGet
????????3????é??????μ??aú?inputμ??ê?μ?????output
Returned:?aú?/uint8mazeBlockDataGet(uint8ucDirTemp){int8cX=0,cY=??μ??????a???/switch{MOUSEFRONT:ucDirTemp=break;ucDirTemp=+%break;MOUSERIGHT:ucDirTemp=+%break;break;}/???Y?????????áú?aê/switch{=GmcMouse.cX;=break;==GmcMouse.cY;break;=GmcMouse.cX;=-break;=-=GmcMouse.cY;break;/}/
break;}return(GucMapBlock0[cX][cY]);?1??name:
/inputoutputReturned/void{
?¨£?ó??è?????T?Tif((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_R)&&μ??ê?μóòa?/
/=={
/μ??ê?μóòa?
/mouseTurnright();
/μ??ê?óò?areturn;}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_F)&&μ??ê?????/
/==0x00)){
/μ??ê?????
/return;
/μ??ê?2?a}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEW&&μ??ê???a?/
/)==0x00)){
/μ??ê???a?
/
/μ??ê????areturn;}}name:
/inputoutput
???¨£?ó??è?????ˉ?TReturned?TvoidleftMethod(void){if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEW&&/μ??ê???a?/)==0x00)){/μ??ê???a?
/
/μ??ê????areturn;}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&AY_F)&&μ??ê?????/
/==0x00)){
/μ??ê?????
/return;
/μ??ê?2?a}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_R)&&μ??ê?μóòa?/
/=={
/μ??ê?μóòa?
/mouseTurnright();
/μ??ê?óò?areturn;}}/
/name:frontRightMethodinputoutputReturned
?¨£?ó??è??′??óò?T?T/voidfrontRightMethod(void){if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_F)&&μ??ê?????/
/==0x00)){
/μ??ê?????
/return;
/μ??ê?2?a
/}if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_R)&&/μ??ê?μóòa?/=={/μ??ê?μóòa?
/mouseTurnright();
/μ??ê?óò?areturn;}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEW&&μ??ê???a?/
/)==0x00)){
/μ??ê???a?
/
/μ??ê????areturn;}}/
/name:inputoutputReturned
?D???¨??′??????T?T/void(void){if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_F)&&μ??ê?????/
/==0x00)){
/μ??ê?????
/return;
/μ??ê?2?a}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEW&&μ??ê???a?/
/)==0x00)){
/μ??ê???a?
/
/μ??ê????areturn;}
/if((GucMapBlock[GmcMouse.cX][GmcMouse.cY]&MOUSEWAY_R)&&/μ??ê?μóòa?/=={/μ??ê?μóòa?
/mouseTurnright();
/μ??ê?óò?areturn;}}/
/name:centralMethod
?DD?????Yμ??ê???1??D?|μ???¨ó?oe?¨inputoutputReturned?T/void{if&{if&{/′a?1?/switch(GucMouseDir){UP:????é?/
/
aleftMethod();
/
???¨
/break;RIGHT:
/
a????óò
/rightMethod();
/?¨
/break;
/
a?????
//?¨/break;LEFT:???????/frontLeftMethod();/??¨/break;break;}}{/′a?1?μóò???/switch(GucMouseDir){UP:????é?/
//
a?D?afrontLeftMethod();
/
?D???¨
/break;RIGHT:
/
a????óò
/leftMethod();
/
???¨
/break;
/
a?????
/rightMethod();
/?¨
/break;LEFT:
/
a???????
/
/?¨
/break;break;}}}{if&{/′a?1???/switch(GucMouseDir){UP:????é?/
/
arightMethod();
/?¨
/break;RIGHT:
/
a????óò
/
/?¨
/break;
/
a?????/frontLeftMethod();??¨/break;
/
?D?LEFT:
/
a???????
/leftMethod();
/
???¨
/break;break;}}{/′a?1???/switch(GucMouseDir){UP:????é?//?¨/break;
/
aRIGHT:
/
a????óò
/frontLeftMethod();
/
?D???¨
/break;
/
a?????
/leftMethod();
/
???¨
/break;LEFT:
/
a???????
/rightMethod();
/?¨}}}/
break;break;}
/name:crosswayCheck
í3?aê′1?′?§??inputucX£?Dˉa?ì2o??aêòa?ì2??aêoutput
Returned′???/uint8crosswayCheck(int8cX,int8cY){uint8ucCtif((GucMapBlock[cX][cY]&0x01)&&/???1?é????/1])0x00){/???1?é???′?/?????ó1/}if((GucMapBlock[cX][cY]&0x02)&&/???1???/
/
???????(GucMapBlock0[cX+1][cY])0x00){???1???/
/
???????ó1/}
/
?if((GucMapBlock[cX][cY]&0x04)&&???1???/-0x00){???1?????′?/
//
?????????ó1/}
/
?if((GucMapBlock[cX][cY]&0x08)&&???1?????/(GucMapBlock0[cX-1][cY])==0x00){???1????′?/
//
?????????ó1/}ucCt;}/name:??§???e????input?ToutputReturned?T/voidcrosswayChoice{switch(SEARCHMETHOD){rightMethod();
/
?break;LEFTMETHOD:leftMethod();break;CENTRALMETHOD:break;FRONTRIGHTMETHOD:break;FRONTLEFTMETHOD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司借款合同書集錦
- 勞動合同法第四條
- 國際貿(mào)易貨物買賣合同
- 交通安全統(tǒng)籌服務(wù)合同
- 醫(yī)院聘用醫(yī)師協(xié)議書
- 2025年漯河貨運資格證考試答案
- 借貸擔保合同協(xié)議5篇
- 農(nóng)場整體出租合同范本
- 買賣礦居間合同范本
- 農(nóng)村豬種出售合同范本
- 供應商開發(fā)流程及質(zhì)量要求
- 2024年技術(shù)監(jiān)督質(zhì)檢職業(yè)技能考試-電力技術(shù)監(jiān)督上崗員(中國華能)筆試歷年真題薈萃含答案
- 反假幣測試附有答案
- 怎樣調(diào)動員工積極性
- 2024年內(nèi)科護理學(第七版)期末考試復習題庫(含答案)
- 【上市公司的財務(wù)風險的分析和防范:以三只松鼠為例10000字(論文)】
- 急診科培訓急診科與其他科室的協(xié)作與溝通
- JCT414-2017 硅藻土的標準
- 肌肉注射評分標準
- 鋼結(jié)構(gòu)主要技術(shù)標準和要求
- 臘八粥 第一課時自學導學單
評論
0/150
提交評論