16-1猜数字练习
猜数字游戏
通过随机函数产生一个随机的四位数,用户在规定的时间去猜,每猜一次都出提示,数对了还是数大了或小了。
页面切换
语句:
ui->stackedWidget->setCurrentWidget(ui->pageStart);
在设计器中利用控件Stacked Widget加载4个页面:
前两个是游戏页面,后两个用于播放动画。(可不要)
首页的猜数时间
Combo Box可以直接点击去设定,不要代码去设置。
四个按钮需要转到槽:进入游戏、退出游戏、退格键、提示键
0~9数字键可以使用同一个槽函数,因此最好自拟。
源代码:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QString>
#include <QMovie>
#include <QTimerEvent>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void timerEvent(QTimerEvent *e);
private slots:
void on_btnRun_clicked();
void on_btnClose_clicked();
void on_btnReturn_clicked();
void on_btnTip_clicked();
public slots:
void dealNum();
private:
Ui::Widget *ui;
int gameTime; //游戏时间
QString strRand; //随机数
int gameTimerId; //游戏时间定时器ID
int overTimerId; //失败动画定时器ID
int winTimerId; //成功动画定时器ID
QString strResult; //结果数
QMovie overMovie; //失败动画
QMovie winMovie; //胜利动画
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QTime>
#include <QMessageBox>
#include <QObject>
#include <QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//显示开始页面
ui->stackedWidget->setCurrentWidget(ui->pageStart);
//初始化数据
//加载失败动画
overMovie.setFileName("../1.jpg");
//给标签设置动画
ui->labelOver->setMovie(&overMovie);
//让动画自动适应标签大小
ui->labelOver->setScaledContents(true);
//加载成功动画
winMovie.setFileName("../12.jpg");
//给标签设置动画
ui->labelWin->setMovie(&winMovie);
//让动画自动适应标签大小
ui->labelWin->setScaledContents(true);
//数字键
//作用相同,均连接到同一个槽函数
connect(ui->btn0,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn1,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn2,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn3,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn4,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn5,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn6,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn7,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn8,&QPushButton::clicked,this,&Widget::dealNum);
connect(ui->btn9,&QPushButton::clicked,this,&Widget::dealNum);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btnRun_clicked()
{
//获取下拉框游戏时间,.toInt():字符换转换成int
gameTime=ui->comboBox->currentText().toInt();
//切换到游戏界面
// ui->stackedWidget->setCurrentWidget(1); //1是第二个页面
ui->stackedWidget->setCurrentWidget(ui->pageGame);
int num;
//以从0时0分0秒到现在的秒数为种子
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
//保证是四位数
while((num=qrand()%10000)<999);
//把int类型转换成string
strRand=QString::number(num);
qDebug()<<"randnum="<<strRand;
//设置进度条
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(gameTime);
ui->progressBar->setValue(gameTime);
gameTimerId=0;
//启动定时器
gameTimerId=startTimer(1000);
strResult.clear();
ui->textEdit->clear();
}
void Widget::on_btnClose_clicked()
{
this->close();
}
void Widget::timerEvent(QTimerEvent *e)
{
//游戏时间
if(e->timerId()==gameTimerId)
{
gameTime--;
//设置进度条
ui->progressBar->setValue(gameTime);
if(gameTime==0)
{
//关闭定时器
killTimer(gameTimerId);
QMessageBox::information(this,"失败","游戏时间到");
//启动失败动画
overMovie.start();
//切换到失败动画页面
ui->stackedWidget->setCurrentWidget(ui->pageOver);
overTimerId=startTimer(5000);
}
}
//失败动画时间
else if(e->timerId()==overTimerId)
{
//停止动画和定时器,回到游戏首页
overMovie.stop();
killTimer(overTimerId);
ui->stackedWidget->setCurrentWidget(ui->pageStart);
}
//胜利动画时间
else if(e->timerId()==winTimerId)
{
//停止动画和定时器,回到游戏首页
winMovie.stop();
killTimer(winTimerId);
ui->stackedWidget->setCurrentWidget(ui->pageStart);
}
}
//数字键处理
void Widget::dealNum()
{
//获取信号接收者
QObject *mySender=sender();
//转换为按钮类型
QPushButton *p= (QPushButton *)mySender;
if(p!=NULL)
{
//获取按钮的内容
QString strNum=p->text();
strResult+=strNum;
//数字不能以0开始
if(strResult.size()==1&&strResult=="0")
{
strResult.clear();
}
if(strResult.size()<=4)
{
ui->textEdit->setText(strResult);
if(strResult.size()==4)
{
if(strResult>strRand)
{
ui->textEdit->append("数字太大");
}
else if(strResult<strRand)
{
ui->textEdit->append("数字太小");
}
else
{
ui->textEdit->append("猜对了");
killTimer(gameTimerId);
QMessageBox::information(this,"胜利","猜对了");
//切换到成功动画
winMovie.start();
ui->stackedWidget->setCurrentWidget(ui->pageWin);
winTimerId=startTimer(5000);
}
strResult.clear();
}
}
}
}
//退格键
void Widget::on_btnReturn_clicked()
{
if(strResult.size()==1)
{
strResult.clear();
ui->textEdit->clear();
}
else
{
strResult.chop(1); //截断最后一位字符
ui->textEdit->setText(strResult);
}
}
//提示键
void Widget::on_btnTip_clicked()
{
strResult.clear();
QString strTemp="随机数为:"+strRand;
qDebug()<<strTemp;
ui->textEdit->setText(strTemp);
}