【matlab编程】Matlab版扫雷

       我发现有些人平常闲着的时候会玩window自带的游戏,其中最常见的就是扫雷和纸牌。本来想用matlab编写全自动扫雷程序用来作弊,可是后来发现扫雷问题是NP完全问题(正如:旅行商NP难问题一样不能被解决),便放弃了。于是编写了类似扫雷游戏(没有经过大量测试,可能有bug,效率也不高,作弊:在命令窗口输入minefield 其中,值为1的地方为雷区)。大致规则和原来一样,只是做了些改进:加入了音乐和语音提示。具体代码如下(下面有两个文件:一个脚本文件,一个函数文件,只需运行第一个文件即可):

1.脚本文件:

clear all;
row=10;
col=10;
num=30;
jieshu=0;
%global flag;
flag=zeros(row,col);
flag1=ones(row,col);
minenum=zeros(row,col);
minefield=rand(row,col);
[temp,index]=sort(minefield(:));
minefield=(minefield<=minefield(index(num)));
count=0;
for i=1:row
    for j=1:col
      x1=i-1;y1=j-1;
      x2=i-1;y2=j;
      x3=i-1;y3=j+1;
      x4=i;  y4=j-1;
      x5=i;  y5=j+1;
      x6=i+1;y6=j-1;
      x7=i+1;y7=j;
      x8=i+1;y8=j+1;
      if x1>0&&y1>0
          if minefield(x1,y1)==1
              count=count+1;
          end
      end
      if x2>0
          if minefield(x2,y2)==1
              count=count+1;
          end
      end
      if x3>0&&y3<11
          if minefield(x3,y3)==1
              count=count+1;
          end
      end
      if y4>0
          if minefield(x4,y4)==1
              count=count+1;
          end
      end
      if y5<11
          if minefield(x5,y5)==1
              count=count+1;
          end
      end
      if x6<11&&y6>0
          if minefield(x6,y6)==1
              count=count+1;
          end
      end
      if x7<11
          if minefield(x7,y7)==1
              count=count+1;
          end
      end
      if x8<11&&y8<11
          if minefield(x8,y8)==1
              count=count+1;
          end
      end
    minenum(i,j)=count;
    count=0;
    end
end

hf=figure('NumberTitle','off','Name','扫雷','menubar','none');
uh1=uimenu('label','游戏');
uimenu(uh1,'label','背景颜色选择','callback','c=uisetcolor([0 0 1],''选择颜色'');set(hf,''color'',c);');
uh2=uimenu('label','帮助');
uimenu(uh2,'label','游戏规则','callback',['text(-0.05,0,''与window自带的扫雷不同的是:雷用黑色标记,右击时用红色作记号,'',''fontsize'',12,''fontname'',''宋体'');',...
       'hold on; text(-0.12,-0.07,''输了后,会有音乐和语音提示,赢了后,会有语音提示!'',''fontsize'',12,''fontname'',''宋体'') ; axis off ']);
uimenu(uh2,'label','制作信息','callback','msgbox(''copyright:Wteng  Thanks for using!'')');
for m=1:row;
    for n=1:col;
       h(m,n)=uicontrol(gcf,'style','push',...
            'foregroundColor',0.7*[1,1,1],...
            'string',strcat(num2str(m),num2str(n)),...
            'unit','normalized','position',[0.16+0.053*n,0.9-0.073*m,0.05,0.07],...
            'BackgroundColor',0.7*[1,1,1],'fontsize',17,...
            'fontname','times new roman',...
            'ButtonDownFcn',['if isequal(get(gcf,''SelectionType''),''alt'')',...
            ' if ~get(gco,''Value'') if isequal(get(gco,''Tag''),''y'') ',...
            'set(gco,''style'',''push'',''string'','''',''backgroundcolor'',0.7*[1 1 1]);',...
            'set(gco,''Tag'',''n''); else set(gco,''style'',''text'',''string'','''',''backgroundcolor'',[1 0 0]);',...
            'set(gco,''Tag'',''y'');end;end;end'],...
            'Callback',['h1=gcbo;[mf,nf]=find(h==h1);search(mf,nf,minenum,h,minefield,flag,jieshu);'...
            'for i=1:10 for j=1:10  hcomp(i,j)=get(h(i,j),''value'');  end;end;comp=(~hcomp==minefield);',...
            'if  all(comp(:))  mh=msgbox(''你好厉害哟!!'',''提示'');sp=actxserver(''SAPI.SpVoice'');sp.Speak(''你好厉害哟!''); end;']);
   end
