基于MATLAB的连连看开发.doc_第1页
基于MATLAB的连连看开发.doc_第2页
基于MATLAB的连连看开发.doc_第3页
基于MATLAB的连连看开发.doc_第4页
基于MATLAB的连连看开发.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西北工业大学课程设计基于Matlab的连连看开发姓名: XXX 班级: XXXXXXXX 学号: XXXXXXXXXX 指导老师: XXX 西北工业大学测控技术与仪器 自动化学院2016年10月18摘要在MATLAB的基础上,利用Simulink的现有库Commonly Used Blocks中的各类常用模块,使用一些基础编程代码,完成连连看的游戏设计。如果将同一模块的输入端与输出端连接之后,虽然从信号线判断其源和目的所连接的模块类型相同,应该注释掉;但是由于句柄一致,可以判断出二者实际上是一个模块,此时也将信号线自动删除,并告知玩家连接的是同一个模块。本次游戏设计中使用了一个主函数创建一个含有double模块的模型系统。callback回调函数delete_pair_blocks.m,判断连线两端模块类型是否相同。利用寄时器callback回调函数delete_pair_bl.m设置模块属性。关键词:Simulink,MATLAB,跳转回调函数,timer目录摘要I目录II一、游戏概述11.1连连看游戏简介11.1.1基本概述11.1.2特点处理11.2 Simulink介绍11.2.1 Simulink简介11.2.2 Simulink的启动21.2.3 Simulink的模块库介绍2二、程序介绍42.1主函数Link_and_Delete.m42.1.1程序代码42.1.2程序描述52.2回调函数delete_pair_blocks.m72.2.1程序代码72.2.2程序描述82.3回调函数delete_pair_bl.m92.3.1程序代码92.3.1程序描述9三、设计过程113.1设计思路113.2设计特色描述113.2.1通过timer产生callback回调函数delete_pair_bl.m设置模块11四、运行结果134.1创建新模型134.2连线134.3连线完成154.4运行缺陷(待解决)164.4.1已存在link_delete.slx情况164.4.2首次运行情况16五、总结17参考资料18一、游戏概述1.1连连看游戏简介1.1.1基本概述连连看,在散乱的模块阵中,将两个相同的模块连线后消除。运行Link_and_Delete.m程序,自动创建模型,模型中随机分布不同种类的模块(位置随机)。用户识别相同的模块,并连线。当所有模块都两两相连的时候,系统判断用户获胜。1.1.2特点处理(1)、模块两两连线后虚化模块两两连线成功后,系统出现提示“You find one pair correctly”,模块整体虚化。保存模块在模型中,便于用户了解模型中使用的全部模块。(2)、模块连线失败后无法后退模块连接失败后无法后退,删除连线时出现“Error”警告。每一个模块都有输入输出两端口,允许一次失败。1.2 Simulink介绍1.2.1 Simulink简介Simulink是Matlab软件的扩展,它是实现动态系统建模和仿真的一个软件包,它与Matlab语言的主要区别在于,其与用户交互接口是基于Windows的模型化图形输入,其结果是使得用户可以把更多的精力投入到系统模型的构建,而非语言的编程上。所谓模型化图形输入是指Simulink提供了一些按功能分类的基本的系统模块,用户只需要知道这些模块的输入输出及模块的功能,而不必考察模块内部是如何实现的,通过对这些基本模块的调用,再将它们连接起来就可以构成所需要的系统模型(以.mdl文件进行存取),进而进行仿真与分析。1.2.2 Simulink的启动(1)在Matlab命令窗口中输入simulink结果是在桌面上出现一个称为Simulink Library Browser的窗口,在这个窗口中列出了按功能分类的各种模块的名称。(2)通过Matlab主窗口的快捷按钮来打开Simulink Library Browser窗口。(3)在MATLAB命令窗口中输入simulink3结果是在桌面上出现一个用图标形式显示的Library :simulink3的Simulink模块库窗口。1.2.3 Simulink的模块库介绍Simulink模块库按功能进行分为以下8类子库:Continuous(连续模块)Discrete(离散模块)Function&Tables(函数和平台模块)Math(数学模块)Nonlinear(非线性模块)Signals&Systems(信号和系统模块)Sinks(接收器模块)Sources(输入源模块)二、程序介绍2.1主函数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程序描述建立一个新的模型并命名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); endend后台新建和保存模型,打开新模型new_system(mdl_name);save_system(mdl_name);open_system(mdl_name);在新建的模型中放入模块将模块所在的库的字符串Simulink/Commonly Used Blocks/存入库变量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;选择模块数量;en_num:模块像素位置的扩大倍数,错开copy的两个模块,视觉上识别模块block_type_num=length(lib_block_name);blocks_num=5;en_num=500;for循环,实现模块的分布:同一个种类的模块不同copy分别存放如模型的不同位置,五次循环,实现10个模块的copyfor ii=1:blocks_numend创建一个1*1随机数,从五个模块索引中随机产生一个整数,选择一个种类ind=randi(block_type_num,1 1);字符串拼接模块全名,得到源模块和目标模块,add_block得到每一个unique的模块名称src_str=strcat(block_lib_path,lib_block_name(ind);dst_str=strcat(mdl_name,/,lib_block_name(ind);获取第一个模块的位置句柄,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);模块端口属性配置回调函数ConnectionCallbackblocks_handle=find_system(gcs,findall,on,type,block);find_system找到10个既存模块的句柄放入数组blocks_handle(10*1)中for ii=1:blocks_num*2end获取blocks_handle属性,再获取模块端口句柄prop=get(blocks_handle(ii);每个模块的设置ConnectionCallback,触发delete_pair_blocks.m,判断是否匹配相连的两个模块set(prop.PortHandles.Inport,ConnectionCallback,delete_pair_blocks);2.2回调函数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程序描述创建函数delete_pair_blocks.m,获取连线与连线的端口模块,并判断模块种类,若种类相同,则虚化相应模块及连线。通过port获取连线delete_pair_blocks(port)通过句柄,获取连线端口的相应属性port_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);判断源和目标模块的种类属性是否一致,strcmp对比;显示相应信息,并通过timer产生callback回调函数delete_pair_bl.m设置模块对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回调函数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程序描述创建一个timer的callback的回调函数注释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);end同时用户可选择是否重新开始新的模型游戏if strcmp(ans_str,Yes) Link_and_Delete; end三、设计过程3.1设计思路3.2设计特色描述3.2.1通过timer产生callback回调函数delete_pair_bl.m设置模块Simulink在执行callback时不能修改任一的模块,即仿真进行时不能动态注释模块。故在delete_pair_blocks.m中不使用set_param修改,而选择定时器。if isempty(t) t=timer; end set(t,StartDelay,0.1,TimerFcn,delete_pair_bl,src_bh,dst_bh); start(t);定时器启动0.1秒延迟,定时器由Matlab提供,延时后callback回调函数delete_pair_bl.m,并将src_bh、dst_bh作为输入参数。set_param(src,commented,on);set_param(dst,commented,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命令窗口中显示You find one pair correctly ;若连线两段的模块属性不一致,则在Matlab命令窗口中显示You find one pair woringly 由于每个模块都有一个输出与一个输入端口,则每个模块的连线有一次错误的机会,故设计连线过程无法后退,连线无法删除情况一:连线正确情况二:连线失败4.3连线完成Matlab命令窗口中显示如下判断所有模块均连线完成,则出现以下窗口,若点击Yes则开启新的模型,游戏再次开始;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论