【问题标题】:Missing closing brace in SFML program?SFML 程序中缺少右括号?
【发布时间】:2018-11-20 05:54:46
【问题描述】:

我使用 C++ 和 SFML 编写了一个程序。该程序应该生成 20 个红色或蓝色的圆圈,并且确实有效。然而,我做了一些更改,保存并在几个小时后在 VS 上返回它,发现我不断收到错误:

'{':找不到匹配的令牌(第 9 行)

我一直在扫描代码,但似乎根本找不到问题所在。

代码:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <chrono>
#include <random>

using namespace std;

int main() 
{ //Line 9
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
    default_random_engine generator(seed);
    uniform_int_distribution<int> distribution1(0, 1024);
    uniform_int_distribution<int> distribution2(1, 2);

    sf::RenderWindow window(sf::VideoMode(1024, 1024), "Spooky Circle Box");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Red);
    shape.setPosition(10, 10);

    std::vector<sf::CircleShape> circles(20);

    window.clear();

    for (unsigned int i = 0; i < circles.size(); i++) {
        int find = 0;
        int find_color = 0;
        while (find != 20) {
            circles[i].setPosition(distribution1(generator), distribution1(generator));
            for (unsigned int j = 0; j < circles.size(); j++) {
                if (i == j || (circles[i].getPosition().x != circles[j].getPosition().x || circles[i].getPosition().y != circles[j].getPosition().y)) {
                    find++;
                } else;
            if (find != 20) {
                find = 0;
            } else;
        }
        find = 0;
        find_color = distribution2(generator);
        circles[i].setRadius(5.f);

        if (find_color == 1) {
            circles[i].setFillColor(sf::Color::Blue);
        } else { circles[i].setFillColor(sf::Color::Red); }

        window.draw(circles[i]);
    }

    window.display();

    while (window.isOpen()) {
        sf::sleep((sf::milliseconds(100)));
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
    }
    return 0;
}

【问题讨论】:

  • 您在末尾缺少一个右括号,但您应该重新检查所有大括号并确保将它们关闭在正确的位置。我认为你在某处有一些不好的缩进
  • 说,你的代码很乱,你至少有两个(意外的)无限循环。第一个无法让您从while(find != 20) 逃脱,因为您每次在第二个for 内都将find 设置为0。第二个“无限”循环是while(window.isOpen()),因为正如它的名字所说,你会在那里直到你的窗口关闭
  • 我知道我在某个地方缺少了一个大括号,但我没有看到问题,这就是我的问题。此外,它们都应该是无限循环。第一个直到找到一个有效的位置,并且只需要 1-3 次尝试。第二个应该是这样,否则你永远无法正确关闭窗口。我想我可以添加一个暂停来降低压力。
  • 如果您的意图只是画一次圆圈,我认为您在第 32 行和第 33 行之间缺少右括号。看来您正在缩进代码,但 for(行29) 需要大括号

标签: visual-c++ sfml


【解决方案1】:

我会进一步解释我的 cmets,但我不会发布任何 已修复 代码。我只是建议一种做事方式。

根据您的代码结构,您似乎正在尝试生成一些随机分布在窗口上的蓝色或红色圆圈,但与此同时,您正在尝试绘制它们。

您应该将实际数据与绘图内容区分开来。我建议的伪代码是。

int main(){int main(){
    // 1 . Declare your circle vector

    // 2 . Populate that vector with random circles (random position, random color)

    // Now draw those circles
    // 3 . while(window.isOpen()) loop

        // 3.1 Clear the window

        // 3.2 Draw your circles

        // 3.3 Display the stuff

}

第 3 点基本上是根据SFML tutorials 绘制东西的方式。

【讨论】:

  • 这就是我所做的,除了数字 3。我知道第一个 SFML 示例的形状是在 isOpen 循环中绘制的,但这真的很愚蠢。它不仅是错误的,它还欺骗新人认为它是可以的。如果您在循环中明确、绘制和显示,它将在最短的时间内尽可能多地绘制形状。运行这个例子,它只画了一个低分辨率的圆圈,导致程序占用了我 30% 的 CPU 使用率。将抽奖移出循环或添加暂停会将其降低到 0%。
  • 哦,我不会同时生成圆圈并绘制它们。我生成它们一次,然后在它们全部生成后绘制它们一次。不要试图无礼,但如果你不知道 SFML,你不应该试图回答。
  • @Anoraki 如果您每次都不clear-draw-display,您将无法绘制移动的东西。如果您(我不确定您是否是这种情况)想要移动您的圈子,您将不得不每次都清除并重新绘制。
猜你喜欢
  • 1970-01-01
  • 2015-03-31
  • 2018-04-10
  • 1970-01-01
  • 2018-04-13
  • 2021-11-10
  • 2012-11-01
相关资源
最近更新 更多