有关扑克牌C++ 2D 阵列的更多帮助
More help on 2D array of playing cards 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:二维数组的所有数字都与一维数组的字符串不正确对应。例如,俱乐部的九个是正确的数字 22 旁边,数字是正确的,直到你到达数字 1,它与三个俱乐部的旁边是不正确的,一切都从那里搞砸了。
问题 2:数字和字符串不完全对齐,字符串首先开始打印,因此字符串编号下降一个并超过一个。
问题3:一些我不想要的数字和字符串重复。我如何确保它们不会重复。
您遇到第一个问题的原因是您的打印输出循环已损坏。 由于您使用iii
和jjj
来索引deck[][]
和faces[]
/suits[]
对,因此只有当牌都按顺序排列时,它才能正常工作,就像洗牌之前一样。
也就是说,如果你考虑一下,将甲板保持为二维数组在你洗牌的那一刻就变得毫无意义。 只需将其维护为 52 张卡片的一维数组即可。 无论如何,将它们从0
到51
,从长远来看,这将为您节省很多痛苦和痛苦。
转换回面孔和西装,您需要从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 语句(或使用断点进行调试(放在相关循环中的每个步骤中,并打印(或在调试器中查看(所涉及的不同变量。一步一步地尝试确定出了什么问题。不要害怕把循环的执行步骤写在纸上。有时,执行此操作后错误会变得非常明显。
如何调试是所有程序员必须学习的关键技能。如果你不能很好地调试你的代码,那么随着你的程序变得越来越复杂,这些问题只会变得更糟,甚至更难解决。
- OpenMP阵列性能较差
- 需要帮助设置在C++中使用的Potrace
- 在指针的帮助下,文本文件中单词的频率
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 当我的阵列太大时出现分段错误
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 需要帮助将结构数组传递给函数
- 位阵列上的快速AND运算
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 阵列必须使用大括号封闭的初始器进行初始化
- 没有从阵列<float>到阵列<int>的可行转换
- C++动态安全 2D 交错阵列
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 需要帮助从12个字节生成新的24字节RGB查找阵列,或者是一种更好的编码方法
- 2D阵列帮助C++
- 新手C++,在阵列划分中寻求帮助
- 有关扑克牌C++ 2D 阵列的更多帮助
- 需要帮助了解如何向用户询问他们想要删除的内容,并将其删除到阵列中
- 需要帮助uint8_t阵列转换为 NSMutableData