服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - MATLAB实现五子棋游戏(双人对战、可悔棋)

MATLAB实现五子棋游戏(双人对战、可悔棋)

2021-07-31 14:54ArcheL C/C++

这篇文章主要为大家详细介绍了MATLAB实现五子棋游戏,可以进行双人对战、也可悔棋,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了MATLAB实现五子棋游戏的具体代码,供大家参考,具体内容如下

程序介绍:

1、此游戏只可用于双人对战。

2、棋盘颜色、棋盘格数、棋子颜色等参数均可自由设置

3、鼠标点击非棋盘区域可悔棋。

一、游戏界面

MATLAB实现五子棋游戏(双人对战、可悔棋)

二、主程序及函数

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
%Author:LeiZhen
%Date:2018-03-12
%此程序只下五子棋,并判断胜负关系
clear all;
clc
%定义颜色
Color_QiPanBack=[135,206,255];
Color_ChessLine=[100,100,100];
%获胜连子数
Num_Victory=5;
Dpixel=33;
NumCell=14;%棋盘格的行或列数
Wid_edge=18;
[M_QiPan,xcol_ChessLine,yrow_ChessLine]=QiPan(NumCell,Dpixel,Wid_edge,Color_QiPanBack,Color_ChessLine);
imshow(M_QiPan);
set (gcf,'Position',[600,45,625,625]);
set (gca,'Position',[0,0,1,1]);
hold on,
%棋半径
radius_Chess=15;
M_LuoZi=zeros(NumCell+1,NumCell+1,2);
VictoryB=0;
VictoryW=0;
StateB=1;
StateW=2;
NumChess=0;
for i=1:(NumCell+1)^2
  [x_col_Chess, y_row_Chess]=ginput_pointer(1);
  %获得距离鼠标点击点最近的下棋点的坐标,并保证点击的下棋点在棋盘内
  if x_col_Chess<max(xcol_ChessLine)+Dpixel/2&&x_col_Chess>min(xcol_ChessLine)-Dpixel/2&&y_row_Chess<max(yrow_ChessLine)+Dpixel/2&&y_row_Chess>min(yrow_ChessLine)-Dpixel/2
    for x_i=xcol_ChessLine
      if abs(x_col_Chess-x_i)<Dpixel/2;
        x_col_Chess=x_i;
      end
    end
    for y_i=yrow_ChessLine
      if abs(y_row_Chess-y_i)<Dpixel/2;
        y_row_Chess=y_i;
      end
    end
  %点击悔棋区(棋盘外的区域)悔棋
  else
    [x_col_LuoZi_old,y_row_LuoZi_old]=find(M_LuoZi(:,:,2)==max(max(M_LuoZi(:,:,2))));
    x_col_Chess_old=(x_col_LuoZi_old-1)*Dpixel+Wid_edge+1;
    y_row_Chess_old=(y_row_LuoZi_old-1)*Dpixel+Wid_edge+1;
    if NumChess>=1
      M_QiPan=Chess(M_QiPan,x_col_Chess_old,y_row_Chess_old,radius_Chess,3,Wid_edge,Dpixel,Color_QiPanBack,Color_ChessLine);
      imshow(M_QiPan);
      NumChess=NumChess-1;
      M_LuoZi(x_col_LuoZi_old,y_row_LuoZi_old,1)=0;
      M_LuoZi(x_col_LuoZi_old,y_row_LuoZi_old,2)=0;
    end
    continue;
  end
  %落子并防止重复在同一个下棋点落子
  x_col_LuoZi=(x_col_Chess-Wid_edge-1)/Dpixel+1;
  y_row_LuoZi=(y_row_Chess-Wid_edge-1)/Dpixel+1;
  if M_LuoZi(x_col_LuoZi,y_row_LuoZi,1)==0
    NumChess=NumChess+1;
    M_LuoZi(x_col_LuoZi,y_row_LuoZi,2)=NumChess;
    if mod(NumChess,2)==1
      M_QiPan=Chess(M_QiPan,x_col_Chess,y_row_Chess,radius_Chess,1,Wid_edge,Dpixel,Color_QiPanBack,Color_ChessLine);
      imshow(M_QiPan);
      M_LuoZi(x_col_LuoZi,y_row_LuoZi,1)=StateB; %落子为黑棋
      VictoryB=Victory_Judge(M_LuoZi,x_col_LuoZi,y_row_LuoZi,StateB);
    elseif mod(NumChess,2)==0
      M_QiPan=Chess(M_QiPan,x_col_Chess,y_row_Chess,radius_Chess,2,Wid_edge,Dpixel,Color_QiPanBack,Color_ChessLine);
      imshow(M_QiPan);
      M_LuoZi(x_col_LuoZi,y_row_LuoZi,1)=StateW; %落子为白棋
      VictoryW=Victory_Judge(M_LuoZi,x_col_LuoZi,y_row_LuoZi,StateW);
    end
  end
  %显示获胜信息
  if VictoryB==1
    %普通对话框
    h=dialog('name','对局结束','position',[500 350 250 100]);
    uicontrol('parent',h,'style','text','string','黑棋获胜!','position',[35 35 200 50],'fontsize',30);
    uicontrol('parent',h,'style','pushbutton','position',[150 5 80 30],'fontsize',20,'string','确定','callback','delete(gcbf)');
    break;
  elseif VictoryW==1
    %普通对话框
    h=dialog('name','对局结束','position',[500 350 250 100]);
    uicontrol('parent',h,'style','text','string','白棋获胜!','position',[35 35 200 50],'fontsize',30);
    uicontrol('parent',h,'style','pushbutton','position',[150 5 80 30],'fontsize',20,'string','确定','callback','delete(gcbf)');
    break;
  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
