QTC++制作简易《真心话大冒险》游戏

目录

一、概括

二、游戏流程

三、 ui界面设计

四、代码设计


一、概括

        《真心话大冒险》是一款通过猜拳决定胜方与输方,并让输方选择真心话还是大冒险,然后给出相应惩罚的游戏。玩家点击开始游戏,倒计时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]);
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值