废话少说先上图:
这个游戏纯属土鳖思路,没有用到什么游戏引擎。
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
时间: 2024-10-12 18:46:02