%Author:LeiZhen
%Date:2018-03-12
function [M_QiPan, xcol_ChessLine,yrow_ChessLine]=QiPan(NumCell, Dpixel, Wid_edge,Color_QiPanBack,Color_ChessLine)
%此程序为画五子棋盘的程序
%NumCell为棋盘格数
%Dpixel为相邻棋盘线间的像素间隔
%Wid_edge为棋盘边缘的像素宽度
%Color_QiPanBack为棋盘背景颜色
%Color_ChessLine为棋盘线的颜色
%M_QiPan为棋盘矩阵
%xcol_ChessLine为棋盘列线
%yrow_ChessLine为棋盘行线
NumSum=1+Dpixel*NumCell+Wid_edge*2;
xcol_ChessLine=Wid_edge+1:Dpixel:NumSum-Wid_edge;%列
yrow_ChessLine=Wid_edge+1:Dpixel:NumSum-Wid_edge;%行
M_QiPan=uint8(ones(NumSum,NumSum,3));
M_QiPan(:,:,1)=M_QiPan(:,:,1)*Color_QiPanBack(1);
M_QiPan(:,:,2)=M_QiPan(:,:,2)*Color_QiPanBack(2);
M_QiPan(:,:,3)=M_QiPan(:,:,3)*Color_QiPanBack(3);
%画棋盘线
for i=xcol_ChessLine
  M_QiPan(i,Wid_edge+1:NumSum-Wid_edge,:)=ones(NumSum-2*Wid_edge,1)*Color_ChessLine;
end
for j=yrow_ChessLine
  M_QiPan(Wid_edge+1:NumSum-Wid_edge,j,:)=ones(NumSum-2*Wid_edge,1)*Color_ChessLine;
end
%画9个小圆点
radius_Dot=5;
P1=Wid_edge+1+Dpixel*3:Dpixel*(NumCell/2-3):Wid_edge+1+Dpixel*(NumCell-3);
for ti=P1
  for tj=P1
    for Num=ti-radius_Dot:ti+radius_Dot;
      for j=tj-radius_Dot:tj+radius_Dot;
        if (Num-ti)^2+(j-tj)^2<radius_Dot^2
          M_QiPan(Num,j,:)=Color_ChessLine;
        end
      end
    end
  end
end
end

3、下棋或悔棋函数

