有谁知道为什么这段代码不起作用

Does anyone know why this code just won't work

本文关键字:代码 不起作用 段代码 谁知道 为什么      更新时间:2023-10-16

对我来说,这是有道理的,但我远不是专家。所以我正在为我的第一门编程课程做一个项目,我整天都在这个问题上,我可能已经做了5个小时的累积研究,试图弄清楚这是怎么可能的。

基本上,我需要为记忆游戏洗牌,我不明白为什么它不起作用。程序运行良好,但没有任何图像更改。我把cout放在那里只是为了确保值每次都在变化,我只是不知道为什么它不会与这些值交换。我尝试了shuffle和random_shuffle,但我很可能做得不对,如果有人能向我展示我的代码的外观,我将非常感激。我只是很困惑为什么它不起作用。如果有人能提供一个工作例子来解释我哪里出了问题,那将是令人惊讶的。

void shuffle(int board[][NCOLS]) {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(1, 6);
for (int i = 0; i < 20; i++) {
int randomX = dis(gen);
swap(board[randomX][randomX], board[randomX][randomX]);
cout << "num = " << randomX << endl;
}
}

我用shuffle(board);调用函数是对的,对吗?这很奇怪,因为已经有一个叫做shuffle的内置函数了,对吗?

swap(board[randomX][randomX], board[randomX][randomX]);什么都不做的主要原因是您试图将板对角线元素与其本身交换。这导致了一个不变的董事会。

首先,你需要选择两个随机元素,你需要为数组中每个元素的行和列选择随机变量,或者,就像你在例子中所做的那样,你只会选择矩阵对角线上的元素(这些元素的行ID和列ID相等),所以:

for (i = 0; i < 20;) {
int randXA = dis(gen), // I'll suppose this does the right work
randYA = dis(gen),
randXB = dis(gen),
randXB = dis(gen);
if (randXA != randXB || randYA != randYB) { 
/* we have two distinct elements. */
swap(board[randXA][randYA], board[randXB][randYB]);
/* we need to increment i conditionally or we can 
* finish with less than 20 swaps. */
i++;
} /* if */
} /* for */

请小心,因为假定dis(gen);正在生成一个有效的数字。如果矩阵不是正方形,则必须进行调整,因为randX<A,B>randY<A,B>具有不同的范围(一个为0..MAXX-1,另一个为0..MAXY-1。在这种情况下,必须使用:

int randXA = rand() % MAXX,
randXB = rand() % MAXX,
randYA = rand() % MAXY,
randYB = rand() % MAXY;