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次:
- 把牌正面朝上,从下到上排成三排。每一行应该有七张牌。
- 让志愿者指出所选卡片所在的行:底行、中间行还是上面行。
- 将每一行卡片滑到一起,形成三堆,保持顺序。
- 按照特定的顺序把三堆东西收集到一堆——确保你的志愿者指的那堆总是第二堆。
为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 > 1为Ii = 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 > 4为Ii = 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 (,“类型”,“文本”),“可见”,“上”)结束
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。