QT-Creator C/C++ 打地鼠小游戏

废话少说先上图:

这个游戏纯属土鳖思路,没有用到什么游戏引擎。

1.使用按钮或QLabel铺满窗口。

2.通过简单算法随机动态的设置按钮矩阵中某个按钮的背景图像。

3.同步2过程反复设置多个按钮背景实现图像动起来,注意调节刷新时间。

4.重写按钮组鼠标事件,设置鼠标移入时光标的图案,可以是个小锤子。

5.单击事件后鼠标同理切换鼠标图案打下和抬起。

6.加入一点声音。

7.没有了。

相关代码:

main.cpp

#include "widget.h"
#include <QApplication>
int Widget::score;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w ,*pW;
    pW = &w;
    w.setWindowTitle("打地鼠   难度:★   成绩:5只 ");
    w.setFixedSize(400,350);
    w.show();
    保持窗口指针
    return a.exec();
}

  

mybutton.cpp

#include "mybutton.h"
#include <QWidget>
#include <QMouseEvent>
#include <QIcon>
#include <QSize>
#include <QString>
#include<QPixmap>
#include<Qtimer>
#include<QSound>
#include "widget.h"
MyButton::MyButton(QWidget *parent):QPushButton(parent)
{
    upTime = new QTimer(this);//恢复锤子状态
    upTime->connect(upTime,SIGNAL(timeout()),this,SLOT(upCZ()));
   // btnGroup = Widget();
      this->image = 0;
}
void MyButton::mousePressEvent(QMouseEvent *e){
     this->setCursor(QCursor(QPixmap("C:/src/c1.png")));
     upTime->start(100);
     this->hit();
     //处理
}
void MyButton::hit(){
    QSound::play("hit.wav");
        if(this->image != 0){
                 this->setIcon(QIcon("C:/src/hit.jpg"));
                 QSound::play("dead.wav");//相对路径
                 Widget::score++;
        }
}
void MyButton::upCZ(){
    this->setCursor(QCursor(QPixmap("C:/src/c0.png")));
}

  

mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H
#include<QTimer>
#include <QPushButton>
#include <QWidget>
#include <QMouseEvent>
class MyButton : public QPushButton
{
    Q_OBJECT
public:

    int image;//图片张数
    MyButton(QWidget *parent);
    void hit();
    void mousePressEvent(QMouseEvent *e);

private:
    QTimer *upTime;
    MyButton *btnGroup;
public slots:
    void upCZ();//抬起锤子
};

#endif // MYBUTTON_H

  

widget.cpp

#include "widget.h"
#include "mybutton.h"
#include <QIcon>
#include <QSize>
#include <QTimer>
#include<QDebug>
#include<QCursor>
#include<QPixmap>
Widget::Widget(QWidget *parent):QWidget(parent)
{

   initBtn(5);
   time= QTime::currentTime();
   qsrand(time.msec()+time.second()*1000);
   //随机数进程
   srand[0] = 0;//地鼠具体位置
   srand[1] = 0;//地鼠具体位置
   srand[2] = 0;//地鼠具体位置
   srand[3] = 0;//地鼠具体位置
   srand[4] = 0;//地鼠具体位置
   timer = new QTimer(this);
   timer->connect(timer,SIGNAL(timeout()),this,SLOT(startRun()));
   timer->start(200);
   QPixmap qp(40,40);
   qp.load("C:/src/c0.png");
   qp.scaled(60,60);
   this->setCursor(QCursor(qp));
}
void Widget::initBtn(int num){
    int counter = 0;
    for(int i= 0;i < num;i++){
        for(int j = 0; j < 5;j++){
            buttonGroup[counter] = new MyButton(this);
            buttonGroup[counter]->resize(80,70);//400/5=80一行5个
            buttonGroup[counter]->move(80*j,70*i);
          //  buttonGroup[counter]->setText(QString::number(counter));
          //  buttonGroup[counter]->setStyleSheet("border:0px;");
            buttonGroup[counter]->setIcon(QIcon("C:/src/emptyhole.jpg"));
            buttonGroup[counter]->setIconSize(QSize(85,87));
            counter++;
        }
    }

    //载入图像资源
    for(int i = 0; i < 6 ;i++){
    icoGroup[i] = new QIcon("C:/src/"+QString::number(i)+".jpg");
    }
}
void Widget::startRun(){
    this->setCursor(QCursor(QPixmap("C:/src/c0.png")));//鼠标抬起
    for(int i = 0;i< 5;i++){//一次性更新5个位置
        if(buttonGroup[srand[i]]->image < 6){
            buttonGroup[srand[i]]->setIcon(*icoGroup[buttonGroup[srand[i]]->image++]);
            buttonGroup[srand[i]]->setIconSize(QSize(85,87));
        }else{
            buttonGroup[srand[i]]->setIcon(QIcon("C:/src/emptyhole.jpg"));
            buttonGroup[srand[i]]->setIconSize(QSize(85,87));
            buttonGroup[srand[i]]->image = 0;
            srand[i] = qrand()%25;
            qDebug("地鼠位置:%d",srand[i]);
            //分数
            setWindowTitle("打地鼠   难度:★   成绩:"+QString::number(score)+"只 ");
        }
    }


}