?
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
%Author:LeiZhen
%Date:2018-03-12
function M_QiPan=Chess(M_QiPan,x_col_Chess,y_row_Chess,radius_Chess,BorW,Wid_edge,Dpixel,Color_QiPanBack,Color_ChessLine)
%此程序下棋或者悔棋
%M_QiPan为棋盘矩阵
%xcol_ChessLine为棋盘列线
%yrow_ChessLine为棋盘行线
%radius_Chess为棋的像素半径
%BorW为下棋选择,1黑棋,2白棋,3悔棋
%Wid_edge为棋盘矩阵中的棋盘边缘的像素宽度
%Dpixel为棋盘矩阵中的相邻棋盘线间的像素间隔
%Color_QiPanBack为棋盘背景颜色
%Color_ChessLine为棋盘线的颜色
Color_BChess=[54,54,54];
Color_WChess=[255,240,245];
[Wid,Hei,Deep]=size(M_QiPan);
for i=x_col_Chess-radius_Chess:x_col_Chess+radius_Chess
  for j=y_row_Chess-radius_Chess:y_row_Chess+radius_Chess
    if (i-x_col_Chess)^2+(j-y_row_Chess)^2<=radius_Chess^2
      if BorW==1%黑棋
        M_QiPan(j,i,:)=Color_BChess;
      elseif BorW==2%白棋
        M_QiPan(j,i,:)=Color_WChess;
      elseif BorW==3%悔棋
        M_QiPan(j,i,:)=Color_QiPanBack;
        %对于不是棋盘边缘的棋子
        if i==x_col_Chess||j==y_row_Chess
          M_QiPan(j,i,:)=Color_ChessLine;
        end
        %悔棋点是否为小圆点
        if ((i-x_col_Chess)^2+(j-y_row_Chess)^2<5^2)&&...
          (x_col_Chess==Wid_edge+1+Dpixel*3||x_col_Chess==floor(Wid/2)+1||x_col_Chess==Wid-Wid_edge-Dpixel*3)&&...
          (y_row_Chess==Wid_edge+1+Dpixel*3||y_row_Chess==floor(Wid/2)+1||y_row_Chess==Wid-Wid_edge-Dpixel*3)     
          M_QiPan(j,i,:)=Color_ChessLine;
        end
        %对于棋盘边缘的棋子
        if x_col_Chess==Wid_edge+1&&i<x_col_Chess
          M_QiPan(j,i,:)=Color_QiPanBack;
        elseif x_col_Chess==Wid-Wid_edge&&i>x_col_Chess
          M_QiPan(j,i,:)=Color_QiPanBack;
        end
        if y_row_Chess==Wid_edge+1&&j<y_row_Chess
          M_QiPan(j,i,:)=Color_QiPanBack;
        elseif y_row_Chess==Wid-Wid_edge&&j>y_row_Chess
          M_QiPan(j,i,:)=Color_QiPanBack;
        end
      end
    end
  end
end
end

4、胜负判断函数

