




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
《視機器》實驗告
::
:二零一六年一月第1章
目錄背景和意第2章系統方案設計.第3章硬件設計.3.1電腦鼠基本硬件組成3.2電腦鼠基本動作第4章軟件設計.4.1電腦鼠軟件設計概要說明4.2等高圖制作模塊.............................................114.3沖刺模塊...................................................124.4轉彎模塊...................................................124.5搜索模塊...................................................134.6迷宮地圖相對方向與絕對方向的建立...........................134.7墻壁資料存儲...............................................154.8電腦鼠搜索策略.............................................16參考文獻.附件第1章
背景和意義電腦鼠可看作是一種具有人工智能的小型機器人依照比賽規則當電腦鼠放入“迷宮”起點,按下啟動鍵之后,它就必須自行決定搜尋法則并且在迷中前進、轉彎、記憶迷宮墻壁資料、計算最短路徑、搜尋終點等功能。電腦鼠結合了機械、電機、電子、控制、光學、程序設計和人工智能等多方面的科技識。國際電工和電子工程學會(IEEE)每年都要舉辦一次國際性的電腦鼠走迷宮競賽。首場電腦鼠迷宮競賽年于紐約舉行年以來年都有世界級的比賽。2007,國內開始舉行標準電腦鼠走迷宮邀請賽自舉辦以來高校參賽踴躍,許多大學還開設了“電腦鼠原理和制作”選修課程。電腦鼠走迷宮競賽具有一定難度是一項富有挑戰性和趣味性的比賽電腦鼠可看作一個集多項工程學科知識于一體的小型系統功的設計者通常都是合作團體們必須考慮電子、電氣、機械以及計算機各方面的問題,重量、速度、功耗、傳感技術重心以及程序各方面都是設計中需要決定和綜合考慮的因素電腦鼠結合了多學科知識對于提升我們的動手能力團隊協作能力和創新能力促進課堂知識的消化和擴展自身的知識面都非常有幫助;另外成立小組合作參賽,不僅使我們學到了知識,而且加強了同學之間的交流交際能力語言表達能力等也得到了鍛煉和提升最后電腦鼠走迷宮競賽極具趣味性容易得到學生的認同及參與并能很好的激發和引導學生這方面的興趣和愛好,為繼續參加比賽和深入學習提供了良好的條件。第系統方案設計硬件部分設計概要:軟件部分結構設計:第硬件設計3.1腦基硬組電腦鼠的硬件大致分為以下幾部分:傳感器、執行部件、微處理器、機械結構,如圖3-1所示電腦鼠傳感器紅外傳感器
執行部件步進電機
微處理器
機械結構車身設計圖電鼠件結構圖1.傳感器它是電腦鼠感知外界環境的窗口是電腦鼠的雙眼好的傳感器是電腦鼠準確獲取外部環境信息以做出正確判斷的依據是電腦鼠靈敏快捷的保證紅外測距方式在電腦鼠上應用最廣。常見的紅外如圖所示本次電腦鼠使用6組紅外傳感器組紅外傳感器由紅外發線射器和紅外線接收器組成用于檢測迷宮墻壁信息,分別用于檢測左、左前、前、前、右前和右六個方向的墻壁信息。我們用U1-U5表示紅外線接收頭傳感器,RF1-RF5發送紅外線裝置,使用6組可調電阻W1-W5控制紅外信號發射強度,調整可見距離。信號采用載波調制,增強抗干擾性。傳感器由高功率880nm紅外發射管和高靈敏度紅外接收管組成,傳感器返回數據為模擬量,通過ADC讀取,通過數值,可估算障礙物的距離。圖紅外傳感器2.執行部件電機是電腦鼠的動力源是電腦鼠的四肢只有具備健壯且靈活的四肢的電腦鼠才有可能在比賽中高效的解開迷宮機不但要能輸出足夠的馬力還要便于控制在此基礎上再配以合適的控制算法就能使電腦鼠快速而精確的行走電腦鼠中常用的是步進電機和直流電機步進電機控制容易但直流電機使電腦鼠控制更加靈敏。本次電腦鼠上有兩個兩相四線制的步進電機電機和右電機用來控制電腦鼠前進左轉和右轉停止進電機是一種將電脈沖轉化為角位移的執行機構。當步進驅動器接收到一個脈沖信號就驅動步進電機按設定的方向轉動一個固定的角度(稱為“步距角”)它的旋轉是以固定的角度一步一步運行的可以通過控制脈沖個數來控制角位移量從而達到準確定位的目的同時可以通過控制脈沖頻率來控制電機轉動的速度和加速度從而達到調速的目的四相步進電機如圖3-3所示,電機驅動采用ROHM公司MOS全橋芯片驅動,壓降低,給電機提供較大的輸入電壓電機控制簡單每個電機采用三個控制信號個I/O控制電機的正反轉、剎車,一個PWM控制電機調速,PWM范圍20KHz~100KHz圖四相步進電機3.微處理器微處理器是電腦鼠的核心部分是電腦鼠的大腦幾乎所有的信息包括墻壁信息位置信息角度信息和電機狀態信息等都需要經過微處理器處理并做出相應的判斷所有的數據分析算法實現和執行指令的發出等都需要由微處理器來完成。主控芯片STM32F103RET6具有72MHz的主頻,512KFlash,64KRAM,加個外部Flash,足夠比較使用。4.機械結構電腦鼠要能夠在迷宮里面靈活穿梭必須有一副好身板有適合在迷宮中快速運行的身體結構首先他必須結實擁有兩只東倒西歪的輪子的電腦鼠是很難不在迷宮中碰壁的其次身材嬌小的電腦鼠在迷宮里是會更靈活的它有更大的空間用于完成轉彎有更大的空間用于糾正姿最后體重太大和沒有平衡感的老鼠也是不適宜迷宮競賽的基于如此多的考慮一只學富五車而又嬌小玲瓏的電腦鼠要求我們從機械上面有更多創新。電腦鼠的機械結構如圖所示。圖電腦鼠的機械結構3.2腦基動電腦鼠基本動作包括路口檢測,行走控制和轉彎。路口檢測:由安裝在前、右、左的三個紅外線發射對管和接收部件實現,利用時鐘中斷來控制,實現遠紅外測距功能,探測前、右、左有無障礙。行走控制:由左、右45?個紅外線發射對管和接收部件實現,利用時鐘中斷來控制實現近紅外測距功能保持電腦鼠在中軸線上行走免撞墻。轉彎由于電機采用的是步進電機只要對一個電機的步數進行設定電機采用PWM進行驅動另外一個電機停止或者反轉同樣的步數當然這個步數要自己實際測量。第4章軟件設計4.1腦軟設概說電腦鼠的軟件主要可以分為等高圖制作模塊、沖刺模塊、轉彎模塊、搜索模塊相對方向與絕對方向轉變模塊墻壁資料存儲模塊和電腦鼠搜索策略模塊這七個模塊。如圖3-5所示。
電腦鼠軟件主要模塊等高圖制
沖刺模塊
轉彎模塊
搜索模塊
相對方向
墻壁資料
電腦鼠搜作模塊
與絕對方向
存儲模塊
索策略模塊轉變模塊圖4-1軟件主要模塊圖下面介紹一下電腦鼠運行中必須要知道的一些參數其在程序運行過程中的用途。電腦鼠在運行中可以劃分為四個狀態:等待,啟動,搜索迷宮和沖刺狀態。1.等待狀態在該狀態中電腦鼠靜止在起點等待開始命令同時實時顯示傳感器檢測結果和電池電壓,這樣方便調試傳感器的靈敏度和更換電池。當控制啟動的按鍵按下后,電腦鼠進入啟動狀態。2.啟動狀態在該狀態中,電腦鼠根據第一次轉彎的方向判斷起點是在坐標的00)點還是在(15,0)點。其程序流程圖見圖3-6示:圖4-2判起點坐標程序流圖3.搜索迷宮狀態在該狀態中,電腦鼠的任務就是搜索并記憶迷宮地圖,以采用右手搜索法則為例搜索全迷宮,其流程圖如圖3-7所示。圖迷宮搜索流程圖4.沖刺狀態迷宮搜索完畢后根據算法找出一條最優路徑沖刺到終點沖刺結束后返回到起點。等高制作模塊等高圖就是等高線地圖的簡稱,有如一般地圖可以標出同一高度的地區范圍,或有如氣象報告時的等氣壓的范圍和大小。那么等高圖運用在迷宮地圖上,可以標出每個迷宮格到起點相等步數的關系多封閉路徑的逃脫與沖刺的關卡都可以在制作出等高圖后迎刃而解,使電腦鼠更容易逃脫,少走一些彎路。首先開辟一塊16的二維數組空間MapStep[16][16]),其中每一個元素代表迷宮的一個方格用以計算后儲存各方格至起點的最短路徑步(所謂步數即為路徑中經過的方格數當起點坐標處標識為1時可以直接達到的相鄰方格均為2,再遠的方格的等高值依次遞增,這樣距離越遠的地方等高值越大。沖刺塊沖刺函數的實現是建立在等高圖已經建立好的基礎上的電腦鼠要進行沖刺的時候調用沖刺函數時首先會調用等高圖制作函數將等高圖制作好然后該函數通過等高圖和墻壁信息來進行電腦鼠的行進控制當然我們認為電腦鼠在走直道的時候應該會比走彎道的時候來的更快一點所以我們沒有進行特殊的加權,直接是走直道的。電腦鼠從起點開始,一直利用等高圖信息和墻壁信息進行一格一格的對比,只有當這一格在電腦鼠絕對方向上時這一格才算記錄到進行直道沖刺同時直道格數加一當遇到電腦鼠要轉彎的時候已經將要走的步數記錄下來了接下來直接調用行進函數控制電腦鼠走完記錄好的步數后即走到電腦鼠要轉彎的地方后,再進行轉彎,然后接著繼續進行上一步的動作。轉彎塊轉彎也是電腦鼠運行時必不可少一部分時轉彎也分為靜止轉彎和行進中轉彎靜止轉彎要求電腦鼠首先要停止主要用在電腦鼠進行搜索中這時要求電腦鼠要絕對的穩定所以采用靜止轉彎比較好行進中轉彎的特點是消除了靜止轉彎的要求電腦鼠停止的弊端可以節省一些時間主要用在電腦鼠進行沖刺時這時要求電腦鼠要以竟可能短的時間從起點到達終點所以行進中轉彎可以節省不少的時間。靜止轉彎時,對兩個電機設置走相同的步數,如當要轉左轉90?置左電機向后走40右電機向前走步通過兩個電機走的方位不同來實現靜止轉彎但靜止轉彎的缺點就是在轉彎前首先要讓電機停止然后再對電機的要走的步數進行賦值,這樣會浪費一點時間。行進中轉彎時,讓一個輪子停止,一個輪子進行運轉來實現。如當要左轉90?置左電機停止轉動,右電機轉動80。與靜止轉彎區別開來的是,電機的步數在其他的函數中賦值好了轉彎函數中只要一開始將一個電機停止轉動就可以了不用一開始就將兩個電機都停止后對電機的步數進行賦值,這樣的話,就可以節省一些不必要的時間。搜索塊電腦鼠一開始進行迷宮搜索時必須要用到這個模塊過這個模塊電腦鼠進行迷宮的墻壁信息的采集,電腦鼠所走過的每個坐標都會有一個相應的墻壁信息,這些墻壁信息是電腦鼠后來進行等高圖制作和沖刺的基礎。在進行搜索時電腦鼠的紅外是在時鐘中斷下不停地被驅動的這一連串的動作有發射短波紅外發射長波紅外和接受紅外處理器通過讀取紅外接收器對應引腳的信息來判斷四周的情況時將迷宮的信息進行編碼后存儲在對應坐標的一個迷宮情況數組中。當遇到岔路時程序跳出搜索函數回到主函數中將岔路坐標進行處理將這個坐標進行入?;氐剿阉骱瘮抵兴x用的搜索法則選擇好一條路后,繼續搜索,并這樣一直下去直到電腦鼠運行到終點。迷宮圖相對方與絕對方向的立迷宮是用18cm?大小的方格組成的,其行列各有16個方格。為了讓電腦鼠記住所走過的各個迷宮格的信息們就坐標的方法來對迷宮格進行編號根據坐標的的定義和比賽規則也為了把上下左右這四個方向參數轉換為微控制器能夠識別的符號,在本文中,將向上的方向定義為、向右為、向下為2向左為3,如圖所示。MOUSEMOUSE圖迷宮方向值定義只要有了迷宮的坐標和方向后腦鼠在迷宮行走就可以隨時知道自己所處的位置和方位了然而對于電腦鼠而言紅外線傳感器的位置和方向是固定不變的但是對于迷宮紅外線傳感器的位置和方向是隨著老鼠前進方向的變化而一起變化的是由于選擇參物的不同而引起的此引出了兩個方向的問題:相對方向和絕對方向。相對方向:以電腦鼠當前行走方向為參照的方向。絕對方向:以迷宮絕對坐標平面為參照的方向。那么傳感器所檢測到的信息如何才能更便于處理呢?周立功提到了如果以相對方向存儲的資料將是混亂的不僅要存儲麻煩而且要記錄起檢測時電腦鼠所處的方向存儲量比較大處理起來也非常麻煩而以絕對方向存儲就不需要考慮當前電腦鼠的方向。這樣就會經常遇到相對方向和絕對方向的互換。在本文中采取了以變量Dir記錄電腦鼠前進方向上的絕對方向值,即前方的絕對方向值始終為Dir。這樣電腦鼠的相對方向轉換成絕對方向如表所示。表相對方向轉換成絕對方向相對方向電腦鼠前方電腦鼠右方電腦鼠后方電腦鼠左方
絕對方向Dir+1(Dir+1)(Dir+2)(Dir+3)有時候系統還需要根據絕對方向(Dir_dst)和當前的絕對方向(Dir)求出方向偏差值(△),如式所示。△
式為了使△的值落在0~3的范圍內,計算式進行式的轉換如下:△=(Dir_dst+4Dir)%4
式這時就可以根據方向偏差值求出電腦鼠的相對方向,如表所示。表絕對方向轉換成相對方向絕對方向差值eq\o\ac(△,())
相對方向電腦鼠前方電腦鼠右方電腦鼠后方電腦鼠左方假設電腦鼠已知當前位置坐標(X,),那么就可以求出在其某絕對方向上的相鄰坐標值,如表3.3所示。該表是可逆的,即可以根據坐標值的變化求出絕對方向。表3-3坐轉換絕對方向當前位置上方()右方()下方()左方()
坐標(X,)(XY+1)(,Y)(XY-1(,y)當電腦鼠達到一方格坐標時應根據傳感器檢測結果記錄下當前方格的墻壁資料為了方便管理和節省存儲空間每一個字節變量的低四位分別用來存儲一個方格四周的墻壁資料,如表3.4所示。因為迷宮共有?個方格,所以可以定義一個16?的二維數組變量來保存整個迷宮墻壁資料。表3-4墻資料存儲方式變量位bit0bit1bit2bit3bit7~
代表的絕對方向上方(0)右方(1)下方(2)左方(3)
備注:路,0:有墻壁:路,0:有墻壁:路,0:有墻壁:路,0:有墻壁保留位迷宮墻壁資料全部初始化為0,表示走過迷宮格至少有一方沒墻壁,即墻壁資料不為0這樣就可以通過單元格存儲的墻壁資料是否為0來確定該單元格是否曾搜索過。墻壁料存儲為了記憶迷宮的詳細信息需要對迷宮單元的位置進行線路標記全迷宮共有16?個單元組成采用二維坐標方式標記用每個單元的XY標表示,如起點可標記為(0,),終點為7)。此外,還需要對迷宮單元的可行進方向進行標記,可采用絕對方位或相對方位二種方式。絕對方位這是一種與電腦鼠行進方向無關的標記方式以一個四位的二進制數,分別表示“東”﹑“西”﹑“南”和“北”四個方向。1表示允許行進(無墻壁),0表示不允許行進(有墻壁)。相對方位這是一種與電腦鼠行進方向有關的標記方式以一個三位的二進制數即可實現標記,分別表示“前”“左”“右”,1表示允許(無墻壁),0表示不允許(有墻壁)。電腦搜索策略電腦鼠走迷宮可以采用全迷宮探索策略,即將迷宮的所有單元均搜索一次,從中找出最佳的行走路徑。這種策略需要有足夠的時間或探測次數,但在IEEE競賽規則中每場競賽只有15分鐘的時間,因此是不可能的。另一種方法是部分迷宮探索策略即在有限的時間或探測次數下只探測迷宮的一部分從中找出次最佳的路徑,顯然只能采用這種策略。電腦鼠在一巷道內行走如果最后無路可走則該巷為死巷電腦鼠在任一單元內,可能的行走方向最多只有三(前、左、),如果有二個或二個以上的可能行走方向,稱為交叉,遇有交叉時,由于有多個可以行走的方向,在行走方向的選擇上,可有下面的幾種選擇法則:右手法則:遇有交叉時,以右邊為優先的前進方向,然后是直線方向、左邊方向。左手法則:遇有交叉時,以左邊為優先的前進方向,然后是直線方向、右邊方向。中左法則:遇有交叉時,以直線為優先的前進方向,然后是左邊方向、右邊方向。與此類似的還有中右法則。亂數法則:遇有交叉時,取隨機值作為前進方向。向心法則:由于終點在迷宮的中心,遇有交叉時,以向迷宮中心的方向為優先的前進方向。參考文獻[1]金東勇.ZigBee技術在智能家居控制系統中的應用研究[D].太原理工大學工學碩士學位論文2008:[2]郭天祥新概念51片機語言教程:入門、提高、開發、拓展全攻略(附光盤1張)2009-01-01[3]胡漢才單片機原理及其接口技術(第3版)(附CD-ROM光盤1張)2010-05-01[4]程國鋼51片機應用開發案例手冊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??è???????????/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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年應用心理學專業考試題及答案
- 2025年圖書館學基礎知識考試試題及答案
- 醫師考核人文試題及答案
- 求刷java面試題及答案公眾號
- 現代網絡服務模型分類試題及答案
- 項目管理流程圖的繪制方法試題及答案
- 網絡監控與風險評估的方法試題及答案
- 政治決策的科學化過程試題及答案
- 網絡工程師2025考試難度試題及答案
- 軟件設計師考試學習策略試題及答案
- 2024年上海市黃浦區四年級數學第一學期期末學業水平測試試題含解析
- 初中數學《相似三角形》壓軸30題含解析
- 2024年海南省中考數學試題卷(含答案解析)
- 云南省食品安全管理制度
- 河南省鶴壁市2023-2024學年七年級下學期期末數學試題
- 2024八年級數學下冊專題突破第11講正方形中的幾個常用模型探究含解析新版浙教版
- MOOC 電路分析AⅠ-西南交通大學 中國大學慕課答案
- 托育運營方案
- 物理因子治療技術護理課件
- 小學數學-《稅率》教學設計學情分析教材分析課后反思
- 公路日常養護巡查制度范本
評論
0/150
提交評論