罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经退休,不会被更新。

MATLAB和读心术纸牌游戏

R2020a是我们!你读释放笔记吗?今天的嘉宾博客古原竹内,很显然,他想分享一些新的技巧使用的一个新特性。他还讨论了共享代码作为一个MATLAB应用程序,因为它是不容易与人直接合作。

内容

在MATLA万博1manbetxB utf - 8的支持

R2020a, MATLAB默认保存新纯文本文件使用utf - 8。有什么大不了的,你说什么?这是一张große萨澈,それは大ごとだ,因为你现在可以轻松地使用国际字符混合在英语。即使你只会说英语,你确定用希腊字母像π,σ,或β,对吧?这也意味着您可以使用emojis,但是我不能表现出来,因为发布html特性emojis转化为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-card读心术与卡片把戏。

你招待你的朋友纸牌戏法。第一,洗牌并选择第一21卡从甲板上。

rng (“默认”)%的可重复性选择= initialize21Cards(甲板);

问一个堆栈的志愿者选择卡21卡和记住它,但不告诉你它是什么。

%选择一个卡chosenCard =选择(randi (21))
chosenCard = "♣8 "

21你的志愿者洗牌卡并返回给你。

堆叠=选择(randperm (21));

有几个不同的步骤取决于你想要达到的效果。在这里你将牌放在桌子上。当你这样做时,你把它们分成3列7卡。这样做是有原因的,当你处理纸质贺卡,但是让我们使用3 x7布局,让它更容易画出牌。我们用行和列。

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

重复这个过程4次:

  1. 交易卡的脸分成三行从下到上。你应该有7个卡在每一行。
  2. 问你自愿选择卡的行:最后一行,中间行或第一行。
  3. 幻灯片每一行卡在一起,形成三个桩,保留订单。
  4. 收集三个堆成一个堆栈在一个特定的顺序确定桩你的志愿者指出总是收集第二。
2 = 1:4放置=重塑(堆叠,[3 7]);%交易卡面对selectedRow =找到(任何(= = chosenCard, 2));%行用卡堆叠=操控(放置,selectedRow);%收集卡片进栈结束

揭示了11日卡在堆栈中,应该选择卡。希望你的朋友留下深刻印象。

回答=堆叠(11);chosenCard correctCard = isequal(答案)
correctCard =逻辑1

它是如何工作的呢?

剧透!关键是发现!

现在我们来看看为什么这作品。我们将保持简单通过使用第一个7卡♠西装的♥,♦。我们将选择♦7对于这个示例。

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

轮# 1

当你第一次拿出卡片,你不知道选择的卡片在哪里。它可以在任何地方。然后你的志愿者告诉你在顶部行。你现在知道选择卡是一种7卡。让我们强调他们吧。

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

现在我们收集卡片堆在一个特定的顺序。

堆叠=操控(选3);

因为你保留各自的顺序行把他们变成桩时,和你插入的桩,其中包含选择卡在中间,这张牌将被放置在8日到14日位置之间。

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

轮# 2

然后你再协议栈成3行。牌,使用命令行现在列的列。现在卡在第三到五行包含它的位置。你的志愿者告诉你在中间行。现在减少了3卡的可能性。

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

你再收集行成一个堆栈。

堆叠=操控(,2);

这确保了卡将在10至12堆栈的位置。

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

轮# 3

你又把卡片。这张移动卡在第四的位置在一个行。你的志愿者告诉你它是在第一行。在这一点上你知道♦7是被选中的那一位。

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

你收集的行成一个单一的甲板。

堆叠=操控(放置,3);

轮# 4

当你抛开卡片时,你看到卡片搬到了第四的位置在中间行。

放置=重塑(堆叠,7 [3]);回答= (2、4);% 4的位置在中间行chosenCard correctCard = isequal(答案)
correctCard =逻辑1

