目录
使用QtCreator 完成简单小游戏-猜数字游戏实现效果如下:
1.需要的知识点:
- QLabel显示图片,动图
- 常见控件的使用
- 信号与槽
- QStackedWidget 实现页面切换
- 定时器的使用
2.工程创建好后,先在设计器中实现界面
界面主要需要4个页面 :(使用QStackedWidget实现页面切换)
- 首页
- 游戏页(在界面可以添加widget进行小布局,再进行大布局)
- 游戏胜利界面(使用Label添加动画)
- 游戏失败界面
3.代码实现部分
- .h文件
-
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QString> #include <QWidget> #include <QMovie> #include <QPushButton> namespace Ui { class MyWidget; } class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget *parent = 0); ~MyWidget(); //自定义槽函数 void dealNum(); void boxAddItem(); private slots: void on_pushButtonStart_clicked(); void on_pushButtonEnd_clicked(); void on_pushButtonDel_clicked(); void on_pushButtonEnter_clicked(); protected: //定时器事件,为虚函数 void timerEvent(QTimerEvent *e); private: Ui::MyWidget *ui; int gameTime; QString randStr;//随机数 int gameTimeId;//游戏时间定时器ID int overTimeId;//失败动画定时器ID int winTimeId;//胜利动画定时器ID QString resultStr;//结果数 QMovie overMovie;//失败动画 QMovie winMovie;//胜利动画 }; #endif // MYWIDGET_H
- .cpp文件
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QMessageBox>
#include <QTime>
#include <QString>
#include <QDebug>
#include <QPushButton>
#include <QTimer>
#include <QObject>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::MyWidget)
{
ui->setupUi(this);
//显示第一个页面(设置页面)
//设置固定大小
setFixedSize(600,600);
//设置图标
setWindowIcon(QIcon(":/images/guess.jpg"));
//设置标题
setWindowTitle("猜数字游戏");
// ui->title->setStyleSheet("QLabel{font-size:40px;"
// "font-family:yahei;}");
ui->stackedWidget->setCurrentWidget(ui->pageSet);
this->boxAddItem();
// this->boxadditem();
//初始化数据
//失败动画
overMovie.setFileName(":/images/fighting.gif");
ui->labelOver->setMovie(&overMovie);//给标签设置动画
ui->labelOver->setScaledContents("true");//让标签自适应动画大小
//胜利动画
winMovie.setFileName(":/images/praise.gif");
ui->labelWin->setMovie(&winMovie);
ui->labelWin->setScaledContents("true");
//猜数字游戏界面相应设置
//数字按钮都连接同一个槽
connect(ui->pushButton0,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton1,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton2,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton3,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton4,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton5,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton6,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton7,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton8,&QPushButton::clicked,this,&MyWidget::dealNum);
connect(ui->pushButton9,&QPushButton::clicked,this,&MyWidget::dealNum);
}
//定时器
void MyWidget::timerEvent(QTimerEvent *e)
{
if(e->timerId()==this->gameTimeId)
{
qDebug()<<"定时中";
gameTime--;
ui->progressBar->setValue(gameTime);//更新时间
//判断时间是否没有
if(gameTime==0)
{
killTimer(gameTimeId);//关闭游戏定时
//失败提醒
QMessageBox::warning(this,"挑战失败","时间已经到了");
//开启失败动画
overMovie.start();
ui->stackedWidget->setCurrentWidget(ui->pageover);
//开启失败动画播放定时
overTimeId=startTimer(5000);
}
}
else if(e->timerId()==overTimeId)
{
//关闭失败动画,关闭失败定时,切换至主页面
overMovie.stop();
killTimer(overTimeId);
ui->stackedWidget->setCurrentWidget(ui->pageSet);
}
else if(e->timerId()==winTimeId)
{
//关闭成功动画,关闭成功定时,切换至主页面
winMovie.stop();
killTimer(winTimeId);
ui->stackedWidget->setCurrentWidget(ui->pageSet);
}
}
//处理数据函数
void MyWidget::dealNum()
{
//选择接收者
QObject *Mysender = sender();//多个信号连接到同一个槽时,使用sender
//将接收者转化为按钮类型
QPushButton *p = (QPushButton *)Mysender;
if(p!=NULL)//判断是否有按钮摁下
{
//获取按下按钮的文本信息
QString numstr = p->text();
qDebug()<<p->text();
//更新结果
resultStr+=numstr;
qDebug()<<resultStr;
//当没有数时使其不能输入0
if(resultStr.size()==1&&resultStr=="0")
{
resultStr.clear();
}
//如果输入位数大于4
if(resultStr.size()>4)
{
resultStr.clear();
}
//输入数字小于4位时
if(resultStr.size()<=4)
{
ui->textEdit->setText(resultStr);//显示当前结果
if(resultStr.size() == 4)
{
if(resultStr>randStr)
{
ui->textEdit->append("数字大了一些");
}
else if(resultStr<randStr)
{
ui->textEdit->append("数字小了一些");
}
else
{
ui->textEdit->append("恭喜你,猜对了!");
killTimer(gameTimeId);//关闭游戏定时
//开启成功动画
winMovie.start();
ui->stackedWidget->setCurrentWidget(ui->pagewin);
winTimeId=startTimer(5000);//开启成功动画定时
resultStr.clear();//清空当前结果
}
}
}
}
}
//删除输入函数
void MyWidget::on_pushButtonDel_clicked()
{
//如果为一位直接清空
if(resultStr.size()==1)
{
resultStr.clear();
ui->textEdit->clear();
}
else
{
resultStr.chop(1);//截掉最后一位字符
// resultStr[resultStr.size() -1] = '\0';
ui->textEdit->setText(resultStr);
}
}
//进入游戏界面
void MyWidget::on_pushButtonStart_clicked()
{
//获取下拉框的时间 .toInt(): 字符串转换为 int
gameTime = ui->comboBox->currentText().toInt();
qDebug()<<gameTime <<"s";
ui->stackedWidget->setCurrentWidget(ui->gaming);//切换到游戏界面
//生成随机数
int num;
//以从0时0分0秒到现在的秒数为种子
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
while((num = qrand()%10000)<999);//保证随机数为四位
randStr = QString::number(num);//QString::number(),将数字转换为QString类型,num 为待转换数字,默认十进制方式显示
qDebug()<<num;
//设置最大、最小和当前值
ui->progressBar->setMaximum(gameTime);
ui->progressBar->setMinimum(0);
ui->progressBar->setValue(gameTime);
//启动定时器
gameTimeId = 0;
gameTimeId = startTimer(1000);//以1000毫秒(1秒)作为时间间隔
qDebug()<<"定时开始";
//清空结果
resultStr.clear();
ui->textEdit->clear();
}
//确认是否退出游戏
void MyWidget::on_pushButtonEnd_clicked()
{
int ret = QMessageBox::question(this,"question","请确认是否退出游戏?");
if(ret==QMessageBox::Yes)
{
close();
}
}
//设置提示文本
void MyWidget::on_pushButtonEnter_clicked()
{
resultStr.clear();
QString str ="随机数为:"+randStr;
ui->textEdit->setText(str);
}
//设置时间选项
void MyWidget::boxAddItem()
{
ui->comboBox->addItem("20");
ui->comboBox->addItem("30");
ui->comboBox->addItem("40");
ui->comboBox->addItem("50");
ui->comboBox->addItem("60");
ui->comboBox->addItem("70");
ui->comboBox->addItem("80");
ui->comboBox->addItem("90");
ui->comboBox->addItem("100");
}
MyWidget::~MyWidget()
{
delete ui;
}