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

下载本文档

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

文档简介

1、WORD17/21WORD课程设计基于Matlab的连连看开发:XXX班级:XXXXXXXX 学号:XXXXXXXXXX 指导老师:XXX西北工业大学测控技术与仪器 自动化学院2016年10月摘要在MATLAB的基础上,利用Simulink的现有库Commonly Used Blocks中的各类常用模块,使用一些基础编程代码,完成连连看的游戏设计。如果将同一模块的输入端与输出端连接之后,虽然从信号线判断其源和目的所连接的模块类型一样,应该注释掉;但是由于句柄一致,可以判断出二者实际上是一个模块,此时也将信号线自动删除,并告知玩家连接的是同一个模块。本次游戏设计中使用了一个主函数创建一个含有do

2、uble模块的模型系统。callback回调函数delete_pair_blocks.m,判断连线两端模块类型是否一样。利用寄时器callback回调函数delete_pair_bl.m设置模块属性。关键词:Simulink,MATLAB,跳转回调函数,timer目录 TOC o 1-3 h z u HYPERLINK l _Toc463967092 摘要 PAGEREF _Toc463967092 h I HYPERLINK l _Toc463967093 目录 PAGEREF _Toc463967093 h II HYPERLINK l _Toc463967094 一、游戏概述 PAGER

3、EF _Toc463967094 h 1 HYPERLINK l _Toc463967095 1.1连连看游戏简介 PAGEREF _Toc463967095 h 1 HYPERLINK l _Toc463967096 1.1.1基本概述 PAGEREF _Toc463967096 h 1 HYPERLINK l _Toc463967097 1.1.2特点处理 PAGEREF _Toc463967097 h 1 HYPERLINK l _Toc463967098 1.2 Simulink介绍 PAGEREF _Toc463967098 h 1 HYPERLINK l _Toc463967099

4、 1.2.1 Simulink简介 PAGEREF _Toc463967099 h 1 HYPERLINK l _Toc463967100 1.2.2 Simulink的启动 PAGEREF _Toc463967100 h 2 HYPERLINK l _Toc463967101 1.2.3 Simulink的模块库介绍 PAGEREF _Toc463967101 h 2 HYPERLINK l _Toc463967102 二、程序介绍 PAGEREF _Toc463967102 h 4 HYPERLINK l _Toc463967103 2.1主函数Link_and_Delete.m PAGE

5、REF _Toc463967103 h 4 HYPERLINK l _Toc463967104 2.1.1程序代码 PAGEREF _Toc463967104 h 4 HYPERLINK l _Toc463967105 2.1.2程序描述 PAGEREF _Toc463967105 h 5 HYPERLINK l _Toc463967106 2.2回调函数delete_pair_blocks.m PAGEREF _Toc463967106 h 7 HYPERLINK l _Toc463967107 2.2.1程序代码 PAGEREF _Toc463967107 h 7 HYPERLINK l

6、_Toc463967108 2.2.2程序描述 PAGEREF _Toc463967108 h 8 HYPERLINK l _Toc463967109 2.3回调函数delete_pair_bl.m PAGEREF _Toc463967109 h 9 HYPERLINK l _Toc463967110 2.3.1程序代码 PAGEREF _Toc463967110 h 9 HYPERLINK l _Toc463967111 2.3.1程序描述 PAGEREF _Toc463967111 h 9 HYPERLINK l _Toc463967112 三、设计过程 PAGEREF _Toc46396

7、7112 h 11 HYPERLINK l _Toc463967113 3.1设计思路 PAGEREF _Toc463967113 h 11 HYPERLINK l _Toc463967114 3.2设计特色描述 PAGEREF _Toc463967114 h 11 HYPERLINK l _Toc463967115 3.2.1通过timer产生callback回调函数delete_pair_bl.m设置模块 PAGEREF _Toc463967115 h 11 HYPERLINK l _Toc463967116 四、运行结果 PAGEREF _Toc463967116 h 13 HYPERL

8、INK l _Toc463967117 4.1创建新模型 PAGEREF _Toc463967117 h 13 HYPERLINK l _Toc463967118 4.2连线 PAGEREF _Toc463967118 h 13 HYPERLINK l _Toc463967119 4.3连线完成 PAGEREF _Toc463967119 h 15 HYPERLINK l _Toc463967120 4.4运行缺陷(待解决) PAGEREF _Toc463967120 h 16 HYPERLINK l _Toc463967121 4.4.1已存在link_delete.slx情况 PAGERE

