2014-10-28 63 views
-2

所以我一次性寻求帮助后,就更加努力了我的程序,这就是我现在拥有的。更多2D扑克牌数组的帮助C++

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include <ctime> 
#include <iomanip> 

using namespace std; 

void main() 
{ 
const int ROWS = 4; 
string suits[ROWS] = 
{ 
    "Diamonds", "Clubs", "Hearts", "Spades" 
}; 

const int COLS = 13; 
string faces[COLS] = 
{ 
     "Ace", "Deuce", "Three", "Four", "Five", "Six", 
    "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" 
}; 

int deck[ROWS][COLS] = 
{ 
    {1,2,3,4,5,6,7,8,9,10,11,12,13}, 
    {14,15,16,17,18,19,20,21,22,23,24,25,26}, 
    {27,28,29,30,31,32,33,34,35,36,37,38,39}, 
    {40,41,42,43,44,45,46,47,48,49,50,51,52} 
}; 

for(int iii = 0; iii < ROWS; iii++) 
{ 
    for(int jjj = 0; jjj < COLS; jjj++) 
    { 

     cout << deck[iii][jjj] << " " << faces[jjj] << " of " << suits[iii] << endl; 
    } 
} 

srand((unsigned) time(0)); 

for(int c = 0; c < ROWS; c++) 
{ 
    for(int d = 0; d < COLS; d++) 
    { 
     int face = rand() % 13; 
     int suit = rand() % 4; 

     cout << left << setw(5) << " " << faces[face] << " of " << suits[suit] << endl; 
     int e = deck[suit][face]; 
     deck[suit][face] = deck[c][d]; 
     deck[c][d] = e; 
     cout << deck[c][d]; 





    } 
} 

}

当我运行该程序的第一循环简单地列出了甲板为了伟大工程:

1 Ace of Diamonds 
2 Deuce of Diamonds 
3 Three of Diamonds 
4 Four of Diamonds 
5 Five of Diamonds 
6 Six of Diamonds 
7 Seven of Diamonds 
8 Eight of Diamonds 
9 Nine of Diamonds 
10 Ten of Diamonds 

等。第二环路然而应该洗牌,然后再次打印甲板:

Nine of Clubs 
22  King of Hearts 
39  Queen of Spades 
51  Seven of Spades 
46  Ace of Spades 
40  Six of Spades 
45  Three of Spades 
42  Seven of Hearts 
33  Four of Diamonds 
46  Five of Diamonds 
40  Seven of Diamonds 
42  Queen of Clubs 
25  Five of Clubs 
18  Four of Hearts 
30  Ace of Clubs 
30  Three of Clubs 
16  Jack of Clubs 
24  Deuce of Spades 
41  Eight of Diamonds 
33  Queen of Spades 
3  Seven of Hearts 
8  Jack of Hearts 
37  Eight of Diamonds 
19  Four of Clubs 
24  Queen of Hearts 
38  Three of Hearts 
29  Nine of Clubs 
37  Ace of Diamonds 
22  Ace of Hearts 
37  Queen of Diamonds 
25  Four of Diamonds 
9  Four of Diamonds 
31  Three of Hearts 
37  Nine of Clubs 
27  Nine of Clubs 
34  Ten of Hearts 
36  Five of Hearts 
9  Jack of Clubs 
24  Five of Spades 
44  Seven of Clubs 
3  Six of Hearts 
31  Jack of Spades 
50  Ten of Diamonds 
40  Six of Clubs 
33  Eight of Diamonds 
23  Ten of Hearts 
36  Ace of Hearts 
26  Six of Spades 
23  Nine of Clubs 
35  Seven of Clubs 
5  Five of Hearts 
1  Five of Diamonds 
10Press any key to continue . . . 

问题1:所有2D阵列的数目的不正确地与一维数组的字符串对应。例如,九号俱乐部的号码是正确的,号码是正确的,直到你找到一号码,这是三个俱乐部并不正确,并从那里一切搞乱。

问题2:数字和字符串没有完全对齐,字符串开始首先打印,所以字符串数字在一个和一个以上。

问题3:一些数字和字符串重复我不想要的。我如何确保他们不会重复。

+0

至于对齐问题,请检查['setw()'I/O流操纵器](http://en.cppreference.com/w/cpp/io/manip)。至于你的第一个问题,C++中的索引开始于'0',而不是'1'!你的第一副牌应该有'{0,1,2,3,4,5,6,7,8,9,10,11,12}'aso。 – 2014-10-28 17:02:11

+0

“更多帮助”不是一个问题。而且帖子中陈述的问题过于宽泛(没有提及它不止一个问题)。请关注一个特定的问题。它不仅会帮助你在SO上得到答案,甚至可以自己解决问题。 – BartoszKP 2014-10-28 17:05:41

+0

使用调试器总是比使用StackOverflow查找问题的效率更高。 – 2014-10-28 17:25:18

回答

1

第一个问题的原因是打印输出循环被打破。由于您使用iiijjj来索引deck[][]faces[]/suits[]对,因此只有在卡片全部按顺序排列时,它才能正常工作,因为它们在洗牌之前。这就是说,如果你想一秒钟,那么当你洗牌的时候,保持甲板作为二维数组变得毫无意义。只需将其维持为52张卡片的一维数组。无论如何,从051(包括这两个数字)都可以将它们编号,从长远来看,它将为您节省很多痛苦和痛苦。

要转换卡号回脸和西装,你需要采取从deck阵列读取的卡号,评估x/13得到一个索引到suit[]阵列,并x % 13得到索引到faces[]阵列。

最后但并非最不重要的是,你的洗牌并不完美。在实践中,对于测试程序它可以,但是如果你想要认真的话,你应该修改它以使用Fisher-Yates算法。 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle一见钟情,看起来完全相同,但对随机数发生器参数的修改却有所不同。

也避开图书馆提供的rand(),它通常很烂。我使用的是异或RNG http://en.wikipedia.org/wiki/Xorshift,因为它非常好,因为它足以让蒙特卡洛使用,而且速度非常快。

0

试着将问题分解成更小的部分或步骤,然后运行/调试它们并查看结果是什么。尝试在有问题的循环中的每个步骤处放置cout语句(或用断点调试),并打印(或在调试器中查看)涉及的不同变量。一步一步来尝试确定发生了什么问题。不要害怕将循环的执行步骤写在纸上。这样做后,有时错误会变得非常明显。

如何调试是所有程序员必须学习的关键技能。如果你不能很好地调试你的代码,那么随着你的程序变得更加复杂,这些问题只会变得更糟,更难以解决。