QTC++制作超详细《真心话大冒险》游戏【转载】

            <div id="content_views" class="htmledit_views">
                <p id="main-toc"><strong>目录</strong></p> 

一、概括

二、游戏流程

三、 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


 
 
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include "QTimer"
  5. #include "QString"
  6. #include "QIcon"
  7. #include "QPixmap"
  8. #include <QPainter>
  9. #include <iostream>
  10. using namespace std;
  11. namespace Ui {
  12. class Widget;
  13. }
  14. class Widget : public QWidget
  15. {
  16. Q_OBJECT
  17. public:
  18. explicit Widget(QWidget *parent = 0);
  19. ~ Widget();
  20. void paintEvent(QPaintEvent *event);
  21. public slots:
  22. void time_sub();
  23. private slots:
  24. void on_btn_start_clicked(bool checked);
  25. void on_btn_restart_clicked(bool checked);
  26. void on_btn_truth_clicked(bool checked);
  27. void on_btn_dare_clicked(bool checked);
  28. private:
  29. Ui::Widget *ui;
  30. QTimer *time;
  31. };
  32. #endif // WIDGET_H

widget.cpp


 
 
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget:: Widget(QWidget *parent) :
  4. QWidget(parent),
  5. ui( new Ui::Widget)
  6. {
  7. ui-> setupUi( this);
  8. ui->btn_restart-> hide();
  9. ui->label_zheng-> hide();
  10. ui->label_fan-> hide();
  11. ui->label_shu1-> hide();
  12. ui->label_shu2-> hide();
  13. ui->label_ping-> hide();
  14. ui->label_over-> hide();
  15. ui->btn_truth-> hide();
  16. ui->btn_dare-> hide();
  17. ui->label_task-> hide();
  18. ui->label_question-> hide();
  19. time= new QTimer();
  20. connect(time,&QTimer::timeout, this,&Widget::time_sub);
  21. this-> setWindowIcon( QIcon( ":/img/truthOrdare.png"));
  22. this-> setWindowTitle( "真心话大冒险");
  23. this-> setFixedSize( 1200, 800);
  24. ui->btn_start-> setStyleSheet( "background-color: #EAEAAE;");
  25. ui->btn_restart-> setStyleSheet( "background-color: #EAEAAE;");
  26. ui->btn_truth-> setStyleSheet( "background-color: #EAEAAE;");
  27. ui->btn_dare-> setStyleSheet( "background-color: #EAEAAE;");
  28. }
  29. Widget::~ Widget()
  30. {
  31. delete ui;
  32. }
  33. void Widget::paintEvent(QPaintEvent *event)
  34. {
  35. QPainter painter(this);
  36. painter. drawPixmap( 0, 0, width(), height(), QPixmap( ":/img/bg.webp"));
  37. }
  38. void Widget::time_sub()
  39. {
  40. int t=ui->label_time-> text(). toInt();
  41. t--;
  42. QString str=QString:: number(t);
  43. ui->label_time-> setText(str);
  44. if(str== "0")
  45. {
  46. time-> stop();
  47. ui->label_zheng-> setVisible( true);
  48. ui->label_fan-> setVisible( true);
  49. QString action[ 3]={ "石头", "剪刀", "布"};
  50. int index1= rand()% 3;
  51. int index2= rand()% 3;
  52. ui->label_zheng-> setText(action[index1]);
  53. ui->label_fan-> setText(action[index2]);
  54. QString zheng=ui->label_zheng-> text();
  55. QString fan=ui->label_fan-> text();
  56. ui->btn_restart-> setVisible( true);
  57. if((zheng== "石头" && fan== "布") || (zheng== "剪刀" && fan== "石头") || (zheng== "布" && fan== "剪刀")) //正方输了
  58. {
  59. ui->label_shu1-> setVisible( true);
  60. ui->label_over-> setVisible( true);
  61. ui->btn_restart-> hide();
  62. ui->btn_start-> setVisible( true);
  63. ui->btn_truth-> setVisible( true);
  64. ui->btn_dare-> setVisible( true);
  65. ui->label_task-> setVisible( true);
  66. ui->label_question-> setVisible( true);
  67. } else if ((zheng== "石头" && fan== "石头") || (zheng== "剪刀" && fan== "剪刀") || (zheng== "布" && fan== "布")) {
  68. ui->label_ping-> setVisible( true);
  69. //平局则再来一局
  70. } else {
  71. ui->label_shu2-> setVisible( true);
  72. ui->label_over-> setVisible( true);
  73. ui->btn_restart-> hide();
  74. ui->btn_start-> setVisible( true);
  75. ui->btn_truth-> setVisible( true);
  76. ui->btn_dare-> setVisible( true);
  77. ui->label_task-> setVisible( true);
  78. ui->label_question-> setVisible( true);
  79. }
  80. }
  81. }
  82. void Widget::on_btn_start_clicked(bool checked)
  83. {
  84. //倒计时3秒开始
  85. ui->label_zheng-> hide();
  86. ui->label_fan-> hide();
  87. ui->label_shu1-> hide();
  88. ui->label_shu2-> hide();
  89. ui->label_ping-> hide();
  90. ui->label_over-> hide();
  91. ui->btn_truth-> hide();
  92. ui->btn_dare-> hide();
  93. ui->label_task-> hide();
  94. ui->label_task-> setText( "");
  95. ui->label_question-> hide();
  96. ui->label_time-> setText( "4");
  97. ui->btn_start-> hide();
  98. time-> start( 1000);
  99. time_sub();
  100. //倒计时完时随机出石头剪刀布
  101. //谁输就在谁下面显示 你输啦!
  102. }
  103. void Widget::on_btn_restart_clicked(bool checked)
  104. {
  105. //倒计时重置为3开始减
  106. ui->label_time-> setText( "4");
  107. ui->label_zheng-> hide();
  108. ui->label_fan-> hide();
  109. ui->label_shu1-> hide();
  110. ui->label_shu2-> hide();
  111. ui->label_ping-> hide();
  112. ui->btn_restart-> hide();
  113. time-> start( 1000);
  114. time_sub();
  115. }
  116. void Widget::on_btn_truth_clicked(bool checked)
  117. {
  118. ui->label_question-> hide();
  119. ui->btn_truth-> hide();
  120. ui->btn_dare-> hide();
  121. QString task_truth[]={
  122. "你有没有暗恋过某个人?",
  123. "你最喜欢的歌是什么?",
  124. "你最喜欢什么颜色?",
  125. "你最后悔的一件事是什么?",
  126. "你遇到过最令你感动的事是什么?",
  127. "比较喜欢爸爸还是妈妈?",
  128. "最近一次发自内心的笑是什么时候?",
  129. "如果给你一次去任何地方旅游的机会你会去哪里?",
  130. "你的理想型是什么样的?",
  131. "你会选择你爱的人还是爱你的人?"
  132. };
  133. ui->label_task-> setVisible( true);
  134. int len_truth= sizeof(task_truth)/ sizeof(task_truth[ 0]);
  135. cout << len_truth << endl;
  136. int index= rand()%len_truth;
  137. ui->label_task-> setText(task_truth[index]);
  138. }
  139. void Widget::on_btn_dare_clicked(bool checked)
  140. {
  141. ui->label_question-> hide();
  142. ui->btn_truth-> hide();
  143. ui->btn_dare-> hide();
  144. QString task_dare[]={
  145. "做一个大家都满意的鬼脸",
  146. "唱青藏高原最后一句",
  147. "邀请一位异性与你合唱",
  148. "做一个性感、妩媚的表情或动作",
  149. "背一位异性绕场一周",
  150. "抓着铁门喊“放我出去!”",
  151. "走猫步",
  152. "选一个男生锤他胸口并说“你好讨厌哦”"
  153. };
  154. ui->label_task-> setVisible( true);
  155. int len_dare= sizeof(task_dare)/ sizeof(task_dare[ 0]);
  156. cout << len_dare << endl;
  157. int index= rand()%len_dare;
  158. ui->label_task-> setText(task_dare[index]);
  159. }
[添加链接描述](https://blog.csdn.net/weixin_66635580/article/details/140576306?ops_request_misc=&request_id=&biz_id=102&utm_term=QT%E6%B8%B8%E6%88%8F%E5%88%B6%E4%BD%9C&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-0-140576306.nonecase&spm=1018.2226.3001.4450)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值