我在Matlab中乱扔一副卡片时遇到了麻烦.需要帮助,看看我哪里出错了

CSE*_*ent 2 matlab

我目前有一副卡片编码,但它没有洗牌.这是为了编写战争的纸牌游戏,如果它有帮助.我需要洗牌,但每当我这样做时,它只会将卡号和套装洗牌,而不是整张牌.例如,我将A标识为ace,并且每个数字后面都有套装.普通卡片是"AH"(心中的王牌)或"6D"(六颗钻石).相反,它会输出"5A"作为其中一张牌,就像在5张牌中一样.我不知道如何解决这个问题,但我目前的代码是:

card_nums = ('A23456789TJQK')';
card_suits = ('HDSC')';
unshuffled_deck = [repmat(card_nums,4,1),repmat(card_suits,13,1)];
disp(unshuffled_deck)

shuffled_deck = unshuffled_deck(randperm(numel(unshuffled_deck)));
disp(shuffled_deck)
Run Code Online (Sandbox Code Playgroud)

我将非常感谢您的帮助,非常感谢您的时间!

bea*_*ker 5

您正在创建两个unshuffled_deck组合列中所有元素的随机排列.相反,您需要创建以下的随机排列unshuffled_deck:

shuffled_deck = unshuffled_deck(randperm(size(unshuffled_deck,1)),:);
Run Code Online (Sandbox Code Playgroud)

调用size将为您提供deck数组中的行数,然后我们获得行索引的随机排列,并将行(value,suit)复制为单个实体.


这是一个使用结构数组的版本,以响应@Carl Witthoft的评论.我担心它会给解决方案增加太多的复杂性,但它确实不错:

card_nums = ('A23456789TJQK')';
card_suits = ('HDSC')';
deck_nums = repmat(card_nums,4,1);
deck_suits = repmat(card_suits,13,1);
cell_nums = cellstr(deck_nums).';     %// Change strings to cell arrays...
cell_suits = cellstr(deck_suits).';   %// so we can use them in struct

%// Construct a struct array with fields 'value' and 'suit'
unshuffled_deck = struct('value',cell_nums,'suit',cell_suits);
disp('unshuffled deck:');
disp([unshuffled_deck.value;unshuffled_deck.suit]);

%// Shuffle the deck using the number of elements in the structure array
shuffled_deck = unshuffled_deck(randperm(numel(unshuffled_deck)));
disp('shuffled deck:');
disp([shuffled_deck.value; shuffled_deck.suit]);
Run Code Online (Sandbox Code Playgroud)

这是一个测试运行:

unshuffled deck:
A23456789TJQKA23456789TJQKA23456789TJQKA23456789TJQK
HDSCHDSCHDSCHDSCHDSCHDSCHDSCHDSCHDSCHDSCHDSCHDSCHDSC
shuffled deck:
4976TT93KTJQJATK953A75QA82Q6226K5J784J4A3372486K859Q
CHSSSHCDSCSSHDDCDSHHCDHSDDCDHCCHHCHHHDDCSCDSSCHDSCSD
Run Code Online (Sandbox Code Playgroud)

要访问单张卡,您可以执行以下操作:

>> shuffled_deck(2)
ans =

  scalar structure containing the fields:

    value = 9
    suit = H
Run Code Online (Sandbox Code Playgroud)

或者您可以访问各个字段:

>> shuffled_deck(2).value
ans = 9
>> shuffled_deck(2).suit
ans = H
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何简单地索引struct数组并获得,例如,9H就像在常规数组中使用一样disp(shuffled_deck(2,:)).在这种情况下,我所知道的唯一选择是显式连接每个字段:

disp([shuffled_deck(2).value,shuffled_deck(2).suit]);
Run Code Online (Sandbox Code Playgroud)