前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Experiment with MATLAB》读书笔记(十一)

《Experiment with MATLAB》读书笔记(十一)

作者头像
万木逢春
发布2018-04-18 10:49:50
7220
发布2018-04-18 10:49:50
举报
文章被收录于专栏:帮你学MatLab帮你学MatLab

读书笔记(十一)

% 这是第十一部分GUI,通过一个游戏展示 function tictactoe(job) % 井字棋游戏以及变形 % 游戏1是在1至9中最先连续选择三个数和为15者胜利

% 游戏2就是经典的井字棋游戏形式

% 游戏3展示了为什么其实是一个游戏

% 最初定义的变量是 X, game, B, and job. % X 是个3阶矩阵,其中 X(i,j) 表示玩家操作 % -1 表示蓝色选择, % 0 表示没被选, % +1 表示绿色选择. % game 就是游戏类型1,2,3. % B 是个三阶矩阵用来获取鼠标点击. % job 表示初始化以及后续玩家. if nargin == 0 X = zeros(3,3); game = 1; B = buttons; job = ''; else [X,game,B] = getgame; end switch job case 'green' [i,j] = find(gcbo == B); if winner(X) || X(i,j) return end X(i,j) = 1; savegame(X,game,B) tictactoe('blue') return case 'blue' if winner(X) return end [i,j] = strategy(X,-1); X(i,j) = -1; case 'game' game = mod(game,3)+1; case 'start' X = zeros(3,3); case 'exit' close(gcf) return end savegame(X,game,B) % ------------------------ function p = winner(X) % p = winner(X) 返回游戏赢家 % p = 0, 没人赢, % p = -1, 蓝色赢, % p = 1, 绿色赢, % p = 2, 平局. for p = [-1 1] s = 3*p; win = any(sum(X) == s) || any(sum(X,2) == s) || ... sum(diag(X)) == s || sum(diag(fliplr(X))) == s; % any(一个矩阵)只要列中有一个不是0就返回真 if win return end end p = 2*all(X(:) ~= 0); % all(一个矩阵)列中所有均不是0才返回真 % ------------------------ function [i,j] = winningmove(X,p) % [i,j] 返回计算机为了赢的选择. s = 2*p; % find(逻辑判断)返回矩阵元素下标 % diag(方阵)返回对角线元素 % fliplr(矩阵)返回左右翻折之后的矩阵 if any(sum(X) == s) j = find(sum(X) == s); i = find(X(:,j) == 0); elseif any(sum(X,2) == s) i = find(sum(X,2) == s); j = find(X(i,:) == 0); elseif sum(diag(X)) == s i = find(diag(X) == 0); j = i; elseif sum(diag(fliplr(X))) == s i = find(diag(fliplr(X)) == 0); j = 4 - i; else i = []; j = []; end % ------------------------ function [i,j] = strategy(X,p) % [i,j] 返回计算机的选择. % 思考0.5秒. pause(0.5) % 如果可以就往可以赢的地方. [i,j] = winningmove(X,p); % 封锁对手赢的机会. if isempty(i) [i,j] = winningmove(X,-p); end % 否则就随机. if isempty(i) [i,j] = find(X == 0); m = ceil(rand*length(i)); % 取整 i = i(m); j = j(m); end % ------------------------ function B = buttons % 初始化按钮与数字. clf shg % 打开图形界面 set(gcf,'menubar','none','numbertitle','off','name','Tictactoe') B = zeros(3,3); M = magic(3); for k = 1:9 [i,j] = find(k == M); B(i,j) = uicontrol('style','pushbutton','units','normal', ... 'fontsize',16,'callback','tictactoe(''green'')'); % 按钮 end uicontrol('style','text','units','normal','pos',[0.30 0.82 0.40 0.10], ... 'fontsize',20,'background',get(gcf,'color'),'tag','toptext'); uicontrol('style','text','units','normal','pos',[0.20 0.72 0.60 0.10], ... 'fontsize',10,'background',get(gcf,'color'),'tag','toptext','string', ... ['Pick single digit numbers. Each digit can be chosen only once. ' ... 'Generate a total of 15 using exactly three digits.']) uicontrol('style','pushbutton','units','normal','string','Game', ... 'fontsize',12,'position',[.23 .12 .15 .07], ... 'callback','tictactoe(''game'')'); % 游戏按钮 uicontrol('style','pushbutton','units','normal','string','Start', ... 'fontsize',12,'position',[.43 .12 .15 .07], ... 'callback','tictactoe(''start'')'); % 开始按钮 uicontrol('style','pushbutton','units','normal','string','Exit', ... 'fontsize',12,'position',[.63 .12 .15 .07], ... 'callback','tictactoe(''exit'')'); % 退出按钮 % ------------------------ function [X,game,B] = getgame % 恢复游戏状态. ud = get(gcf,'userdata'); X = ud{1}; game = ud{2}; B = ud{3}; % ------------------------ function savegame(X,game,B) % 更新游戏显示. M = magic(3); for k = 1:9 [i,j] = find(k == M); switch game case 1 % 游戏1 pos = [0.10*k-0.055 0.50 0.10 0.1333]; str = int2str(k); case 2 % 井字棋 pos = [0.10*j+0.25 0.1333*(4-i)+0.17 0.10 0.1333]; str = ''; case 3 % 游戏3 pos = [0.10*j+0.25 0.1333*(4-i)+0.17 0.10 0.1333]; str = int2str(k); end switch X(i,j) case -1 bg = 'blue'; case 0 bg = 'white'; case 1 bg = 'green'; end set(B(i,j),'position',pos,'string',str,'background',bg) end T = flipud(findobj(gcf,'tag','toptext')); % flipud(矩阵)上下颠倒 % findobj搜索属性值特定的对象句柄 set(T(2),'visible','off') switch winner(X) case 0, switch game case 1, set(T(1),'string','Pick15') set(T(2),'visible','on') case 2, set(T(1),'string','TicTacToe') case 3, set(T(1),'string','Magic3') end case -1, set(T(1),'string','Blue wins') case 1, set(T(1),'string','Green wins') case 2, set(T(1),'string','Draw') end set(gcf,'userdata',{X,game,B}) % userdata用来存储GUI使用时的变量

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帮你学MatLab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档