在这一点上你可以点卡片,但是你的志愿者会注意到卡总是在中间行结束。最好的卡片收集到一个单独的甲板之前,选择11日卡从顶部。

使它更神秘,你可能不想把卡片放在桌上。相反,我们可以将甲板上分为3成堆的7卡和问你的志愿者透过他们,告诉你哪个桩包含所选卡片。这种方式,你的志愿者将没有视觉提示发生了什么。

建设和共享一个MATLAB应用程序

现在我们这张卡片把戏在代码中,我们不妨把它变成一个MATLAB应用程序,对吗?如果你有兴趣,按照说明这里并得到应用程序代码构建自己的应用程序。

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

  • 如果你的朋友也在MATLAB用户,您可以简单地分享.mlapp文件,但是他们可能会apprediate它如果你包装它有安装程序。
  • 你的朋友没有MATLAB怎么样?你可以把这变成一个独立的桌面应用程序,如果你使用MATLAB编译器
  • 你也可以把它变成一个web应用程序运行在浏览器和web托管在使其可用MATLAB Web应用程序服务器。看到这个视频为更多的细节。

总结

现在你知道你可以用扑克牌在MATLAB中,你可以尝试各种各样的算法和纸牌魔术,想出自己的应用程序。请分享你的作品在这里!

本地函数

函数选择= initialize21Cards(甲板)shuffledDeck =甲板(randperm(元素个数(甲板)));选择= shuffledDeck (21);选择=选择(randperm (21));结束
函数堆叠=操控(放置selectedRow)行= randperm (3);行= setdiff(行,selectedRow);行=[行(1)、selectedRow行(2)];堆叠=[(行(1):),放置(行(2):),放置(行(3):)];结束
函数plotCardsFaceUp(卡片,变长度输入宗量)如果输入参数个数> 12 = 1:长度(变长度输入宗量)如果isstring变长度输入宗量({2})突出=变长度输入宗量{2};其他的numRound =变长度输入宗量{2};结束结束结束seq [recPos txtPos, axisLim] = positionCards(卡);如果存在(“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)结束结束
函数seq [recPos txtPos, axisLim] = positionCards(卡片)[n m] =大小(卡);recPos = 0 (n * m, 4);txtPos = 0 (n * m, 2);seq = [];2 = 1:n seq = (seq卡片(2,1:m)];结束起源= (1.5 - 1);w = 1;h = 2;间隔= 0.2;如果所有([n m] = = 1) recPos =[起源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 =装天花板(来源(2)+ (h +间距)*米);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,变长度输入宗量)如果输入参数个数> 42 = 1:长度(变长度输入宗量)如果isstring变长度输入宗量({2})突出=变长度输入宗量{2};其他的numRound =变长度输入宗量{2};结束结束结束2 = 1:尺寸(recPos, 1)如果存在(“亮点”,“var”)& & ismember (seq (ii),突出)矩形(“位置”recPos (ii),“弯曲”,0.2,“FaceColor”,“w”,“线宽”3)其他的矩形(“位置”recPos (ii),“弯曲”,0.2,“FaceColor”,“w”)结束颜色=“k”;如果包含(seq (ii), (“♥”,♦”)颜色=“r”;结束如果axisLim = = 18字形大小= 8;elseifaxisLim = = 10字形大小= 16;elseifaxisLim = = 4字形大小= 36;其他的字形大小= 10;结束文本(txtPos (2, 1) txtPos (ii) 2), seq (ii),“颜色”、颜色、“字形大小”字形大小,“HorizontalAlignment”,“中心”)结束如果大小(recPos 1) = = 21 posX =独特(txtPos (: 1));诗句=独特(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”,“中心”)结束轴([0 axisLim 0 axisLim])如果存在(“numRound”,“var”)标题(“圆”+ numRound)结束集(gca),“可见”,“关闭”甘氨胆酸)组(findall (,“类型”,“文本”),“可见”,“上”)结束




发表与MATLAB®R2020a

|