洛伦谈MATLAB的艺术

将想法转化为MATLAB

MATLAB与读心卡游戏

R2020a是我们!你读释放笔记? 今天的客座博主,竹内俊二,显然是的,他想分享一些使用其中一个新功能的新技巧。他还讨论了将您的代码作为MATLAB应用程序共享,因为现在直接与人协作并不容易。

目录

在MATLA金宝appB中支持UTF-8

从R2020a开始,MATLAB默认使用UTF-8保存新的纯文本文件。你说有什么大不了的?这是我的梦想,それは大ごとだ, 因为你现在可以轻松地使用英语中混合的国际字符。即使你只会说英语,你肯定会用希腊字母,比如π、σ或β,对吗?这也意味着您也可以使用emojis,但我不能在这里显示它,因为发布到html功能不会将emojis转换为html实体,例如& # 128513;

然而,就我个人而言,我对扑克牌符号更感兴奋。让我们制作一副52张扑克牌。

甲板=["♠","♥","♦","♣"] + [“一个”;(2:10)”;“J”“Q”“K”]
甲板=13×4字符串数组“♠A“♥A“♦A“♣A“♠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”,“中心”)轴([03 03])

读心卡片魔术

让我们用这些牌来玩著名的21牌读心术。

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

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

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

%选择一张卡片chosenCard=已拾取(randi(21))
chosenCard=”♣8"

让你的志愿者洗牌21张牌并将其返还给你。

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

根据您想要达到的效果,步骤有几种不同的形式。在这里,你将把牌摆在桌子上。当你这样做时,你把它们排列成3列7张牌。在处理物理卡时,这样做是有原因的,但是让我们使用3x7布局来更容易地绘制卡。我们用行替换列。

plotCardsFaceUp(重塑(堆叠,[3 7]),0)

重复这个过程4次:

  1. 发牌面朝上,从下到上分成三排。每一行应该有七张牌。
  2. 让你的志愿者指出所选卡片所在的那一行:最下面一行、中间一行或最上面一行。
  3. 将每一行卡片滑动在一起,形成三堆,保持顺序。
  4. 按特定顺序将三堆垃圾收集到一堆中,确保志愿者指向的垃圾总是第二堆。
对于ii=1:4放置=重塑(堆叠,[37]);%面朝上发牌selectedRow=find(any(placed==chosenCard,2));%与卡片划船堆叠=重新堆叠(放置,选择向下);%把牌堆成一堆终止

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

回答=堆叠(11);校正卡=等质量(回答,选择卡)
校正卡=逻辑1

它是如何工作的?

剧透警报!诡计暴露了!

现在让我们看看为什么会这样。为了简单起见,我们将使用西服上的前7张牌::翔、♥、♦。我们将为这个例子选择♦7。

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

轮# 1

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

绘图卡界面(拾取,1,"♦"+ [“一个”(7)))

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

堆叠=重新堆叠(拾取,3);

因为当你把它们排成一堆时,你就保留了相应行的顺序,然后在中间插入一个包含所选卡的桩,该卡将被放置在第八到第十四个位置之间。

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

轮# 2

然后你再把堆栈处理成3行。用来排列的卡片现在是按列顺序排列的。卡片现在在包含它的行中的第三到第五个位置。你的志愿者告诉你它在中间行。现在减少了3张卡片的可能性。

放置=重塑(堆叠,[3 7]);绘图卡片背面(放置,"♦"+ [“一个”(4、7]),2)

您可以像以前一样将这些行收集到一个堆栈中。

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

这将确保卡位于堆栈的第10到第12位。

堆叠(10:12)
ans = 1×3 string array“♦A”“♦4”“♦7”

轮# 3

你再来一局。这将纸牌移动到其中一行中的第4位。你的志愿者告诉你它在第一排。在这一点上,你知道♦7是被选中的。

放置=重塑(堆叠,[3 7]);绘图卡片背面(放置,"♦7"3)

你将这些行再次聚集到一个甲板上。

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

轮# 4

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

放置=重塑(堆叠[37]);回答=放置(2,4);中间行的第四个位置correctCard=isequal(答案,chosenCard)
校正卡=逻辑1

在这一点上,你可以指出卡,但你的志愿者会注意到卡总是在中间行结束。最好像以前一样将卡片收集到一张牌堆中,然后从顶部挑选第11张卡片。

为了让它更神秘,你可能根本不想把牌放在桌子上。相反,我们可以将牌堆分成3堆7张牌,让你的志愿者从中窥视,告诉你哪一堆牌里有所选的牌。这样,你的志愿者就没有视觉线索知道发生了什么。