end

2.搜索蔓延函数如下:

function search(mf,nf,minenum,h,minefield,flag,jieshu)
if flag==minefield
    mh=msgbox('你好厉害哟!','提示');
end
if minefield(mf,nf)==1
    set(gco,'style','text','string','','backgroundcolor',[0 0 0]);
    load handel;
    sound(y,Fs)
    pause(10);
    mh=msgbox('您输了!请再接再厉!','提示');
    sp=actxserver('SAPI.SpVoice');
    sp.Speak('您输了!请再接再厉!')
    pause(2)
    close all;
    delete(hf);
else
if minenum(mf,nf)==0
    flag(mf,nf)=1;
    set(h(mf,nf),'string','');
    set(h(mf,nf),'value',1);
    mf1=mf-1;nf1=nf-1;
    mf2=mf-1;nf2=nf;
    mf3=mf-1;nf3=nf+1;
    mf4=mf;  nf4=nf-1;
    mf5=mf;  nf5=nf+1;
    mf6=mf+1;nf6=nf-1;
    mf7=mf+1;nf7=nf;
    mf8=mf+1;nf8=nf+1;
if mf1>0&&nf1>0 && flag(mf1,nf1)==0
    flag(mf1,nf1)=1;
    if minenum(mf1,nf1)==0
        set(h(mf1,nf1),'style','text','string','','backgroundcolor',[0 0 0]);
    else
    set(h(mf1,nf1),'string',num2str(minenum(mf1,nf1)));
    set(h(mf1,nf1), 'foregroundColor',0.1*[1,1,1]);
    set(h(mf1,nf1),'style','text','backgroundcolor',[1 1 1]);
    end
    if minenum(mf1,nf1)==0
        search(mf1,nf1,minenum,h,minefield,flag,jieshu);

    end
    set(h(mf1,nf1),'value',1);
end
if mf2>0 && flag(mf2,nf2)==0
    flag(mf2,nf2)=1;
    if minenum(mf2,nf2)==0
        set(h(mf2,nf2),'style','text','string','','backgroundcolor',[0 0 0]);
    else
    set(h(mf2,nf2),'string',num2str(minenum(mf2,nf2)));
    end
    set(h(mf2,nf2), 'foregroundColor',0.1*[1,1,1]);
    set(h(mf2,nf2),'style','text','backgroundcolor',[1 1 1]);

    if minenum(mf2,nf2)==0
        search(mf2,nf2,minenum,h,minefield,flag,jieshu);
    end
    set(h(mf2,nf2),'value',1);
end
if mf3>0&&nf3<11 && flag(mf3,nf3)==0
    flag(mf3,nf3)=1;
    if minenum(mf3,nf3)==0
        set(h(mf3,nf3),'style','text','string','','backgroundcolor',[0 0 0]);
    else
    set(h(mf3,nf3),'string',num2str(minenum(mf3,nf3)));
    end
    set(h(mf3,nf3), 'foregroundColor',0.1*[1,1,1]);
    set(h(mf3,nf3),'style','text','backgroundcolor',[1 1 1]);

    if minenum(mf3,nf3)==0
        search(mf3,nf3,minenum,h,minefield,flag,jieshu);
    end
    set(h(mf3,nf3),'value',1);
end
if nf4>0 && flag(mf4,nf4)==0
    flag(mf4,nf4)=1;
    if minenum(mf4,nf4)==0
        set(h(mf4,nf4),'style','text','string','','backgroundcolor',[0 0 0]);
    else
    set(h(mf4,nf4),'string',num2str(minenum(mf4,nf4)));
    end
    set(h(mf4,nf4), 'foregroundColor',0.1*[1,1,1]);
    set(h(mf4,nf4),'style','text','backgroundcolor',[1 1 1]);

    if minenum(mf4,nf4)==0
        search(mf4,nf4,minenum,h,minefield,flag,jieshu);
    end
    set(h(mf4,nf4),'value',1);