?
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
%Author:LeiZhen
%Date:2018-03-12
function Victory_flag=Victory_Judge(M_LuoZi,x_col_LuoZi,y_row_LuoZi,State)
%对一方是否获胜的判断函数
%M_LuoZi为下棋点的矩阵
%x_col_LuoZi为下棋列数
%y_row_LuoZi下棋行数
%State为M_LuoZi矩阵某点的下棋状态,黑棋(1)或白棋(2)或无棋(0),以及每步棋的序号
%NumCell为棋盘格数
%Victory_flag为胜利标志
NumCell=length(M_LuoZi)-1;
Victory_flag=0;
for i=1:NumCell-3
  if M_LuoZi(i,y_row_LuoZi,1)==State&&M_LuoZi(i+1,y_row_LuoZi,1)==State&&M_LuoZi(i+2,y_row_LuoZi,1)==State&&M_LuoZi(i+3,y_row_LuoZi,1)==State&&M_LuoZi(i+4,y_row_LuoZi,1)==State
    Victory_flag=1;
    break;
  end
  if M_LuoZi(x_col_LuoZi,i,1)==State&&M_LuoZi(x_col_LuoZi,i+1,1)==State&&M_LuoZi(x_col_LuoZi,i+2,1)==State&&M_LuoZi(x_col_LuoZi,i+3,1)==State&&M_LuoZi(x_col_LuoZi,i+4,1)==State
    Victory_flag=1;
    break;
  end
  if abs(x_col_LuoZi-y_row_LuoZi)+i<=NumCell-3
    if x_col_LuoZi>=y_row_LuoZi
      if M_LuoZi(abs(x_col_LuoZi-y_row_LuoZi)+i,i,1)==State&&M_LuoZi(abs(x_col_LuoZi-y_row_LuoZi)+i+1,i+1,1)==State&&M_LuoZi(abs(x_col_LuoZi-y_row_LuoZi)+i+2,i+2,1)==State&&M_LuoZi(abs(x_col_LuoZi-y_row_LuoZi)+i+3,i+3,1)==State&&M_LuoZi(abs(x_col_LuoZi-y_row_LuoZi)+i+4,i+4,1)==State
        Victory_flag=1;
        break;
      end
    elseif x_col_LuoZi<y_row_LuoZi
      if M_LuoZi(i,abs(x_col_LuoZi-y_row_LuoZi)+i,1)==State&&M_LuoZi(i+1,abs(x_col_LuoZi-y_row_LuoZi)+i+1,1)==State&&M_LuoZi(i+2,abs(x_col_LuoZi-y_row_LuoZi)+i+2,1)==State&&M_LuoZi(i+3,abs(x_col_LuoZi-y_row_LuoZi)+i+3,1)==State&&M_LuoZi(i+4,abs(x_col_LuoZi-y_row_LuoZi)+i+4,1)==State
        Victory_flag=1;
        break;
      end
    end
  end
  if y_row_LuoZi+x_col_LuoZi<=NumCell+2&&y_row_LuoZi+x_col_LuoZi-i>=5
    if M_LuoZi(y_row_LuoZi+x_col_LuoZi-i,i,1)==State&&M_LuoZi(y_row_LuoZi+x_col_LuoZi-i-1,i+1,1)==State&&M_LuoZi(y_row_LuoZi+x_col_LuoZi-i-2,i+2,1)==State&&M_LuoZi(y_row_LuoZi+x_col_LuoZi-i-3,i+3,1)==State&&M_LuoZi(y_row_LuoZi+x_col_LuoZi-i-4,i+4,1)==State
      Victory_flag=1;
      break;
    end
  elseif y_row_LuoZi+x_col_LuoZi>NumCell+2&&y_row_LuoZi+x_col_LuoZi+i<=NumCell*2-1
    offset=NumCell+2;
    if M_LuoZi(y_row_LuoZi+x_col_LuoZi-offset+i,offset-i,1)==State&&M_LuoZi(y_row_LuoZi+x_col_LuoZi-offset+i+1,offset-i-1,1)==State&&M_LuoZi(y_row_LuoZi+x_col_LuoZi-offset+i+2,offset-i-2,1)==State&&M_LuoZi(y_row_LuoZi+x_col_LuoZi-offset+i+3,offset-i-3,1)==State&&M_LuoZi(y_row_LuoZi+x_col_LuoZi-offset+i+4,offset-i-4,1)==State
      Victory_flag=1;
      break;
    end
  end
end
end

5、光标函数(由库函数改动而来)

?
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
%此函数为库函数的修改,仅将十字光标改为箭头光标,改动位置为第88行
function [out1,out2,out3] = ginput_pointer(arg1)
%GINPUT Graphical input from mouse.
%  [X,Y] = GINPUT(N) gets N points from the current axes and returns
%  the X- and Y-coordinates in length N vectors X and Y. The cursor
%  can be positioned using a mouse. Data points are entered by pressing
%  a mouse button or any key on the keyboard except carriage return,
%  which terminates the input before N points are entered.
%
%  [X,Y] = GINPUT gathers an unlimited number of points until the
return key is pressed.
%
%  [X,Y,BUTTON] = GINPUT(N) returns a third result, BUTTON, that
%  contains a vector of integers specifying which mouse button was
%  used (1,2,3 from left) or ASCII numbers if a key on the keyboard
%  was used.
%
%  Examples:
%    [x,y] = ginput;
%
%    [x,y] = ginput(5);
%
%    [x, y, button] = ginput(1);
%
%  See also GTEXT, WAITFORBUTTONPRESS.
 
