罗兰谈MATLAB的艺术

将想法转化为MATLAB

MATLAB和读心术卡片游戏

R2020a就在我们面前!你读过吗发行说明?今天的嘉宾博主,古原竹内他想分享一些使用其中一项新功能的新技巧。他还讨论了以MATLAB应用程序的形式分享你的代码,因为现在与人直接合作并不容易。

内容

UTF-8支金宝app持MATLAB

从R2020a开始,MATLAB默认使用UTF-8保存新的纯文本文件。你会说,这有什么大不了的?Das ist eine große Sache,それは大ごとだ,因为你现在可以很容易地在英语中混合使用国际字符。即使你只会说英语,你也肯定会用π、σ或β这样的希腊字母,对吧?这也意味着你也可以使用表情符号,但我不能在这里展示,因为发布到html功能不能将表情符号翻译成html实体& # 128513;

然而,就我个人而言,我对扑克牌符号更感兴趣。我们做一副52张牌。

甲板= [“♠”“♥”♦”“♣”] + [“一个”;(2:10)”;“J”“问”“K”
甲板= 13×4字符串数组”♠“”♥“”♦“”♣““♠2”“♥2”“♦2”“♣2”“♠3”“♥3”“♦3”“♣3”“♠4”“♥4”“♦4”“♣4”“♠5”“♥5”“♦5”“♣5”“♠6”“♥6”“♦6”“♣6”“♠7”“♥7”“♦7”“♣7”“♠8”“♥8”“♦8”“♣8”“♠9”“♥9”“♦9”“♣9”“♠10”“♥10”“♦10”“♣10”“♠J”“♥J”“♦J”“♣J”"♠Q " "♥Q " "♦Q " "♣Q "“♠K”“♥K”“♦K”“♣K”

这意味着我们也可以在情节中使用这些特殊的角色。

图矩形(“位置”,[1 0.5 1 2],“弯曲”甲板,0.2)文本(1.5,1.5,(1),“字形大小”36岁的“HorizontalAlignment”“中心”)轴([0 3 0 3])

读心卡魔法

让我们用这些卡片来玩著名的21张读心术吧。

你正在用纸牌戏法招待你的朋友。首先,洗牌,从牌组中选择前21张牌。

rng (“默认”)重复性%pick = initialize21Cards(deck);

让一名志愿者从21张卡片中选择一张并记住它,但不告诉你它是什么。

%选择一张卡片choscard = selected (randi(21))
choscard = " " 8"

让你的志愿者洗牌,一副21张牌,然后把它还给你。

Stacked = selected (randperm(21));

根据您想要达到的效果,这些步骤有几种变化。在这里你要把牌摊开。当你这样做的时候,你把它们分成3列,每列7张牌。当你处理实体卡片时,这样做是有原因的,但让我们使用3x7的布局,以便更容易地绘制卡片。我们用行代替列。

plotCardsFaceUp(改造(叠加,7 [3]),0)

重复这个过程4次:

  1. 把牌正面朝上,从下到上排成三排。每一行应该有七张牌。
  2. 让志愿者指出所选卡片所在的行:底行、中间行还是上面行。
  3. 将每一行卡片滑到一起,形成三堆,保持顺序。
  4. 按照特定的顺序把三堆东西收集到一堆——确保你的志愿者指的那堆总是第二堆。
Ii = 1:4放置=重塑(堆叠,[3 7]);把牌正面朝上发selectedRow = find(任何(放置== choscard,2));%与卡片排堆叠=重新堆叠(放置,selectedRow);把卡片收集成一堆结束

显示堆栈中的第11张牌,这应该是选中的牌。希望你的朋友对你印象深刻。

答案=堆叠(11);correctCard = isequal(答案,choscard)
correctCard = logical

它是如何工作的?

剧透!诡计暴露了!

现在让我们来看看为什么这是可行的。我们将使用前7张来自♠、♥和♦的卡片来保持简单。在这个例子中,我们将选择♦7。

选中= [“♠”“♥”♦”]' + [“一个”(7)];chosenCard =♦7”

第一轮

当你第一次摊开牌时,你不知道所选的牌在哪里。它可能在任何地方。然后你的志愿者告诉你它在上面几行。现在你知道选中的牌是这7张牌中的一张。让我们标出它们。

plotCardsFaceUp(选1♦”+ (“一个”(7)))

现在我们按照特定的顺序将卡片收集到堆栈中。

堆叠=重新堆叠(选中,3);

因为您在将它们转换为堆栈时保留了各自行的顺序,并且您将包含所选纸牌的堆栈插入到中间,因此该纸牌将放置在第8到第14位之间的某个位置。

堆叠(14)
ans = 1×7字符串数组”♦♦2”“♦3”“♦4”“♦5”“♦6”“♦7”

轮# 2

然后你再把堆栈分成3行。过去按行排列的卡片现在一列一列地排列。卡片现在在包含它的行中第三到第五的位置。你的志愿者告诉你它在中间一排。这样就把可能性减少到3张。

放置=重塑(堆叠,[3 7]);plotCardsFaceUp(放置,♦”+ (“一个”(4、7]),2)

像以前一样,再次将行收集到单个堆栈中。

堆叠=重新堆叠(放置,2);

这确保了这张牌将位于牌堆的第10到12位。

堆叠(十12)
ans = 1×3字符串数组“♦A”“♦4”“♦7”

轮# 3

你再出牌。这将移动某一行中第4位的卡片。你的志愿者告诉你它在第一行。在这一点上,你知道♦7是被选择的。

放置=重塑(堆叠,[3 7]);plotCardsFaceUp(放置,♦7”,3)

你再次将这些行集合成一副牌。

堆叠=重新堆叠(放置,3);

轮# 4

当你放下卡片时,你会看到卡片移动到中间一行的第4个位置。

放置=重塑(堆叠,[3 7]);答案=放置(2,4);%中间行第4个位置correctCard = isequal(答案,choscard)
correctCard = logical

这时你可以只指着卡片,但是你的志愿者会注意到卡片总是在中间一行结束。最好像以前一样把牌收集到一副牌中,从顶部挑选第11张牌。

更神秘的是,你可能根本不想把牌摊开。相反,我们可以把这副牌分成3堆,每堆7张,然后让你的志愿者看一看,告诉你哪一堆包含你选中的牌。这样,你的志愿者就没有视觉线索了。

构建和共享MATLAB应用程序

现在我们已经用代码解决了这个纸牌戏法,我们不妨把它变成一个MATLAB应用程序,对吧?如果你感兴趣,按照这里的说明操作然后得到应用程序代码建立你自己的应用程序。

一旦你创建了一个应用程序,你当然想要分享它。

  • 如果您的朋友也是MATLAB用户,您可以简单地分享.mlapp文件,但他们可能会欣赏,如果你包装它这是安装程序自带的。
  • 你们那些不会MATLAB的朋友呢?你可以把它变成一个独立的桌面应用,如果你使用MATLAB编译器
  • 你也可以把它变成web应用程序在浏览器上运行,并使其在网络上可用MATLAB Web应用服务器.看到这个视频欲知详情。

总结

现在你知道你可以在MATLAB中使用扑克牌,你可以尝试各种算法和纸牌技巧,并提出你自己的应用程序。请分享你的创作在这里

本地函数

函数pick = initialize21Cards(deck) shuffledDeck = deck(randperm(numel(deck)));pick = shuffledDeck(1:21);pick = pick (randperm(21));结束
函数堆叠= restack(放置,selectedRow) rows = randperm(3);rows = setdiff(rows,selectedRow);rows = [rows(1), selectedRow, rows(2)];堆叠=[(行(1):),放置(行(2):),放置(行(3):)];结束
函数plotCardsFaceUp(卡片,变长度输入宗量)如果Nargin > 1Ii = 1:长度(varargin)如果Isstring (varargin{ii}) highlight = varargin{ii};其他的numRound = varargin{ii};结束结束结束[recPos,txtPos,seq,axisLim] = positionCards(cards);如果存在(“numRound”“var”) &&存在(“亮点”“var”seq) plotCards (recPos txtPos, axisLim, numRound,突出)elseif存在(“numRound”“var”seq) plotCards (recPos txtPos, axisLim, numRound)elseif存在(“亮点”“var”seq) plotCards (recPos txtPos, axisLim,突出)其他的seq, plotCards (recPos txtPos axisLim)结束结束
函数[recPos,txtPos,seq,axisLim] = positionCards(cards) [n,m] = size(cards);recPos = 0 (n*m,4);txtPos = 0 (n*m,2);Seq = [];Ii = 1:n seq = [seq cards(Ii,1:m)];结束Origin = [1.5 1];W = 1;H = 2;间距= 0.2;如果all([n,m] == 1) recPos = [origin w h];txtPos = [recPos(:,1)+w/2 recPos(:,2)+h/2];其他的2 = 1: n recPos (m * (ii-1) + 1: m * 2, 1) =(1) +起源(w +间距)* ((1:m) 1);recPos (m * (ii-1) + 1: m * 2, 2) =起源(2)+ (h +间距)* (ii-1);txtPos (m * (ii-1) + 1: m * 2, 1) = recPos (m * (ii-1) + 1: m * 2, 1) + w / 2;txtPos (m * (ii-1) + 1: m * 2, 2) = recPos (m * (ii-1) + 1: m * 2, 2) + h / 2;结束recPos(:,3) = w;recPos(:,4) = h;结束如果所有([n m] ~ = 1) axisLim =装天花板(起源(1)+ (w +间距)*米);recPos (:, 2) = recPos (:, 2) + (axisLim - (h +间距)* n) / 2 -起源(2);txtPos(:,2) = recPos(:,2) + h/2;其他的axisLim = ceil(原点(2)+ (h +间距)* m);recPos(:,1) = (axisLim - w)/2;recPos(:,2) = (axisLim - h)/2;txtPos(:,1) = recPos(:,1) + w/2;txtPos(:,2) = recPos(:,2) + h/2;结束结束
函数seq, plotCards (recPos txtPos axisLim,变长度输入宗量)如果Nargin > 4Ii = 1:长度(varargin)如果Isstring (varargin{ii}) highlight = varargin{ii};其他的numRound = varargin{ii};结束结束结束数字ii = 1:size(recPos,1)如果存在(“亮点”“var”) && ismember(seq(ii),highlight)矩形(“位置”recPos (ii),“弯曲”, 0.2,“FaceColor”“w”“线宽”,3)其他的矩形(“位置”recPos (ii),“弯曲”, 0.2,“FaceColor”“w”)结束颜色=“k”如果包含(seq (ii), (“♥”♦”)颜色=“r”结束如果axisLim == 18 fontSize = 8;elseifaxisLim == 10 fontSize = 16;elseifaxisLim == 4 fontSize = 36;其他的fontSize = 10;结束文本(txtPos (2, 1) txtPos (ii) 2), seq (ii),“颜色”、颜色、“字形大小”字形大小,“HorizontalAlignment”“中心”)结束如果size(recPos,1) == 21 posX = unique(txtPos(:,1));posiy = unique(txtPos(:,2));文本(1,诗句(1),“底”“HorizontalAlignment”“中心”“旋转”, 90)文本(1,诗句(2),“中间”“HorizontalAlignment”“中心”“旋转”, 90)文本(1,诗句(3),“顶级”“HorizontalAlignment”“中心”“旋转”, 90)文本(posX (1), 1,“1”“HorizontalAlignment”“中心”1)文本(posX (2),“2”“HorizontalAlignment”“中心”)文本(posX (3), 1“3”“HorizontalAlignment”“中心”1)文本(posX (4),“4”“HorizontalAlignment”“中心”1)文本(posX (5),“5”“HorizontalAlignment”“中心”1)文本(posX (6),“6”“HorizontalAlignment”“中心”1)文本(posX (7),“7”“HorizontalAlignment”“中心”)结束axis([0 axisLim 0 axisLim])如果存在(“numRound”“var”)标题(“圆”+ numRound)结束集(gca),“可见”“关闭”甘氨胆酸)组(findall (,“类型”“文本”),“可见”“上”)结束




发布与MATLAB®R2020a

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。