end
if nf5<11 && flag(mf5,nf5)==0
    flag(mf5,nf5)=1;
    if minenum(mf5,nf5)==0
        set(h(mf5,nf5),'style','text','string','','backgroundcolor',[0 0 0]);
    else
    set(h(mf5,nf5),'string',num2str(minenum(mf5,nf5)));
    end
    set(h(mf5,nf5), 'foregroundColor',0.1*[1,1,1]);
    set(h(mf5,nf5),'style','text','backgroundcolor',[1 1 1]);

    if minenum(mf5,nf5)==0
        search(mf5,nf5,minenum,h,minefield,flag,jieshu);
    end
    set(h(mf5,nf5),'value',1);
end
if mf6<11&&nf6>0 && flag(mf6,nf6)==0
    flag(mf6,nf6)=1;
    if minenum(mf6,nf6)==0
        set(h(mf6,nf6),'style','text','string','','backgroundcolor',[0 0 0]);
    else
    set(h(mf6,nf6),'string',num2str(minenum(mf6,nf6)));
    end
    set(h(mf6,nf6), 'foregroundColor',0.1*[1,1,1]);
    set(h(mf6,nf6),'style','text','backgroundcolor',[1 1 1]);

    if minenum(mf6,nf6)==0
        search(mf6,nf6,minenum,h,minefield,flag,jieshu);
    end
    set(h(mf6,nf6),'value',1);
end
if mf7<11 && flag(mf7,nf7)==0
    flag(mf7,nf7)=1;
    if minenum(mf7,nf7)==0
        set(h(mf7,nf7),'style','text','string','','backgroundcolor',[0 0 0]);
    else
    set(h(mf7,nf7),'string',num2str(minenum(mf7,nf7)));
    end
    set(h(mf7,nf7), 'foregroundColor',0.1*[1,1,1]);
    set(h(mf7,nf7),'style','text','backgroundcolor',[1 1 1]);

    if minenum(mf7,nf7)==0
        search(mf7,nf7,minenum,h,minefield,flag,jieshu);
    end
    set(h(mf7,nf7),'value',1);
end
if mf8<11&&nf8<11 && flag(mf8,nf8)==0
    flag(mf8,nf8)=1;
    if minenum(mf8,nf8)==0
        set(h(mf8,nf8),'style','text','string','','backgroundcolor',[0 0 0]);
    else
    set(h(mf8,nf8),'string',num2str(minenum(mf8,nf8)));
    end
    set(h(mf8,nf8), 'foregroundColor',0.1*[1,1,1]);
    set(h(mf8,nf8),'style','text','backgroundcolor',[1 1 1]);

    if minenum(mf8,nf8)==0
        search(mf8,nf8,minenum,h,minefield,flag,jieshu);
    end
    set(h(mf8,nf8),'value',1);
end
    else
    set(h(mf,nf),'string',num2str(minenum(mf,nf)));
end
  set(h(mf,nf), 'foregroundColor',0.1*[1,1,1]);
  set(h(mf,nf),'style','text','backgroundcolor',[1 1 1]);
end
end

1.开始界面

2.输了的界面

3.赢了的界面

原文:http://blog.csdn.net/tengweitw/article/details/20228303

作者:nineheadedbird

时间: 2024-07-28 22:21:19

【matlab编程】Matlab版扫雷的相关文章

【Matlab编程】哈夫曼编码的Matlab实现

       在前年暑假的时候,用C实现了哈夫曼编译码的功能,见文章<哈夫曼树及编译码>.不过在通信仿真中,经常要使用到Matlab编程,所以为了方便起见,这里用Matlab实现的哈夫曼编码的功能.至于哈夫曼编译码的基本原理,我们可以参考之前的文章<哈夫曼树及编译码>,里面有详细的说明及图解过程.下面直接给出具体的Matlab实现的哈夫曼编码函数,由于程序中注释还算比较详细,在此就不予与说明: function [ h,e ] = Huffman_code( p ) %p为概率分布

《MATLAB/Simulink系统仿真超级学习手册》——2.7 MATLAB编程实例

2.7 MATLAB编程实例 MATLAB/Simulink系统仿真超级学习手册 MATLAB强大的运算功能和图形功能,是实现各领域的编程仿真的有力工具.本节将综合本章所讲的内容介绍MATLAB的一些编程实例,使读者对MATLAB语言的应用有一些基本的了解. 2.7.1 汉诺塔问题 Hanoi(汉诺)塔问题,是一个古典的数学问题,是一个用递归方法解题的典型例子.问题是这样的:古代有一个梵塔,塔内有3个座A.B.C,开始时A座上有n个盘子,盘子大小不等,大的在上,小的在下如图2-35所示. 现在,

