首页 技术 正文
技术 2022年11月20日
0 收藏 643 点赞 4,302 浏览 6441 个字

我发现有些人平常闲着的时候会玩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;    endendhf=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;']);   endend

2.搜索蔓延函数如下:

function search(mf,nf,minenum,h,minefield,flag,jieshu)if flag==minefield    mh=msgbox('你好厉害哟!','提示');endif 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);elseif 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);endif 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);endif 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);endif 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);endif 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);endif 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);endif 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);endif 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]);endend

1.开始界面

2.输了的界面

3.赢了的界面

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

作者:nineheadedbird

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,990
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,504
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,348
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,133
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,765
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,843