《Experiment with 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使用时的变量

原文发布于微信公众号 - 帮你学MatLab(MatLab_helper)

原文发表时间:2015-12-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏章鱼的慢慢技术路

OpenGL光照设置

1943
来自专栏技术总结

iOS进阶之CAEmitterLayer

2938
来自专栏ACM算法日常

5行位运算,map靠边站——位操作进阶

Given an array of integers, every element appears three times except for one. F...

1191
来自专栏大数据文摘

手把手 | 用StackOverflow访问数据实现主成分分析(PCA)

1517
来自专栏小文博客

用C语言写贪吃蛇笔记-2

1785
来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

O(1)效率的表面模糊算法优化。

     很久没有写文章了,主要是最近一段时间没有以前那么多空暇空间,内存和CPU占用率一致都很高,应前几日群里网友的要求,今天发个表面模糊的小程序来找回之前...

2466
来自专栏Crossin的编程教室

【Python 第53课】 数学运算

今天从打飞机游戏里中断一下,说些python的基础。 在用计算机编程解决问题的过程中,数学运算是很常用的。python自带了一些基本的数学运算方法,这节课给大家...

3554
来自专栏Java面试通关手册

六道面试中常见的智力题 来看看你会做几道?

下面的题目来自滴滴出行2017秋招题。这些题目是我自己觉得比较难或者比较容易出错的题目。

2284
来自专栏WOLFRAM

用 Wolfram 语言制作圣诞动画

2132
来自专栏java一日一条

有没有一段代码,让你觉得人类的智慧也可以璀璨无比?

Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推...

963

扫码关注云+社区

领取腾讯云代金券