有关扑克牌C++ 2D 阵列的更多帮助

More help on 2D array of playing cards C++

本文关键字:帮助 阵列 2D 扑克牌 C++      更新时间:2023-10-16

所以在寻求帮助一次后,我更多地致力于我的程序,这就是我现在所拥有的。

#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:二维数组的所有数字都与一维数组的字符串不正确对应。例如,俱乐部的九个是正确的数字 22 旁边,数字是正确的,直到你到达数字 1,它与三个俱乐部的旁边是不正确的,一切都从那里搞砸了。

问题 2:数字和字符串不完全对齐,字符串首先开始打印,因此字符串编号下降一个并超过一个。

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

您遇到第一个问题的原因是您的打印输出循环已损坏。 由于您使用iiijjj来索引deck[][]faces[]/suits[]对,因此只有当牌都按顺序排列时,它才能正常工作,就像洗牌之前一样。

也就是说,如果你考虑一下,将甲板保持为二维数组在你洗牌的那一刻就变得毫无意义。 只需将其维护为 52 张卡片的一维数组即可。 无论如何,将它们从051,从长远来看,这将为您节省很多痛苦和痛苦。

要将卡号

转换回面孔和西装,您需要从deck数组中读取卡号,计算x / 13以获取suit[]数组的索引,x % 13将索引转换为faces[]数组。

最后但并非最不重要的一点是,您的洗牌不是很完美。 在实践中,对于测试程序来说,这是可以的,但是如果你想认真对待,你应该修改它以使用费舍尔-耶茨算法。 http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 乍一看,它看起来是一样的,但对随机数生成器参数的修改会有所不同。

还要避开rand()提供的图书馆,它通常很糟糕。 我使用异或移位RNG http://en.wikipedia.org/wiki/Xorshift 因为它很好,足以用于严重的蒙特卡洛使用,而且速度快得令人眼花缭乱。

尝试将问题分解为更小的部分或步骤,然后运行/调试它们,看看结果是什么。尝试将 cout 语句(或使用断点进行调试(放在相关循环中的每个步骤中,并打印(或在调试器中查看(所涉及的不同变量。一步一步地尝试确定出了什么问题。不要害怕把循环的执行步骤写在纸上。有时,执行此操作后错误会变得非常明显。

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