9、F _Toc463967121 h 16 HYPERLINK l _Toc463967122 4.4.2首次运行情况 PAGEREF _Toc463967122 h 16 HYPERLINK l _Toc463967123 五、总结 PAGEREF _Toc463967123 h 17 HYPERLINK l _Toc463967124 参考资料 PAGEREF _Toc463967124 h 18一、游戏概述1.1连连看游戏简介1.1.1基本概述连连看,在散乱的模块阵中,将两个一样的模块连线后消除。运行Link_and_Delete.m程序,自动创建模型,模型中随机分布不同种类的模块(位置随

10、机)。用户识别一样的模块,并连线。当所有模块都两两相连的时候,系统判断用户获胜。1.1.2特点处理(1)、模块两两连线后虚化模块两两连线成功后,系统出现提示“You find one pair correctly”,模块整体虚化。保存模块在模型中,便于用户了解模型中使用的全部模块。(2)、模块连线失败后无法后退模块连接失败后无法后退,删除连线时出现“Error”警告。每一个模块都有输入输出两端口,允许一次失败。1.2Simulink介绍1.2.1 Simulink简介Simulink是Matlab软件的扩展,它是实现动态系统建模和仿真的一个软件包,它与Matlab语言的主要区别在于,其与用户交

11、互接口是基于Windows的模型化图形输入,其结果是使得用户可以把更多的精力投入到系统模型的构建,而非语言的编程上。所谓模型化图形输入是指Simulink提供了一些按功能分类的基本的系统模块,用户只需要知道这些模块的输入输出与模块的功能,而不必考察模块部是如何实现的,通过对这些基本模块的调用,再将它们连接起来就可以构成所需要的系统模型(以.mdl文件进行存取),进而进行仿真与分析。1.2.2 Simulink的启动(1)在Matlab命令窗口中输入simulink结果是在桌面上出现一个称为Simulink Library Browser的窗口,在这个窗口中列出了按功能分类的各种模块的名称。(2

12、)通过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(输入源模块)

13、二、程序介绍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 Use

14、d 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_bl

15、ock_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

16、.PortHandles.Inport,ConnectionCallback,delete_pair_blocks);end2.1.2程序描述= 1 * GB1建立一个新的模型并命名mdl_name=link_delete;mdl_fullname=mdl_name,.slx;= 2 * GB1容错处理:判断当前模型是否是一个已存在模型,若是,删除已有模型,并重新打开新的模型(或先关闭已打开模型)if exist(mdl_fullname,file)try delete(mdl_fullname);catch close_system(mdl_fullname); delete(mdl_ful

17、lname);endend= 3 * GB1后台新建和保存模型,打开新模型new_system(mdl_name);save_system(mdl_name);open_system(mdl_name);= 4 * GB1在新建的模型中放入模块= 1 * GB2将模块所在的库的字符串Simulink/Commonly Used Blocks/存入库变量block_lib_path中;将所需模块种类放入变量lib_block_name中block_lib_path=Simulink/Commonly Used Blocks/;lib_block_name=Gain,Integrator,Data

18、 Type Conversion,Saturation,Delay,Discrete-Time Integrator;= 2 * GB2选择模块数量;en_num:模块像素位置的扩大倍数,错开copy的两个模块,视觉上识别模块block_type_num=length(lib_block_name);blocks_num=5;en_num=500;= 3 * GB2for循环,实现模块的分布:同一个种类的模块不同copy分别存放如模型的不同位置,五次循环,实现10个模块的copyfor ii=1:blocks_numend= 1 * GB3创建一个1*1随机数,从五个模块索引中随机产生一个整数

19、,选择一个种类ind=randi(block_type_num,1 1);= 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:,Ma

20、keNameUnique,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 * GB2find_system找到10个既存模块的句柄放入数组blocks_handle(10*1)中for ii=1:blocks_num*2end=

21、 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.m2.2.1程序代码function delete_pair_blocks(port)persistent tport_prop=get(port)

22、;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_b

23、h,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.2.2程序描述创建函数delete_pair_blocks.m,获取连线与连线的端口模块,并判断模块种类,若种类一样,则虚化相应模块与连线。= 1 * GB1通过port获取连线delete_pair_blocks(port)= 2 * GB1通过句柄,获取连线端口的相应

24、属性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设置模块对commentedif strcmp(src_bl

25、ock.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

26、(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_st

27、r,Yes) Link_and_Delete;endendend2.3.1程序描述创建一个timer的callback的回调函数= 1 * GB1注释src和dst的模块属性set_param(src,commented,on);set_param(dst,commented,on);= 2 * GB1判断是否所有模块都被连接,游戏是否已结束if isempty(find_system(gcs,IncludeCommented,off,type,block) ans_str=questdlg(You Win!Congratulations!Another try?,You Win,Yes,No

28、,Yes);bdclose(gcs);end= 3 * GB1同时用户可选择是否重新开始新的模型游戏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,Tim

29、erFcn,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

温馨提示

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

评论

0/150

提交评论