【问题标题】:shuffling vector array with tiles用瓦片洗牌向量数组
【发布时间】:2021-05-04 11:59:29
【问题描述】:

我正在做一个学校项目。这是一个瓷砖移动游戏,我将屏幕上的瓷砖从瓷砖矢量数组中取出。

我正在尝试打乱瓷砖并将它们放入另一个名为 shuffledTiles 的矢量数组中,然后将它们显示在屏幕上,但我编写的代码仅适用于一个瓷砖。任何人都可以帮助我在错误的方式上做了什么。我是初级程序员。

这是我用来洗牌的代码:

void Game::ShuffleTiles()
{
    /* THIS FUNCTION IS TO CHOOSE A RANDOM TILE FROM THE TILES VECTOR STORAGE, TAKE ITS POSITION AND PUT IT INTO A NEW ARRAY CALLED SHUFFLED TILES, SET ITS POSITION TO THE 
    POSITION SAVED INTO A TEMPORARY VECTOR2F variable */

    // take items from 0 to 15 ->> 16 items
    for (int i = 0; i < this->tiles.size(); i++)
    {
        // setting the random seed by time to make sure different random number is given every time 
        srand(unsigned(time(NULL)));

        // Vector2f variable for storing the position of the random selected tile
        sf::Vector2f randTilePosXY;

        // integer for the random number between 0 and 16
        int randomNumber = rand() % this->tiles.size();

        // console out to see which random number is selected
        std::cout << "Random Number: " << randomNumber << std::endl;

        // taking the randomly selected tile's position and saving it into the Vector2f variable
        randTilePosXY == this->tiles[randomNumber].getPosition();

        //Showing the random tile's X and Y positions
        std::cout << "Random Number X and Y: " << std::stringstream(randTilePosXY) << std::endl;
        // putting the randomly selected tile to the end of the new shuffledTiles vector array
        this->shuffledTiles.push_back(this->tiles[randomNumber]);

        // setting the position of item in the shuffledTiles vector storage under the index number
        this->shuffledTiles[i].setPosition(sf::Vector2f(randTilePosXY));


    }

我想用这段代码向他们展示:

for (auto& s : this->shuffledTiles)
    {
        this->window->draw(s);
        this->window->draw(emptyTile);
    }

emptyTile 是右下角的图块,我不想更改它的位置,因为没有必要。

感谢您的帮助。

塔马斯

【问题讨论】:

  • 试试assert(this-&gt;tiles.size() == 16);
  • 什么是断言?
  • 我应该把它放到for循环里面还是外面?
  • #include &lt;cassert&gt; 和循环前的断言以确认图块实际上包含 16 个元素。

标签: c++ arrays sorting vector sfml


【解决方案1】:

我认为你认为你的代码做了一件事,而实际上它并没有像你认为的那样做。你所做的基本上是:

// Step 1. Pick a tile from the existing set of tiles randomly.
int randomNumber = rand() % this->tiles.size();

// Step 2. Remember the randomly chosen tile's position
randTilePosXY == this->tiles[randomNumber].getPosition();

// Step 3. Copy the randomly chosen tile into a separate vector.
// THIS WILL COPY ALL INFORMATION OF THE TILE, INCLUDING ITS POSITION!
this->shuffledTiles.push_back(this->tiles[randomNumber]);

// Step 4. Copy AGAIN the POSITION INFORMATION.
// THIS STEP IS COMPLETELY USELESS AS YOU JUST OVERWRITE THE POSITION WITH THE SAME POSITION.
this->shuffledTiles[i].setPosition(sf::Vector2f(randTilePosXY));

您的“洗牌”矢量只不过是完全相同的信息,只是顺序不同。以下是正在发生的事情:

vector<tile> tiles = {{0, 0}, {1, 1}, {2, 2}}; // Three tiles at different positions.

// "Shuffle" the tiles...

shuffledTiles = {{1, 1}, {2, 2}, {0, 0}};

你在这里洗了什么?无论您打印tiles 还是shuffledTiles,您能看到结果将如何完全相同

编辑:顺便说一句,这行代码:srand(unsigned(time(NULL))); 在整个程序中应该只出现一次。把它放在main 函数的顶部。随机生成器只需播种一次。

【讨论】:

  • 我有一个用瓷砖填充的矢量数组并将这些瓷砖的位置设置为某些位置,我试图从瓷砖矢量数组中复制项目并选择一个随机项目,保存它的位置并将该图块放入一个新的向量数组中,并将保存的位置放入新数组的末尾。基本上这就是我的逻辑。
  • @Tamas35 想要达到什么目的?
  • 我想要一个新的矢量数组,其中包含随机位置的图块,并将它们显示在屏幕上。
  • @Tamas35 请用您想要实现的目标更新您的问题。如果可能,请显示所需结果的“之前”和“之后”。第二,你看懂我写的了吗?
  • 我把随机生成器放到了main中。我附上了一张它现在的样子。
【解决方案2】:

This is how it looks like now.

我完全不明白你在解释什么。

而这也是我想要达到的,只是每次加载程序的时候位置都不一样。

Shuffled Tiles

【讨论】:

  • 你能帮帮我吗?
  • 有人可以帮我解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
相关资源
最近更新 更多