构建和共享MATLAB应用程序

既然我们已经用代码算出了这个纸牌戏法,我们可以把它变成一个MATLAB应用,对吧?如果你感兴趣,按照这里的说明操作并得到应用程序代码创建自己的应用程序。

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

  • 如果您的朋友也是MATLAB用户,您只需共享.mlapp文件,但如果您包装它这样它就随安装程序一起来了。
  • 如果你的朋友没有MATLAB,你可以把它变成一个独立的桌面应用程序MATLAB编译器
  • 你也可以把它变成web应用程序在浏览器上运行并使其在托管的web上可用MatlabWeb应用服务器.看到这个视频更多细节。

总结

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

局部函数

作用拾取=初始化21cards(deck)shuffledeck=deck(randperm(numel(deck));拾取=shuffledeck(1:21);拾取=拾取(randperm(21));终止
作用堆叠=重新堆叠(放置,选择移动)行=随机排列(3);行=setdiff(行,selectedRow);行=[行(1),selectedRow,行(2)];堆叠=[放置(第(1)行),:),放置(第(2)行),:),放置(第(3)行),];终止
作用plotCardsFaceUp(卡片,varargin)如果纳金>1对于ii=1:长度(varargin)如果Isstring (varargin{ii}) highlight = varargin{ii};其他的numRound=varargin{ii};终止终止终止[recPos、txtPos、seq、axisLim]=位置卡(卡片);如果存在(“numRound”,“var”) & & (“突出显示”,“var”seq) plotCards (recPos txtPos, axisLim, numRound,突出)elseif存在(“numRound”,“var”)绘图卡(recPos、txtPos、seq、axisLim、numRound)elseif存在(“突出显示”,“var”seq) plotCards (recPos txtPos, axisLim,突出)其他的绘图卡(recPos、txtPos、seq、axisLim)终止终止
作用[recPos,txtPos,seq,axisLim]=位置卡(卡)[n,m]=尺寸卡(卡);recPos=零(n*m,4);txtPos=零(n*m,2);seq=[];对于Ii = 1:n seq = [seq cards(Ii,1:m)];终止原点=[1.51];w=1;h=2;间距=0.2;如果所有([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=ceil(原点(1)+(w+间距)*m);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;终止终止
作用绘图卡(recPos、txtPos、seq、axisLim、varargin)如果纳金>4对于ii=1:长度(varargin)如果Isstring (varargin{ii}) highlight = varargin{ii};其他的numRound=varargin{ii};终止终止终止数字对于ii=1:尺寸(recPos,1)如果存在(“突出显示”,“var”)&&ismember(序号(ii),高亮显示)矩形(“位置”,recPos(ii,:),“曲率”,0.2,“脸色”,“w”,“线宽”3)其他的矩形(“位置”,recPos(ii,:),“曲率”,0.2,“脸色”,“w”)终止颜色=“k”如果包含(见下文第(ii)段)["♥","♦"])颜色=“r”终止如果axisLim==18 fontSize=8;elseifaxisLim == 10 fontSize = 16;elseifaxisLim == 4 fontSize = 36;其他的fontSize=10;终止文本(txtPos(ii,1)、txtPos(ii,2)、序号(ii),“颜色”、颜色、“字形大小”字形大小,“HorizontalAlignment”,“中心”)终止如果大小(recPos,1)==21 posX=unique(txtPos(:,1));posY=unique(txtPos(:,2));文本(1,posY(1),“底”,“HorizontalAlignment”,“中心”,“轮换”,90)文本(1,posY(2),“中间”,“HorizontalAlignment”,“中心”,“轮换”,90)文本(1,posY(3),“顶级”,“HorizontalAlignment”,“中心”,“轮换”,90)文本(posX(1),1,"1",“HorizontalAlignment”,“中心”)文本(posX(2),1,"2",“HorizontalAlignment”,“中心”)文本(posX(3),1,"3",“HorizontalAlignment”,“中心”1)文本(posX (4),"4",“HorizontalAlignment”,“中心”)文本(posX(5),1,"5",“HorizontalAlignment”,“中心”1)文本(posX (6),"6",“HorizontalAlignment”,“中心”1)文本(posX (7),"7",“HorizontalAlignment”,“中心”)终止轴([0 axisLim 0 axisLim])如果存在(“numRound”,“var”)标题(“圆形”+ numRound)终止集(gca),“可见”,“关闭”)集合(芬德尔)(gca,“类型”,“文本”),“可见”,“开”)终止




发布与MATLAB®R2020a

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。