Qt实现水排序游戏
时间: 2023-11-22 09:55:13 浏览: 44
水排序游戏是一种经典的益智小游戏,玩家需要将不同颜色的水滴按照颜色分类并倒入对应的容器中。使用Qt可以很方便地实现这个游戏。
首先,我们需要设计界面。可以使用Qt Designer来设计,放置好需要的控件,如水滴、容器、按钮等。然后在代码中实现游戏逻辑。
游戏逻辑如下:
1. 随机生成一定数量的水滴,并将它们随机放置在容器上方。
2. 点击水滴,将其倒入对应的容器中。
3. 当所有水滴都被倒入时,游戏结束。
实现代码如下:
```
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QTime>
#include <QMessageBox>
const int NUM_COLORS = 4;
const int NUM_CONTAINERS = 4;
const int NUM_DROPS = 20;
class Drop : public QLabel
{
public:
Drop(QWidget *parent = nullptr) : QLabel(parent)
{
setFixedSize(40, 40);
setAlignment(Qt::AlignCenter);
setStyleSheet("QLabel {border: 1px solid black;}");
}
void setColor(int color)
{
m_color = color;
setStyleSheet(QString("QLabel {background-color: %1;}").arg(getColorName(m_color)));
}
int color() const
{
return m_color;
}
private:
QString getColorName(int color) const
{
switch (color) {
case 0:
return "red";
case 1:
return "green";
case 2:
return "blue";
case 3:
return "yellow";
default:
return "white";
}
}
int m_color;
};
class Container : public QLabel
{
public:
Container(QWidget *parent = nullptr) : QLabel(parent)
{
setFixedSize(60, 100);
setAlignment(Qt::AlignCenter);
setStyleSheet("QLabel {border: 1px solid black;}");
}
void setColor(int color)
{
m_color = color;
setStyleSheet(QString("QLabel {background-color: %1;}").arg(getColorName(m_color)));
}
int color() const
{
return m_color;
}
private:
QString getColorName(int color) const
{
switch (color) {
case 0:
return "red";
case 1:
return "green";
case 2:
return "blue";
case 3:
return "yellow";
default:
return "white";
}
}
int m_color;
};
class SortingGame : public QWidget
{
Q_OBJECT
public:
SortingGame(QWidget *parent = nullptr) : QWidget(parent)
{
setFixedSize(400, 400);
QVBoxLayout *mainLayout = new QVBoxLayout(this);
QHBoxLayout *buttonLayout = new QHBoxLayout;
QPushButton *newGameButton = new QPushButton(tr("New Game"));
QPushButton *quitButton = new QPushButton(tr("Quit"));
buttonLayout->addWidget(newGameButton);
buttonLayout->addWidget(quitButton);
m_gridLayout = new QGridLayout;
m_gridLayout->setSpacing(20);
mainLayout->addLayout(m_gridLayout);
mainLayout->addLayout(buttonLayout);
connect(newGameButton, &QPushButton::clicked, this, &SortingGame::newGame);
connect(quitButton, &QPushButton::clicked, qApp, &QApplication::quit);
newGame();
}
private slots:
void dropClicked()
{
Drop *drop = qobject_cast<Drop *>(sender());
if (!drop) {
return;
}
int color = drop->color();
Container *container = m_containers[m_currentContainer];
if (container->color() == color) {
container->setText(QString::number(container->text().toInt() + 1));
m_gridLayout->removeWidget(drop);
delete drop;
if (container->text().toInt() == NUM_DROPS / NUM_COLORS) {
m_currentContainer++;
if (m_currentContainer == NUM_CONTAINERS) {
QMessageBox::information(this, tr("Game Over"), tr("You won!"));
newGame();
}
}
}
}
void newGame()
{
m_currentContainer = 0;
for (Drop *drop : m_drops) {
m_gridLayout->removeWidget(drop);
delete drop;
}
m_drops.clear();
for (Container *container : m_containers) {
m_gridLayout->removeWidget(container);
delete container;
}
m_containers.clear();
QTime time = QTime::currentTime();
qsrand((uint)time.msec());
for (int i = 0; i < NUM_DROPS; i++) {
Drop *drop = new Drop(this);
drop->setColor(qrand() % NUM_COLORS);
m_drops.append(drop);
m_gridLayout->addWidget(drop, 0, i % NUM_CONTAINERS);
connect(drop, &Drop::clicked, this, &SortingGame::dropClicked);
}
for (int i = 0; i < NUM_CONTAINERS; i++) {
Container *container = new Container(this);
container->setColor(i);
m_containers.append(container);
m_gridLayout->addWidget(container, 1, i);
}
}
private:
QList<Drop *> m_drops;
QList<Container *> m_containers;
QGridLayout *m_gridLayout;
int m_currentContainer;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
SortingGame game;
game.show();
return app.exec();
}
```
这样,就可以实现一个简单的水排序游戏了。玩家可以通过点击水滴将其倒入对应颜色的容器中,当所有水滴都被倒入时,游戏结束。