酷代码 AI
菜单

用c++写一个图形界面程序,有一个绿球和72个黄球,绿球和黄球随机移动,当绿球碰到黄球时,黄球变为绿球,同时加入绿球阵营。当所有球都变绿时,输出从程序开始到现在的时间

以下是一个使用C++和Qt库实现的图形界面程序。该程序创建一个窗口,其中包含一个绿球和72个黄球,这些球会随机移动。当绿球碰到黄球时,黄球变为绿球,并加入绿球阵营。当所有球都变为绿球时,程序会输出从程序开始到现在经过的时间。 ```cpp #include <QtWidgets> #include <QTime> // 球的类 class Ball : public QObject, public QGraphicsItem { Q_OBJECT public: Ball(QColor color, QGraphicsItem *parent = nullptr) : QObject(parent), QGraphicsItem(parent), color(color) { setFlag(ItemIsMovable, false); setFlag(ItemIsFocusable, false); // 随机初始位置 setPos(rand() % 800, rand() % 600); // 随机速度 dx = (rand() % 3 - 1); if (dx == 0) dx = 1; dy = (rand() % 3 - 1); if (dy == 0) dy = 1; } QRectF boundingRect() const override { return QRectF(-10, -10, 20, 20); } void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override { Q_UNUSED(option); Q_UNUSED(widget); painter->setBrush(color); painter->drawEllipse(-10, -10, 20, 20); } void move() { // 移动球 setPos(x() + dx, y() + dy); // 边界检测 if (x() < 10 || x() > 790) dx = -dx; if (y() < 10 || y() > 590) dy = -dy; } void setColor(QColor newColor) { color = newColor; } QColor getColor() const { return color; } private: QColor color; int dx, dy; }; // 主窗口 class MainWindow : public QWidget { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QWidget(parent) { scene = new QGraphicsScene(this); scene->setSceneRect(0, 0, 800, 600); view = new QGraphicsView(scene, this); view->setFixedSize(800, 600); // 创建绿球 greenBall = new Ball(Qt::green); scene->addItem(greenBall); // 创建72个黄球 for (int i = 0; i < 72; ++i) { yellowBalls.append(new Ball(Qt::yellow)); scene->addItem(yellowBalls.last()); } // 计时器 timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MainWindow::updateScene); timer->start(10); // 记录开始时间 startTime = QTime::currentTime(); } private slots: void updateScene() { // 移动绿球 greenBall->move(); // 移动黄球并检查碰撞 for (int i = 0; i < yellowBalls.size(); ++i) { Ball *yellowBall = yellowBalls[i]; yellowBall->move(); if (greenBall->collidesWithItem(yellowBall)) { yellowBall->setColor(Qt::green); greenBalls.append(yellowBall); yellowBalls.removeAt(i); --i; } } // 检查是否所有球都变为绿球 if (yellowBalls.isEmpty()) { timer->stop(); QTime endTime = QTime::currentTime(); int elapsed = startTime.msecsTo(endTime); qDebug() << "从程序开始到现在经过的时间: " << elapsed << " 毫秒"; } scene->update(); } private: QGraphicsScene *scene; QGraphicsView *view; Ball *greenBall; QList<Ball*> yellowBalls; QList<Ball*> greenBalls; QTimer *timer; QTime startTime; }; #include "main.moc" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } ``` 代码说明: 1. Ball类:代表一个球,继承自`QObject`和`QGraphicsItem`。包含球的颜色、位置、速度信息,还有移动、绘制和颜色设置等方法。 2. MainWindow类:主窗口类,负责创建场景、视图、球对象和计时器。在`updateScene`槽函数中,移动球并检查碰撞,当所有黄球变为绿球时,停止计时器并输出经过的时间。 3. main函数:创建`QApplication`实例和`MainWindow`对象,并显示窗口。 编译和运行: 要编译和运行这个程序,你需要安装Qt开发环境。然后使用以下命令编译: ```sh qmake -project qmake make ``` 最后运行生成的可执行文件。 [2026-01-23 08:41:56 | AI问答 | 1280点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多