%  Copyright 1984-2011 The MathWorks, Inc.
%  $Revision: 5.32.4.18 $ $Date: 2011/05/17 02:35:09 $
 
out1 = []; out2 = []; out3 = []; y = [];
c = computer;
if ~strcmp(c(1:2),'PC')
  tp = get(0,'TerminalProtocol');
else
  tp = 'micro';
end
 
if ~strcmp(tp,'none') && ~strcmp(tp,'x') && ~strcmp(tp,'micro'),
  if nargout == 1,
    if nargin == 1,
      out1 = trmginput(arg1);
    else
      out1 = trmginput;
    end
  elseif nargout == 2 || nargout == 0,
    if nargin == 1,
      [out1,out2] = trmginput(arg1);
    else
      [out1,out2] = trmginput;
    end
    if nargout == 0
      out1 = [ out1 out2 ];
    end
  elseif nargout == 3,
    if nargin == 1,
      [out1,out2,out3] = trmginput(arg1);
    else
      [out1,out2,out3] = trmginput;
    end
  end
else
  
  fig = gcf;
  figure(gcf);
  
  if nargin == 0
    how_many = -1;
    b = [];
  else
    how_many = arg1;
    b = [];
    if ischar(how_many) ...
        || size(how_many,1) ~= 1 || size(how_many,2) ~= 1 ...
        || ~(fix(how_many) == how_many) ...
        || how_many < 0
      error(message('MATLAB:ginput:NeedPositiveInt'))
    end
    if how_many == 0
      % If input argument is equal to zero points,
      % give a warning and return empty for the outputs.
      
      warning (message('MATLAB:ginput:InputArgumentZero'));
    end
  end
  
  % Setup the figure to disable interactive modes and activate pointers.
  initialState = setupFcn(fig);
  set(gcf, 'pointer', 'arrow');
  
  % onCleanup object to restore everything to original state in event of
  % completion, closing of figure errors or ctrl+c.
  c = onCleanup(@() restoreFcn(initialState));
    
  
  % We need to pump the event queue on unix
  % before calling WAITFORBUTTONPRESS
  drawnow
  char = 0;
  
  while how_many ~= 0
    % Use no-side effect WAITFORBUTTONPRESS
    waserr = 0;
    try
      keydown = wfbp;
    catch %#ok<CTCH>
      waserr = 1;
    end
    if(waserr == 1)
      if(ishghandle(fig))
        cleanup(c);
        error(message('MATLAB:ginput:Interrupted'));
      else
        cleanup(c);
        error(message('MATLAB:ginput:FigureDeletionPause'));
      end
    end
    % g467403 - ginput failed to discern clicks/keypresses on the figure it was
    % registered to operate on and any other open figures whose handle
    % visibility were set to off
    figchildren = allchild(0);
    if ~isempty(figchildren)
      ptr_fig = figchildren(1);
    else
      error(message('MATLAB:ginput:FigureUnavailable'));
    end
    %     old code -> ptr_fig = get(0,'CurrentFigure'); Fails when the
    %     clicked figure has handlevisibility set to callback
    if(ptr_fig == fig)
      if keydown
        char = get(fig, 'CurrentCharacter');
        button = abs(get(fig, 'CurrentCharacter'));
      else
        button = get(fig, 'SelectionType');
        if strcmp(button,'open')
          button = 1;
        elseif strcmp(button,'normal')
          button = 1;
        elseif strcmp(button,'extend')
          button = 2;
        elseif strcmp(button,'alt')
          button = 3;
        else
          error(message('MATLAB:ginput:InvalidSelection'))
        end
      end
      axes_handle = gca;
      drawnow;
      pt = get(axes_handle, 'CurrentPoint');
      
      how_many = how_many - 1;
      
      if(char == 13) % & how_many ~= 0)
        % if the return key was pressed, char will == 13,
        % and that's our signal to break out of here whether
        % or not we have collected all the requested data
        % points.
        % If this was an early breakout, don't include
        % the <Return> key info in the return arrays.
        % We will no longer count it if it's the last input.
        break;
      end
      
      out1 = [out1;pt(1,1)]; %#ok<AGROW>
      y = [y;pt(1,2)]; %#ok<AGROW>
      b = [b;button]; %#ok<AGROW>
    end
  end
  
  % Cleanup and Restore
  cleanup(c);
  
  if nargout > 1
    out2 = y;
    if nargout > 2
      out3 = b;
    end
  else
    out1 = [out1 y];
  end
  
