目录
一、概括
《真心话大冒险》是一款通过猜拳决定胜方与输方,并让输方选择真心话还是大冒险,然后给出相应惩罚的游戏。玩家点击开始游戏,倒计时3秒结束后,随机为正反方出石头剪刀布,若是平局则点击再来一局,直到游戏结束,输方选择真心话还是大冒险,随机为输方显示真心话或大冒险内容。
二、游戏流程
点击开始游戏按钮,开始倒计时。
输方选择真心话或者大冒险。
若是打成平局,则点击再来一局,直到游戏结束。
三、 ui界面设计
关于界面设计,用到了许多Label控件来显示文本信息,PushButton控件展示相应按钮,并使用Spacers调整界面的流畅度和整齐度。
四、代码设计
有许多Label和按钮控件是无需展示需要隐藏起来的,这时候需要用到控件的hide()函数来实现,语法格式为:ui->控件名->hide();例如ui->label->hide(); ui->pushbutton->hide();。
如果想将已经隐藏的控件重新展示出来,则需要使用setVisible()函数,语法格式为:ui->控件名->setVisible();例如ui->label->setVisible(true); ui->pushbutton->setVisible(true);
3秒倒计时需要使用到定时器。使用步骤为:
1.创建QTimer对象,语法格式为:QTimer *变量名 = new QTimer(); 例如QTimer *time=new QTimer();
2.将定时器的timeout信号与窗口的槽函数连接,语法格式为:connect(变量名,&QTimer::timeout,this,&当前窗口所属的类的类名::自定义槽函数名); 例如connect(time,&QTimer::timeout,this,&Widget::time_sub); 此处的time_sub是我自定义的槽函数名,作用是将定时器减减;
3.使用start()开启定时器,语法格式为:变量名->start(间隔时间单位毫秒); 例如time->start(1000); 1000的单位是毫秒,意义为每间隔1s执行一次time_sub函数的操作;
4.使用stop()开启定时器,语法格式为:变量名->stop();。
设置背景图片步骤:
1.引入QPixmap、QPainter头文件;
2.定义一个函数 void paintEvent(QPaintEvent *event); 在.cpp中添加定义;
3.在定义中创建一个QPainter对象,语法格式为:QPainter 对象名(this);
4.使用drawPixmap函数设置背景图片,语法格式为:对象名.drawPixmap(x,y,width(),height(),QPixmap("图片的路径")); 此处的x和y为起始坐标。
设置窗口图标:this->setWindowIcon(QIcon("图片的路径"));
设置窗口标题:this->setWindowTitle("标题");
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "QTimer"
#include "QString"
#include "QIcon"
#include "QPixmap"
#include <QPainter>
#include <iostream>
using namespace std;
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void paintEvent(QPaintEvent *event);
public slots:
void time_sub();
private slots:
void on_btn_start_clicked(bool checked);
void on_btn_restart_clicked(bool checked);
void on_btn_truth_clicked(bool checked);
void on_btn_dare_clicked(bool checked);
private:
Ui::Widget *ui;
QTimer *time;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->btn_restart->hide();
ui->label_zheng->hide();
ui->label_fan->hide();
ui->label_shu1->hide();
ui->label_shu2->hide();
ui->label_ping->hide();
ui->label_over->hide();
ui->btn_truth->hide();
ui->btn_dare->hide();
ui->label_task->hide();
ui->label_question->hide();
time=new QTimer();
connect(time,&QTimer::timeout,this,&Widget::time_sub);
this->setWindowIcon(QIcon(":/img/truthOrdare.png"));
this->setWindowTitle("真心话大冒险");
this->setFixedSize(1200,800);
ui->btn_start->setStyleSheet("background-color: #EAEAAE;");
ui->btn_restart->setStyleSheet("background-color: #EAEAAE;");
ui->btn_truth->setStyleSheet("background-color: #EAEAAE;");
ui->btn_dare->setStyleSheet("background-color: #EAEAAE;");
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(0,0,width(),height(),QPixmap(":/img/bg.webp"));
}
void Widget::time_sub()
{
int t=ui->label_time->text().toInt();
t--;
QString str=QString::number(t);
ui->label_time->setText(str);
if(str=="0")
{
time->stop();
ui->label_zheng->setVisible(true);
ui->label_fan->setVisible(true);
QString action[3]={"石头","剪刀","布"};
int index1=rand()%3;
int index2=rand()%3;
ui->label_zheng->setText(action[index1]);
ui->label_fan->setText(action[index2]);
QString zheng=ui->label_zheng->text();
QString fan=ui->label_fan->text();
ui->btn_restart->setVisible(true);
if((zheng=="石头" && fan=="布") || (zheng=="剪刀" && fan=="石头") || (zheng=="布" && fan=="剪刀"))//正方输了
{
ui->label_shu1->setVisible(true);
ui->label_over->setVisible(true);
ui->btn_restart->hide();
ui->btn_start->setVisible(true);
ui->btn_truth->setVisible(true);
ui->btn_dare->setVisible(true);
ui->label_task->setVisible(true);
ui->label_question->setVisible(true);
}else if ((zheng=="石头" && fan=="石头") || (zheng=="剪刀" && fan=="剪刀") || (zheng=="布" && fan=="布")) {
ui->label_ping->setVisible(true);
//平局则再来一局
}else {
ui->label_shu2->setVisible(true);
ui->label_over->setVisible(true);
ui->btn_restart->hide();
ui->btn_start->setVisible(true);
ui->btn_truth->setVisible(true);
ui->btn_dare->setVisible(true);
ui->label_task->setVisible(true);
ui->label_question->setVisible(true);
}
}
}
void Widget::on_btn_start_clicked(bool checked)
{
//倒计时3秒开始
ui->label_zheng->hide();
ui->label_fan->hide();
ui->label_shu1->hide();
ui->label_shu2->hide();
ui->label_ping->hide();
ui->label_over->hide();
ui->btn_truth->hide();
ui->btn_dare->hide();
ui->label_task->hide();
ui->label_task->setText("");
ui->label_question->hide();
ui->label_time->setText("4");
ui->btn_start->hide();
time->start(1000);
time_sub();
//倒计时完时随机出石头剪刀布
//谁输就在谁下面显示 你输啦!
}
void Widget::on_btn_restart_clicked(bool checked)
{
//倒计时重置为3开始减
ui->label_time->setText("4");
ui->label_zheng->hide();
ui->label_fan->hide();
ui->label_shu1->hide();
ui->label_shu2->hide();
ui->label_ping->hide();
ui->btn_restart->hide();
time->start(1000);
time_sub();
}
void Widget::on_btn_truth_clicked(bool checked)
{
ui->label_question->hide();
ui->btn_truth->hide();
ui->btn_dare->hide();
QString task_truth[]={
"你有没有暗恋过某个人?",
"你最喜欢的歌是什么?",
"你最喜欢什么颜色?",
"你最后悔的一件事是什么?",
"你遇到过最令你感动的事是什么?",
"比较喜欢爸爸还是妈妈?",
"最近一次发自内心的笑是什么时候?",
"如果给你一次去任何地方旅游的机会你会去哪里?",
"你的理想型是什么样的?",
"你会选择你爱的人还是爱你的人?"
};
ui->label_task->setVisible(true);
int len_truth=sizeof(task_truth)/sizeof(task_truth[0]);
cout << len_truth << endl;
int index=rand()%len_truth;
ui->label_task->setText(task_truth[index]);
}
void Widget::on_btn_dare_clicked(bool checked)
{
ui->label_question->hide();
ui->btn_truth->hide();
ui->btn_dare->hide();
QString task_dare[]={
"做一个大家都满意的鬼脸",
"唱青藏高原最后一句",
"邀请一位异性与你合唱",
"做一个性感、妩媚的表情或动作",
"背一位异性绕场一周",
"抓着铁门喊“放我出去!”",
"走猫步",
"选一个男生锤他胸口并说“你好讨厌哦”"
};
ui->label_task->setVisible(true);
int len_dare=sizeof(task_dare)/sizeof(task_dare[0]);
cout << len_dare << endl;
int index=rand()%len_dare;
ui->label_task->setText(task_dare[index]);
}