MyButton **Widget::getBtnGroup(){
    return buttonGroup;
}

Widget::~Widget()
{

}

  

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "mybutton.h"
#include <QIcon>
#include <QTimer>
#include<QTime>
class Widget : public QWidget
{
    Q_OBJECT

public:
    static int score;//分数统计
    Widget(QWidget *parent = 0);
    void initBtn(int num);
    MyButton **getBtnGroup();
    ~Widget();

private:
    MyButton *buttonGroup[25];
    QTimer *timer;//刷新界面事务
    QIcon *icoGroup[6];
    QTime time;
    int srand[5];//具体位置
public slots:
   void startRun();//开始游戏
};

#endif // WIDGET_H

思路原始,写法丑陋,大神请无视,初学者可以学习下。

FROM CTGU HOMEWORK

转载于:https://www.cnblogs.com/homes/p/5095058.html

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的打地鼠小游戏C++代码,使用Qt框架实现: ```c++ #include "mainwindow.h" #include "ui_mainwindow.h" #include <QTimer> #include <QTime> #include <QLabel> #include <QMessageBox> #include <cstdlib> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); setFixedSize(300, 400); // 设置固定的窗口大小 setWindowTitle("打地鼠"); // 设置窗口标题 // 初始化游戏状态 gameStarted = false; score = 0; timeLeft = 30; // 创建计时器 timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updateTimeLeft())); // 创建地鼠标签 for (int i = 0; i < 9; i++) { QLabel *label = new QLabel(this); label->setPixmap(QPixmap(":/images/mole.png")); label->setGeometry(20 + (i % 3) * 80, 60 + (i / 3) * 80, 60, 60); label->hide(); moles.append(label); } // 更新游戏面板 updateScore(); updateTimeLeft(); } MainWindow::~MainWindow() { delete ui; } void MainWindow::updateScore() { ui->scoreLabel->setText(QString("得分: %1").arg(score)); } void MainWindow::updateTimeLeft() { if (timeLeft > 0) { timeLeft--; ui->timeLabel->setText(QString("剩余时间: %1 秒").arg(timeLeft)); showRandomMole(); } else { // 游戏结束 timer->stop(); QMessageBox::information(this, "游戏结束", QString("你的得分是 %1 分").arg(score)); gameStarted = false; score = 0; timeLeft = 30; updateScore(); updateTimeLeft(); for (int i = 0; i < 9; i++) { moles[i]->hide(); } } } void MainWindow::showRandomMole() { if (!gameStarted) return; // 随机选择一个地鼠 int index = qrand() % 9; QLabel *label = moles[index]; // 如果这个地鼠已经出现了,则重新选择一个地鼠 if (label->isVisible()) { showRandomMole(); return; } // 显示地鼠 label->show(); // 随机选择一个时间,让地鼠消失 int disappearTime = qrand() % 2000 + 1000; QTimer::singleShot(disappearTime, label, SLOT(hide())); // 继续显示下一个地鼠 QTimer::singleShot(qrand() % 1000 + 500, this, SLOT(showRandomMole())); } void MainWindow::on_startButton_clicked() { // 开始游戏 gameStarted = true; timer->start(1000); // 隐藏“开始游戏”按钮 ui->startButton->hide(); } void MainWindow::on_moleLabel_clicked() { // 打中了地鼠 if (!gameStarted) return; score++; updateScore(); sender()->hide(); } ``` 你需要在Qt Creator中新建一个QWidget应用程序工程,然后把上面的代码粘贴到mainwindow.cpp文件中。此外,还需要把一个名为mole.png的图片文件放到工程目录下的images子目录中。运行程序后,点击“开始游戏”按钮即可开始游戏,点击出现的地鼠可以得分。游戏时间为30秒,时间结束后会弹出游戏结束对话框。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值