end
end
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function key = wfbp
%WFBP  Replacement for WAITFORBUTTONPRESS that has no side effects.
 
fig = gcf;
current_char = []; %#ok<NASGU>
 
% Now wait for that buttonpress, and check for error conditions
waserr = 0;
try
  h=findall(fig,'Type','uimenu','Accelerator','C');  % Disabling ^C for edit menu so the only ^C is for
  set(h,'Accelerator','');              % interrupting the function.
  keydown = waitforbuttonpress;
  current_char = double(get(fig,'CurrentCharacter')); % Capturing the character.
  if~isempty(current_char) && (keydown == 1)     % If the character was generated by the
    if(current_char == 3)              % current keypress AND is ^C, set 'waserr'to 1
      waserr = 1;                 % so that it errors out.
    end
  end
  
  set(h,'Accelerator','C');              % Set back the accelerator for edit menu.
catch %#ok<CTCH>
  waserr = 1;
end
drawnow;
if(waserr == 1)
  set(h,'Accelerator','C');             % Set back the accelerator if it errored out.
  error(message('MATLAB:ginput:Interrupted'));
end
if nargout>0, key = keydown; end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
function initialState = setupFcn(fig)
% Store Figure Handle.
initialState.figureHandle = fig;
% Suspend figure functions
initialState.uisuspendState = uisuspend(fig);
% Disable Plottools Buttons
initialState.toolbar = findobj(allchild(fig),'flat','Type','uitoolbar');
if ~isempty(initialState.toolbar)
  initialState.ptButtons = [uigettool(initialState.toolbar,'Plottools.PlottoolsOff'), ...
    uigettool(initialState.toolbar,'Plottools.PlottoolsOn')];
  initialState.ptState = get (initialState.ptButtons,'Enable');
  set (initialState.ptButtons,'Enable','off');
end
% Setup FullCrosshair Pointer without warning.
oldwarnstate = warning('off', 'MATLAB:hg:Figure:Pointer');
set(fig,'Pointer','fullcrosshair');
warning(oldwarnstate);
% Adding this to enable automatic updating of currentpoint on the figure
set(fig,'WindowButtonMotionFcn',@(o,e) dummy());
% Get the initial Figure Units
initialState.fig_units = get(fig,'Units');
end
function restoreFcn(initialState)
if ishghandle(initialState.figureHandle)
  % Figure Units
  set(initialState.figureHandle,'Units',initialState.fig_units);
  set(initialState.figureHandle,'WindowButtonMotionFcn','');
  
  % Plottools Icons
  if ~isempty(initialState.toolbar) && ~isempty(initialState.ptButtons)
    set (initialState.ptButtons(1),'Enable',initialState.ptState{1});
    set (initialState.ptButtons(2),'Enable',initialState.ptState{2});
  end
  
  % UISUSPEND
  uirestore(initialState.uisuspendState);
end
end
function dummy()
% do nothing, this is there to update the GINPUT WindowButtonMotionFcn.
end
function cleanup(c)
if isvalid(c)
  delete(c);
end
end

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_25634581/article/details/79086244

延伸 · 阅读

精彩推荐