2015-11-04 113 views
1

正如标题所述,在面对扑克牌时,我在纸牌游戏战争计划中遇到麻烦。我有什么目前:试图在Matlab中模拟纸牌游戏War。当两张牌互相打牌时,数字牌可以正常工作,但是牌面牌不会

card_nums = ('23456789TJQKA')'; 
card_suits = ('HDSC')'; 
unshuffled_deck = [repmat(card_nums,4,1),repmat(card_suits,13,1)]; 
disp(unshuffled_deck) 
fprintf('\n') 

shuffled_deck = unshuffled_deck(randperm(size(unshuffled_deck,1)),:); 
disp(shuffled_deck) 
fprintf('\n') 

player1_hand = shuffled_deck(1:26, 1:2); 
disp(player1_hand) 
fprintf('\n') 

player2_hand = shuffled_deck(27:52, 1:2); 
disp(player2_hand) 
fprintf('\n') 

T = 10; 
J = 11; 
Q = 12; 
K = 13; 
A = 14; 

if shuffled_deck(1, 1) > shuffled_deck(27, 1) 
fprintf('Player 1 wins \n') 
elseif shuffled_deck(1, 1) < shuffled_deck(27, 1) 
fprintf('Player 2 wins \n') 
else 
fprintf('It is a tie.') 
end 

一切正常,但出牌,创建和洗牌甲板蛮好的,完全显示每个卡。当谈到实际比较卡片时,它将大部分工作。两张牌相互对立,如8和6?它将完美地工作。然而,当面卡被引入混合时,它不能很好地工作。最大的罪魁祸首似乎是Ace,不管我做什么,如果一个Ace,并且假设一个10对抗海誓山盟,该程序将与10.一起。我不是很确定如何解决这个问题,但如此多只是指出我在正确的方向将是非常有益的,谢谢!

回答

3

问题是你没有比较变量A(或任何面卡)与数字。您将字符 A与数字进行比较,当您这样做时,Matlab会自动将该字符转换为其ASCII值。如果运行uint8('A')uint8('T'),您会看到A的值为65,T的值为84.因此'T'>'A',即使10小于ace。

你应该做的是用卡片的数值表示卡片,而不是与角色混淆。因此,如果您想打印卡片名称,您可以将数字2至14进行洗牌,然后将11-14转换为Jack-Ace。此外,它甚至不考虑诉讼,所以你可以完全放弃该部分。真的整个套牌只能用A = repmat(2:14, [1, 4])来表示,你可以通过做B = A(randperm(length(A)))来洗牌。

+0

好吧,所以我试图重新创建与您发布的代码和它的工作原理,但它并没有洗牌。我使用了和以前一样的randperm函数,它不会洗牌。有什么想法吗? –

+2

啊,对不起。我忘了你正在使用'randperm'。你可以用'A = repmat(2:14,[1,4])代表甲板,并用'B = A(randperm(length(A)))'将其打乱。 – btmcnellis

+0

工作,谢谢!我会试着重新编写这个套牌的代码,因为它似乎比处理西装和面子牌要麻烦的多,我的教授没有指定任何一种方式,所以我确信它会没事的。 –