0%

【Matlab编程】Matlab版扫雷

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

1.脚本文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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.搜索蔓延函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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.开始界面

图1

2.输了的界面

图2

3.赢了的界面

图3

坚持原创技术分享,您的支持将鼓励我继续创作!