已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
西北工業(yè)大學(xué)課程設(shè)計(jì)基于Matlab的連連看開發(fā)姓名: 班級(jí): 學(xué)號(hào): 指導(dǎo)老師: 西北工業(yè)大學(xué)測(cè)控技術(shù)與儀器 自動(dòng)化學(xué)院2016年10月18摘要在MATLAB的基礎(chǔ)上,利用Simulink的現(xiàn)有庫(kù)Commonly Used Blocks中的各類常用模塊,使用一些基礎(chǔ)編程代碼,完成連連看的游戲設(shè)計(jì)。如果將同一模塊的輸入端與輸出端連接之后,雖然從信號(hào)線判斷其源和目的所連接的模塊類型相同,應(yīng)該注釋掉;但是由于句柄一致,可以判斷出二者實(shí)際上是一個(gè)模塊,此時(shí)也將信號(hào)線自動(dòng)刪除,并告知玩家連接的是同一個(gè)模塊。本次游戲設(shè)計(jì)中使用了一個(gè)主函數(shù)創(chuàng)建一個(gè)含有double模塊的模型系統(tǒng)。callback回調(diào)函數(shù)delete_pair_blocks.m,判斷連線兩端模塊類型是否相同。利用寄時(shí)器callback回調(diào)函數(shù)delete_pair_bl.m設(shè)置模塊屬性。關(guān)鍵詞:Simulink,MATLAB,跳轉(zhuǎn)回調(diào)函數(shù),timer目錄摘要I目錄II一、游戲概述11.1連連看游戲簡(jiǎn)介11.1.1基本概述11.1.2特點(diǎn)處理11.2 Simulink介紹11.2.1 Simulink簡(jiǎn)介11.2.2 Simulink的啟動(dòng)21.2.3 Simulink的模塊庫(kù)介紹2二、程序介紹42.1主函數(shù)Link_and_Delete.m42.1.1程序代碼42.1.2程序描述52.2回調(diào)函數(shù)delete_pair_blocks.m72.2.1程序代碼72.2.2程序描述82.3回調(diào)函數(shù)delete_pair_bl.m92.3.1程序代碼92.3.1程序描述9三、設(shè)計(jì)過程113.1設(shè)計(jì)思路113.2設(shè)計(jì)特色描述113.2.1通過timer產(chǎn)生callback回調(diào)函數(shù)delete_pair_bl.m設(shè)置模塊11四、運(yùn)行結(jié)果134.1創(chuàng)建新模型134.2連線134.3連線完成154.4運(yùn)行缺陷(待解決)164.4.1已存在link_delete.slx情況164.4.2首次運(yùn)行情況16五、總結(jié)17參考資料18一、游戲概述1.1連連看游戲簡(jiǎn)介1.1.1基本概述連連看,在散亂的模塊陣中,將兩個(gè)相同的模塊連線后消除。運(yùn)行Link_and_Delete.m程序,自動(dòng)創(chuàng)建模型,模型中隨機(jī)分布不同種類的模塊(位置隨機(jī))。用戶識(shí)別相同的模塊,并連線。當(dāng)所有模塊都兩兩相連的時(shí)候,系統(tǒng)判斷用戶獲勝。1.1.2特點(diǎn)處理(1)、模塊兩兩連線后虛化模塊兩兩連線成功后,系統(tǒng)出現(xiàn)提示“You find one pair correctly”,模塊整體虛化。保存模塊在模型中,便于用戶了解模型中使用的全部模塊。(2)、模塊連線失敗后無(wú)法后退模塊連接失敗后無(wú)法后退,刪除連線時(shí)出現(xiàn)“Error”警告。每一個(gè)模塊都有輸入輸出兩端口,允許一次失敗。1.2 Simulink介紹1.2.1 Simulink簡(jiǎn)介Simulink是Matlab軟件的擴(kuò)展,它是實(shí)現(xiàn)動(dòng)態(tài)系統(tǒng)建模和仿真的一個(gè)軟件包,它與Matlab語(yǔ)言的主要區(qū)別在于,其與用戶交互接口是基于Windows的模型化圖形輸入,其結(jié)果是使得用戶可以把更多的精力投入到系統(tǒng)模型的構(gòu)建,而非語(yǔ)言的編程上。所謂模型化圖形輸入是指Simulink提供了一些按功能分類的基本的系統(tǒng)模塊,用戶只需要知道這些模塊的輸入輸出及模塊的功能,而不必考察模塊內(nèi)部是如何實(shí)現(xiàn)的,通過對(duì)這些基本模塊的調(diào)用,再將它們連接起來(lái)就可以構(gòu)成所需要的系統(tǒng)模型(以.mdl文件進(jìn)行存?。?,進(jìn)而進(jìn)行仿真與分析。1.2.2 Simulink的啟動(dòng)(1)在Matlab命令窗口中輸入simulink結(jié)果是在桌面上出現(xiàn)一個(gè)稱為Simulink Library Browser的窗口,在這個(gè)窗口中列出了按功能分類的各種模塊的名稱。(2)通過Matlab主窗口的快捷按鈕來(lái)打開Simulink Library Browser窗口。(3)在MATLAB命令窗口中輸入simulink3結(jié)果是在桌面上出現(xiàn)一個(gè)用圖標(biāo)形式顯示的Library :simulink3的Simulink模塊庫(kù)窗口。1.2.3 Simulink的模塊庫(kù)介紹Simulink模塊庫(kù)按功能進(jìn)行分為以下8類子庫(kù):Continuous(連續(xù)模塊)Discrete(離散模塊)Function&Tables(函數(shù)和平臺(tái)模塊)Math(數(shù)學(xué)模塊)Nonlinear(非線性模塊)Signals&Systems(信號(hào)和系統(tǒng)模塊)Sinks(接收器模塊)Sources(輸入源模塊)二、程序介紹2.1主函數(shù)Link_and_Delete.m2.1.1程序代碼mdl_name=link_delete;mdl_fullname=mdl_name,.slx; if exist(mdl_fullname,file) try delete(mdl_fullname); catch close_system(mdl_fullname); delete(mdl_fullname); endendnew_system(mdl_name);save_system(mdl_name);open_system(mdl_name);block_lib_path=Simulink/Commonly Used Blocks/;lib_block_name=Gain,Integrator,Data Type Conversion,Saturation,Delay,Discrete-Time Integrator;block_type_num=length(lib_block_name);blocks_num=5;en_num=500;for ii=1:blocks_num ind=randi(block_type_num,1 1); src_str=strcat(block_lib_path,lib_block_name(ind); dst_str=strcat(mdl_name,/,lib_block_name(ind); block_handle=add_block(src_str:,dst_str:,MakeNameUnique,on); pos=get_param(block_handle,position); add_block(src_str:,dst_str:,MakeNameUnique,on,position,pos+en_num*rand);endblocks_handle=find_system(gcs,findall,on,type,block);for ii=1:blocks_num*2 prop=get(blocks_handle(ii); set(prop.PortHandles.Inport,ConnectionCallback,delete_pair_blocks); end 2.1.2程序描述建立一個(gè)新的模型并命名mdl_name=link_delete;mdl_fullname=mdl_name,.slx;容錯(cuò)處理:判斷當(dāng)前模型是否是一個(gè)已存在模型,若是,刪除已有模型,并重新打開新的模型(或先關(guān)閉已打開模型)if exist(mdl_fullname,file) try delete(mdl_fullname); catch close_system(mdl_fullname); delete(mdl_fullname); endend后臺(tái)新建和保存模型,打開新模型new_system(mdl_name);save_system(mdl_name);open_system(mdl_name);在新建的模型中放入模塊將模塊所在的庫(kù)的字符串Simulink/Commonly Used Blocks/存入庫(kù)變量block_lib_path中;將所需模塊種類放入變量lib_block_name中block_lib_path=Simulink/Commonly Used Blocks/;lib_block_name=Gain,Integrator,Data Type Conversion,Saturation,Delay,Discrete-Time Integrator;選擇模塊數(shù)量;en_num:模塊像素位置的擴(kuò)大倍數(shù),錯(cuò)開copy的兩個(gè)模塊,視覺上識(shí)別模塊block_type_num=length(lib_block_name);blocks_num=5;en_num=500;for循環(huán),實(shí)現(xiàn)模塊的分布:同一個(gè)種類的模塊不同copy分別存放如模型的不同位置,五次循環(huán),實(shí)現(xiàn)10個(gè)模塊的copyfor ii=1:blocks_numend創(chuàng)建一個(gè)1*1隨機(jī)數(shù),從五個(gè)模塊索引中隨機(jī)產(chǎn)生一個(gè)整數(shù),選擇一個(gè)種類ind=randi(block_type_num,1 1);字符串拼接模塊全名,得到源模塊和目標(biāo)模塊,add_block得到每一個(gè)unique的模塊名稱src_str=strcat(block_lib_path,lib_block_name(ind);dst_str=strcat(mdl_name,/,lib_block_name(ind);獲取第一個(gè)模塊的位置句柄,pos+en_num*rand產(chǎn)生第二個(gè)模塊的位置句柄(大小不變,位置起點(diǎn)變化),完成copyblock_handle=add_block(src_str:,dst_str:,MakeNameUnique,on);pos=get_param(block_handle,position); add_block(src_str:,dst_str:,MakeNameUnique,on,position,pos+en_num*rand);模塊端口屬性配置回調(diào)函數(shù)ConnectionCallbackblocks_handle=find_system(gcs,findall,on,type,block);find_system找到10個(gè)既存模塊的句柄放入數(shù)組blocks_handle(10*1)中for ii=1:blocks_num*2end獲取blocks_handle屬性,再獲取模塊端口句柄prop=get(blocks_handle(ii);每個(gè)模塊的設(shè)置ConnectionCallback,觸發(fā)delete_pair_blocks.m,判斷是否匹配相連的兩個(gè)模塊set(prop.PortHandles.Inport,ConnectionCallback,delete_pair_blocks);2.2回調(diào)函數(shù)delete_pair_blocks.m2.2.1程序代碼function delete_pair_blocks(port)persistent tport_prop=get(port);line_prop=get(port_prop.Line);src_bh=line_prop.SrcBlockHandle;dst_bh=line_prop.DstBlockHandle;src_block=get(src_bh);dst_block=get(dst_bh);if strcmp(src_block.BlockType,dst_block.BlockType) disp(You find one pair correctly); if isempty(t) t=timer; end set(t,StartDelay,0.1,TimerFcn,delete_pair_bl,src_bh,dst_bh); start(t);else disp(You find one pair woringly); if isempty(t) t=timer; end set(t,StartDelay,0.3,TimerFcn,delete_pair_line,line_prop.Handle); start(t);end 2.2.2程序描述創(chuàng)建函數(shù)delete_pair_blocks.m,獲取連線與連線的端口模塊,并判斷模塊種類,若種類相同,則虛化相應(yīng)模塊及連線。通過port獲取連線delete_pair_blocks(port)通過句柄,獲取連線端口的相應(yīng)屬性port_prop=get(port);line_prop=get(port_prop.Line);尋找端口模塊的源和目標(biāo)句柄,獲得相應(yīng)參數(shù)src_bh=line_prop.SrcBlockHandle;dst_bh=line_prop.DstBlockHandle;src_block=get(src_bh);dst_block=get(dst_bh);判斷源和目標(biāo)模塊的種類屬性是否一致,strcmp對(duì)比;顯示相應(yīng)信息,并通過timer產(chǎn)生callback回調(diào)函數(shù)delete_pair_bl.m設(shè)置模塊對(duì)commentedif strcmp(src_block.BlockType,dst_block.BlockType) disp(You find one pair correctly); if isempty(t) t=timer; end set(t,StartDelay,0.1,TimerFcn,delete_pair_bl,src_bh,dst_bh); start(t);else disp(You find one pair woringly); if isempty(t) t=timer; end set(t,StartDelay,0.3,TimerFcn,delete_pair_line,line_prop.Handle); start(t);end2.3回調(diào)函數(shù)delete_pair_bl.m2.3.1程序代碼function delete_pair_bl(obj,event,src,dst)set_param(src,commented,on);set_param(dst,commented,on);if isempty(find_system(gcs,IncludeCommented,off,type,block) ans_str=questdlg(You Win!Congratulations!Another try?,You Win,Yes,No,Yes);bdclose(gcs); if strcmp(ans_str,Yes) Link_and_Delete;endend end 2.3.1程序描述創(chuàng)建一個(gè)timer的callback的回調(diào)函數(shù)注釋src和dst的模塊屬性set_param(src,commented,on);set_param(dst,commented,on);判斷是否所有模塊都被連接,游戲是否已結(jié)束if isempty(find_system(gcs,IncludeCommented,off,type,block) ans_str=questdlg(You Win!Congratulations!Another try?,You Win,Yes,No,Yes);bdclose(gcs);end同時(shí)用戶可選擇是否重新開始新的模型游戲if strcmp(ans_str,Yes) Link_and_Delete; end三、設(shè)計(jì)過程3.1設(shè)計(jì)思路3.2設(shè)計(jì)特色描述3.2.1通過timer產(chǎn)生callback回調(diào)函數(shù)delete_pair_bl.m設(shè)置模塊Simulink在執(zhí)行callback時(shí)不能修改任一的模塊,即仿真進(jìn)行時(shí)不能動(dòng)態(tài)注釋模塊。故在delete_pair_blocks.m中不使用set_param修改,而選擇定時(shí)器。if isempty(t) t=timer; end set(t,StartDelay,0.1,TimerFcn,delete_pair_bl,src_bh,dst_bh); start(t);定時(shí)器啟動(dòng)0.1秒延遲,定時(shí)器由Matlab提供,延時(shí)后callback回調(diào)函數(shù)delete_pair_bl.m,并將src_bh、dst_bh作為輸入?yún)?shù)。set_param(src,commented,on);set_param(dst,commented,on);延遲的作用在于執(zhí)行完成主函數(shù)callback回調(diào)函數(shù)delete_pair_blocks.m,同時(shí)啟動(dòng)timer的callback,回調(diào)函數(shù)delete_pair_bl.m中注釋源與目標(biāo)模塊,實(shí)現(xiàn)多線程并發(fā),提高執(zhí)行速度。四、運(yùn)行結(jié)果4.1創(chuàng)建新模型方法一:在Matlab命令窗口中輸入Link_and_Delete方法二:打開Link_and_Delete.m文件,點(diǎn)擊運(yùn)行快捷按鍵4.2連線連接兩模塊的輸入與輸出端口,系統(tǒng)判斷若連線兩端的模塊屬性一致,則在Matlab命令窗口中顯示You find one pair correctly ;若連線兩段的模塊屬性不一致,則在Matlab命令窗口中顯示You find one pair woringly 由于每個(gè)模塊都有一個(gè)輸出與一個(gè)輸入端口,則每個(gè)模塊的連線有一次錯(cuò)誤的機(jī)會(huì),故設(shè)計(jì)連線過程無(wú)法后退,連線無(wú)法刪除情況一:連線正確情況二:連線失敗4.3連線完成Matlab命令窗口中顯示如下判斷所有模塊均連線完成,則出現(xiàn)以下窗口,若點(diǎn)擊Yes則開啟新的模型,游戲再次開始;若點(diǎn)擊
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024美發(fā)店與消防部門安全檢查合同
- 2025年度校園食堂廚師勞務(wù)派遣合同4篇
- 2025年度圖書代售及推廣服務(wù)合同4篇
- 2024碎石原料交易市場(chǎng)建設(shè)合同
- 2024裝修工程額外項(xiàng)目合同書一
- 2025年度智慧城市建設(shè)綜合解決方案承包合作協(xié)議4篇
- 2025年度SEO風(fēng)險(xiǎn)管理與合規(guī)性審核合同3篇
- 2025年度山林土地流轉(zhuǎn)與綜合開發(fā)承包合同4篇
- 2024正規(guī)商鋪買賣合同合同標(biāo)的物權(quán)屬核實(shí)協(xié)議3篇
- 2024年教學(xué)專用高清晰度數(shù)碼集成背投行業(yè)發(fā)展趨勢(shì)報(bào)告
- GB/T 16895.3-2024低壓電氣裝置第5-54部分:電氣設(shè)備的選擇和安裝接地配置和保護(hù)導(dǎo)體
- 2025湖北襄陽(yáng)市12345政府熱線話務(wù)員招聘5人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 計(jì)劃合同部部長(zhǎng)述職報(bào)告范文
- 2025年河北省職業(yè)院校技能大賽智能節(jié)水系統(tǒng)設(shè)計(jì)與安裝(高職組)考試題庫(kù)(含答案)
- 人教版高一地理必修一期末試卷
- 2024年下半年鄂州市城市發(fā)展投資控股集團(tuán)限公司社會(huì)招聘【27人】易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- GB/T 29498-2024木門窗通用技術(shù)要求
- 《職業(yè)院校與本科高校對(duì)口貫通分段培養(yǎng)協(xié)議書》
- GJB9001C質(zhì)量管理體系要求-培訓(xùn)專題培訓(xùn)課件
- 人教版(2024)英語(yǔ)七年級(jí)上冊(cè)單詞表
- 二手車車主寄售協(xié)議書范文范本
評(píng)論
0/150
提交評(píng)論