廢話少說先上圖:

這個游戲純屬土鱉思路,沒有用到什么游戲引擎。
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