全相位FFT matlab编程实现

问题描述 全相位FFT matlab编程实现 求大神指教!>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>&

《MATLAB/Simulink系统仿真超级学习手册》——第2章 MATLAB编程基础 2.1 MATLAB工作环境

第2章 MATLAB编程基础 本书使用的MATLAB版本为MATLAB R.本章将较全面地介绍MATLAB正常运行的基本流程以及编程基础与技巧,帮助读者在领略MATLAB非凡能力的同时比较轻松地跨过MATLAB门槛,为后面学习MATLAB工具箱Simulink打下坚实的基础. 2.1 MATLAB工作环境 MATLAB/Simulink系统仿真超级学习手册 MATLAB提供了全新的工作环境,了解并熟悉该环境是使用MATLAB的基础.下面将介绍MATLAB主界面(包括工具栏.命令窗口等).文本编辑

运筹学最小费用最大流,MATLAB编程

问题描述 运筹学最小费用最大流,MATLAB编程 汽车生产 Fordco公司在底特律和达拉斯生产汽车.底特律的工厂最多可以生产6500辆汽车,达拉斯的工厂最多可以生产6000辆汽车.生产一辆汽车的成本在底特律是2000美元,在达拉斯是1800美元.汽车必须运输到3个城市.城市1必须收到5000辆汽车,城市2必须收到4000辆汽车,城市3必须收到3000辆汽车.下表给出了把一辆汽车从每家工厂运输到每个城市的运输成本.从给定的工厂到给定的城市最多只能运送3000辆汽车.表述一个可以使满足需求的成本最

Matlab编程基础

原文:Matlab编程基础   平台:Win7 64 bit,Matlab R2014a(8.3)   "Matlab"是"Matrix Laboratory" 的缩写,中文"矩阵实验室",是强大的数学工具.本文侧重于Matlab的编程语言侧面,讲述Matlab的基本语法,以及用Matlab语言进行程序设计.值得一提的是,Matlab从R2014a版本开始支持中文语言了!   1.基本概念 Matlab默认启动后界面: Matlab有关的文件后缀

贝叶斯回归的matlab编程问题

问题描述 贝叶斯回归的matlab编程问题 请问各位大神,贝叶斯回归的matlab程序怎么编写啊?中间的MH算法如何实现 解决方案 贝叶斯回归的程序google下有千千万万.你不会可以找一些参考下. 解决方案二: 顶一个,我也不会....

Win8版扫雷正式登陆:造型终于变了!

扫雷游戏绝对是不少人都会记忆深刻的一款Windows小游戏,自从Windows 3.1开始,扫雷就成为了系统默认自带小游戏,也成为了不少人在掉线状态的消遣之一.如今,这款经典的小游戏再次登陆全新的Windows 8以及RT平台. Windows 8版扫雷一改千年不变的老造型,界面也更加生动.趣味十足.需要指出的是,这一游戏尽管依旧免费,但不再是系统自带,而需要用户从Windows Store中下载. 除了扫雷,微软还表示麻将和纸牌未来也都会在Windows平台上线. 想活动一下大脑么?一起来玩玩

拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录

目录 目录 关于这本书 必看知识点 最后 关于这本书 <Python 核心编程 (第二版)>是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高级主题 两大部分,以 Python 2.x 作为主要演示版本,涵盖的知识面广,知识点较齐全,代码多且好理解,但对 Python 版本特性的内容太久远,不合时宜. 整体来说 Python 核心 部分是主要内容,高级主题 部分作为应用扩展内容.后半部分篇幅较短,内容不够深入,只到了解的层面,好在横向够广(每一个主

C语言开发简易版扫雷小游戏_C 语言

前言: 想起来做这个是因为那时候某天知道了原来黑框框里面的光标是可以控制的,而且又经常听人说起这个,就锻炼一下好了. 之前就完成了那1.0的版本,现在想放上来分享却发现有蛮多问题的,而且最重要的是没什么注释[果然那时候太年轻]!现在看了也是被那时候的自己逗笑了,就修改了一些小bug,增加了算是详尽而清楚的注释,嗯,MSDN上面对各种函数的解释很详细的[又锻炼一下英语],顺便让开头和结尾的展示"动"了起来,就当作1.5的版本好了. 这个只是给出了一个实现的思路,其中肯定也有很多不合理的地