




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计基于Matlab的连连看开发:***班级:**********:**********指导教师:***西北工业大学测控技术与仪器自动化学院2016年10月摘要在MATLAB的根底上,利用Simulink的现有库monlyUsedBlocks中的各类常用模块,使用一些根底编程代码,完成连连看的游戏设计。如果将同一模块的输入端与输出端连接之后,虽然从信号线判断其源和目的所连接的模块类型一样,应该注释掉;但是由于句柄一致,可以判断出二者实际上是一个模块,此时也将信号线自动删除,并告知玩家连接的是同一个模块。本次游戏设计中使用了一个主函数创立一个含有double模块的模型系统。callback回调函数delete_pair_blocks.m,判断连线两端模块类型是否一样。利用寄时器callback回调函数delete_pair_bl.m设置模块属性。关键词:Simulink,MATLAB,跳转回调函数,timer目录摘要I目录I一、游戏概述11.1连连看游戏简介1根本概述1特点处理11.2Simulink介绍11.2.1Simulink简介11.2.2Simulink的启动11.2.3Simulink的模块库介绍1二、程序介绍12.1主函数Link_and_Delete.m1程序代码1程序描述12.2回调函数delete_pair_blocks.m1程序代码1程序描述12.3回调函数delete_pair_bl.m1程序代码1程序描述1三、设计过程13.1设计思路13.2设计特色描述1通过timer产生callback回调函数delete_pair_bl.m设置模块1四、运行结果14.1创立新模型14.2连线14.3连线完成14.4运行缺陷〔待解决〕1已存在link_delete.sl*情况1首次运行情况1五、总结1参考资料1一、游戏概述1.1连连看游戏简介根本概述连连看,在散乱的模块阵中,将两个一样的模块连线后消除。运行Link_and_Delete.m程序,自动创立模型,模型中随机分布不同种类的模块(位置随机)。用户识别一样的模块,并连线。当所有模块都两两相连的时候,系统判断用户获胜。特点处理(1)、模块两两连线后虚化模块两两连线成功后,系统出现提示“Youfindonepaircorrectly〞,模块整体虚化。保存模块在模型中,便于用户了解模型中使用的全部模块。(2)、模块连线失败后无法后退模块连接失败后无法后退,删除连线时出现“Error〞警告。每一个模块都有输入输出两端口,允许一次失败。1.2Simulink介绍1.2.1Simulink简介Simulink是Matlab软件的扩展,它是实现动态系统建模和仿真的一个软件包,它与Matlab语言的主要区别在于,其与用户交互接口是基于Windows的模型化图形输入,其结果是使得用户可以把更多的精力投入到系统模型的构建,而非语言的编程上。所谓模型化图形输入是指Simulink提供了一些按功能分类的根本的系统模块,用户只需要知道这些模块的输入输出及模块的功能,而不必考察模块部是如何实现的,通过对这些根本模块的调用,再将它们连接起来就可以构成所需要的系统模型〔以.mdl文件进展存取〕,进而进展仿真与分析。1.2.2Simulink的启动〔1〕在Matlab命令窗口中输入simulink结果是在桌面上出现一个称为SimulinkLibraryBrowser的窗口,在这个窗口中列出了按功能分类的各种模块的名称。〔2〕通过Matlab主窗口的快捷按钮来翻开SimulinkLibraryBrowser窗口。〔3〕在MATLAB命令窗口中输入simulink3结果是在桌面上出现一个用图标形式显示的Library:simulink3的Simulink模块库窗口。1.2.3Simulink的模块库介绍Simulink模块库按功能进展分为以下8类子库:Continuous〔连续模块〕Discrete〔离散模块〕Function&Tables〔函数和平台模块〕Math〔数学模块〕Nonlinear〔非线性模块〕Signals&Systems〔信号和系统模块〕Sinks〔接收器模块〕Sources〔输入源模块〕二、程序介绍2.1主函数Link_and_Delete.m程序代码mdl_name='link_delete';mdl_fullname=[mdl_name,'.sl*'];ife*ist(mdl_fullname,'file')trydelete(mdl_fullname);catchclose_system(mdl_fullname);delete(mdl_fullname);endendnew_system(mdl_name);save_system(mdl_name);open_system(mdl_name);block_lib_path='Simulink/monlyUsedBlocks/';lib_block_name={'Gain','Integrator','DataTypeConversion','Saturation','Delay','Discrete-TimeIntegrator'};block_type_num=length(lib_block_name);blocks_num=5;en_num=500;forii=1:blocks_numind=randi(block_type_num,[11]);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');forii=1:blocks_num*2prop=get(blocks_handle(ii));set(prop.PortHandles.Inport,'ConnectionCallback','delete_pair_blocks');end程序描述=1\*GB1⒈建立一个新的模型并命名mdl_name='link_delete';mdl_fullname=[mdl_name,'.sl*'];=2\*GB1⒉容错处理:判断当前模型是否是一个已存在模型,假设是,删除已有模型,并重新翻开新的模型〔或先关闭已翻开模型〕ife*ist(mdl_fullname,'file')trydelete(mdl_fullname);catchclose_system(mdl_fullname);delete(mdl_fullname);endend=3\*GB1⒊后台新建和保存模型,翻开新模型new_system(mdl_name);save_system(mdl_name);open_system(mdl_name);=4\*GB1⒋在新建的模型中放入模块=1\*GB2⑴将模块所在的库的字符串'Simulink/monlyUsedBlocks/'存入库变量block_lib_path中;将所需模块种类放入变量lib_block_name中block_lib_path='Simulink/monlyUsedBlocks/';lib_block_name={'Gain','Integrator','DataTypeConversion','Saturation','Delay','Discrete-TimeIntegrator'};=2\*GB2⑵选择模块数量;en_num:模块像素位置的扩大倍数,错开copy的两个模块,视觉上识别模块block_type_num=length(lib_block_name);blocks_num=5;en_num=500;=3\*GB2⑶for循环,实现模块的分布:同一个种类的模块不同copy分别存放如模型的不同位置,五次循环,实现10个模块的copyforii=1:blocks_numend=1\*GB3①创立一个1*1随机数,从五个模块索引中随机产生一个整数,选择一个种类ind=randi(block_type_num,[11]);=2\*GB3②字符串拼接模块全名,得到源模块和目标模块,add_block得到每一个unique的模块名称src_str=strcat(block_lib_path,lib_block_name(ind));dst_str=strcat(mdl_name,'/',lib_block_name(ind));=3\*GB3③获取第一个模块的位置句柄,pos+en_num*rand产生第二个模块的位置句柄〔大小不变,位置起点变化〕,完成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);=5\*GB1⒌模块端口属性配置回调函数ConnectionCallbackblocks_handle=find_system(gcs,'findall','on','type','block');=1\*GB2⑴find_system找到10个既存模块的句柄放入数组blocks_handle〔10*1〕中forii=1:blocks_num*2end=2\*GB2⑵获取blocks_handle属性,再获取模块端口句柄prop=get(blocks_handle(ii));=3\*GB2⑶每个模块的设置ConnectionCallback,触发delete_pair_blocks.m,判断是否匹配相连的两个模块set(prop.PortHandles.Inport,'ConnectionCallback','delete_pair_blocks');2.2回调函数delete_pair_blocks.m程序代码functiondelete_pair_blocks(port)persistenttport_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);ifstrcmp(src_block.BlockType,dst_block.BlockType)disp('Youfindonepaircorrectly');ifisempty(t)t=timer;endset(t,'StartDelay',0.1,'TimerF',{delete_pair_bl,src_bh,dst_bh});start(t);elsedisp('Youfindonepairworingly');ifisempty(t)t=timer;endset(t,'StartDelay',0.3,'TimerF',{delete_pair_line,line_prop.Handle});start(t);end程序描述创立函数delete_pair_blocks.m,获取连线与连线的端口模块,并判断模块种类,假设种类一样,则虚化相应模块及连线。=1\*GB1⒈通过port获取连线delete_pair_blocks(port)=2\*GB1⒉通过句柄,获取连线端口的相应属性port_prop=get(port);line_prop=get(port_prop.Line);=3\*GB1⒊寻找端口模块的源和目标句柄,获得相应参数src_bh=line_prop.SrcBlockHandle;dst_bh=line_prop.DstBlockHandle;src_block=get(src_bh);dst_block=get(dst_bh);=4\*GB1⒋判断源和目标模块的种类属性是否一致,strcmp比照;显示相应信息,并通过timer产生callback回调函数delete_pair_bl.m设置模块对mentedifstrcmp(src_block.BlockType,dst_block.BlockType)disp('Youfindonepaircorrectly');ifisempty(t)t=timer;endset(t,'StartDelay',0.1,'TimerF',{delete_pair_bl,src_bh,dst_bh});start(t);elsedisp('Youfindonepairworingly');ifisempty(t)t=timer;endset(t,'StartDelay',0.3,'TimerF',{delete_pair_line,line_prop.Handle});start(t);end2.3回调函数delete_pair_bl.m程序代码functiondelete_pair_bl(obj,event,src,dst)set_param(src,'mented','on');set_param(dst,'mented','on');ifisempty(find_system(gcs,'Includemented','off','type','block'))ans_str=questdlg('YouWin!Congratulations!Anothertry"','YouWin','Yes','No','Yes');bdclose(gcs);ifstrcmp(ans_str,'Yes')Link_and_Delete;endendend程序描述创立一个timer的callback的回调函数=1\*GB1⒈注释src和dst的模块属性set_param(src,'mented','on');set_param(dst,'mented','on');=2\*GB1⒉判断是否所有模块都被连接,游戏是否已完毕ifisempty(find_system(gcs,'Includemented','off','type','block'))ans_str=questdlg('YouWin!Congratulations!Anothertry"','YouWin','Yes','No','Yes');bdclose(gcs);end=3\*GB1⒊同时用户可选择是否重新开场新的模型游戏ifstrcmp(ans_str,'Yes')Link_and_Delete;end三、设计过程3.1设计思路3.2设计特色描述通过timer产生callback回调函数delete_pair_bl.m设置模块Simulink在执行callback时不能修改任一的模块,即仿真进展时不能动态注释模块。故在delete_pair_blocks.m中不使用set_param修改,而选择定时器。ifisempty(t)t=timer;endset(t,'StartDelay',0.1,'TimerF',{delete_pair_bl,src_bh,dst_bh});start(t);定时器启动0.1秒延迟,定时器由Matlab提供,延时后callback回调函数delete_pair_bl.m,并将src_bh、dst_bh作为输入参数。set_param(src,'mented','on');set_param(dst,'mented','on');延迟的作用在于执行完成主函数callback回调函数delete_pair_blocks.m,同时启动timer的callback,回调函数delete_pair_bl.m中注释源与目标模块,实现多线程并发,提高执行速度。四、运行结果4.1创立新模型方法一:在Matlab命令窗口中输入Link_and_Delete方法二:翻开Link_and_Delete.m文件,点击运行快捷按键4.2连线连接两模块的输入与输出端口,系统判断假设连线两端的模块属性一致,则在Matlab命令窗口中显示Youfindonepaircorrectly;假设连线两段的模块属性不一致,则在Matlab命令窗口中显示Youfindonepairworingly由于每个模块都有一个输出与一个输入端口,则每个模块的连线有一次错误的时机,故设计连线过程无法后退,连线无法删
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 细胞研发面试题及答案
- 公务员省考资料分析与解读试题及答案
- 案场形体培训
- 一年级语文学科评估试题及答案
- 2024年宠物营养多样性与均衡知识试题及答案
- 计算机基础复习时间管理技巧及试题和答案
- 智界货车测试题及答案
- 2024汽车维修工考试过程中常见问题应对试题及答案
- 经典java面试题及答案解析
- 2024年计算机基础考试复习技术建议试题及答案
- 楼梯踏步抹灰标准合同7篇
- 【厦门大学】DeepSeek大模型赋能高校教学和科研
- 西安房屋租赁合同(官方版)6篇
- 2025届高三化学二轮复习 化学工艺流程 课件
- 2024广东深圳市龙岗区产服集团“春雨”第二批招聘笔试笔试参考题库附带答案详解
- PLC应用技术课件 任务7. S7-1200 PLC控制电动机星三角启动(定时器)
- 旅行社运营实务课件 2.2 设计国内长线主题旅游产品
- 《清华大学介绍》课件
- DB33T 2383-2021 公路工程强力搅拌就地固化设计与施工技术规范
- 25地基岩土的工程分类分类依据分类目的土岩石分类见表18至表111
- 2025年中国融通资产管理集团限公司春季招聘(511人)高频重点提升(共500题)附带答案详解
评论
0/150
提交评论