经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
QT--吃月亮小游戏
来源:cnblogs  作者:mahuifa  时间:2019/9/16 9:01:27  对本文有异议

QT--吃月亮小游戏

简介:

  • 该设计使用了鼠标事件键盘事件绘图事件,可通过鼠标或者方向键控制人物移动吃到月亮

代码:

widget.h文件:
  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include <QPaintEvent> //绘图事件
  5. #include <QMouseEvent> //鼠标
  6. #include <QPoint>
  7. #include <QKeyEvent> //键盘
  8. #include <QPainter>
  9. #include <QList>
  10. #include <QLineEdit>
  11.  
  12. namespace Ui {
  13. class Widget;
  14. }
  15. class Widget : public QWidget
  16. {
  17. Q_OBJECT
  18. public:
  19. explicit Widget(QWidget *parent = nullptr);
  20. ~Widget();
  21. public:
  22. int random_x; //保存月亮随机坐标
  23. int random_y;
  24. int direction; //保存键盘事件
  25. int Score = 0; //得分
  26. QString Score_data; //保存得分
  27.  
  28.  
  29. bool meet = false;
  30. QPainter *painter;
  31. QLineEdit *line;
  32. void Wall_x(int &);
  33. void Wall_y(int &); //遇见墙壁
  34. void meet_s(); //遇到月亮,重画月亮
  35. int Xrandom(); //产生随机数
  36. int Yrandom(); //产生随机数
  37. void Direction(); //控制人物改变方向
  38.  
  39.  
  40. void paintEvent(QPaintEvent *event); //绘图
  41. void mousePressEvent(QMouseEvent *event); //鼠标点击
  42. void mouseMoveEvent(QMouseEvent *event); //鼠标拖动
  43. void keyPressEvent(QKeyEvent *event); //键盘事件
  44. private:
  45. QPoint point;
  46. private:
  47. Ui::Widget *ui;
  48. };
  49. #endif // WIDGET_H
widget.cpp文件:
  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QDebug>
  4. #include <QPainter> //绘图画家
  5. #include <QTime>
  6. #include <QMutableListIterator>
  7. Widget::Widget(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. this->setMinimumSize(500,500); //窗口大小
  13. point.setX(this->width()/2); //初始化人物 在窗口中央
  14. point.setY(this->width()/2);
  15. random_x = Xrandom(); //初始化月亮
  16. random_y = Yrandom();
  17. }
  18. void Widget::mousePressEvent(QMouseEvent *event) //鼠标点击
  19. {
  20. qDebug() << event->pos() ;
  21. point = event->pos();
  22. update();
  23. }
  24. void Widget:: mouseMoveEvent(QMouseEvent *event) //鼠标拖动
  25. {
  26. qDebug() <<event->pos();
  27. point = event->pos();
  28. update();
  29. }
  30. void Widget::Wall_x(int &x) //遇见墙壁
  31. {
  32. if(x <= 20)
  33. {
  34. x += 50; //遇见就弹回
  35. Score -= 3;
  36. }
  37. else if (x >= this->width()-40)
  38. {
  39. x -= 50;
  40. Score -= 3;
  41. }
  42. }
  43. void Widget::Wall_y(int &y) //遇见墙壁
  44. {
  45. if(y <= 20)
  46. {
  47. y += 50;
  48. Score -= 3;
  49. }
  50. else if (y >= this->height()-40)
  51. {
  52. y -= 50;
  53. Score -= 3;
  54. }
  55. }
  56. void Widget::keyPressEvent(QKeyEvent *event) //键盘事件,控制人物移动
  57. {
  58. int x = point.x();
  59. int y = point.y();
  60. qDebug() << event->key() ;
  61. direction = event->key();
  62. switch(event->key())
  63. {
  64. case Qt::Key_Up: //
  65. qDebug() <<"";
  66. y -= 10;
  67. Wall_y(y);
  68. break;
  69. case Qt::Key_Down: //
  70. qDebug() <<"";
  71. y += 10;
  72. Wall_y(y);
  73. break;
  74. case Qt::Key_Left: //
  75. qDebug() <<"";
  76. x -= 10;
  77. Wall_x(x);
  78. break;
  79. case Qt::Key_Right: //
  80. qDebug() <<"";
  81. x += 10;
  82. Wall_x(x);
  83. break;
  84. default :
  85. break;
  86. }
  87. point.setX(x) ;
  88. point.setY(y);
  89. qDebug() <<x <<":" <<y;
  90. }
  91. int Widget::Xrandom() //产生随机数
  92. {
  93. int random_q;
  94. QTime time;
  95. time= QTime::currentTime();
  96. qsrand(time.msec()+time.second()*1000);
  97. random_q = qrand() % (this->width()-40);
  98. if(random_q < 20)
  99. random_q += 20;
  100. return random_q;
  101. }
  102. int Widget::Yrandom() //产生随机数
  103. {
  104. int random_q;
  105. QTime time;
  106. time= QTime::currentTime();
  107. qsrand(time.msec()+time.second()*1000);
  108. random_q = qrand() % (this->height()-40);
  109. if(random_q < 20)
  110. random_q += 20;
  111. return random_q;
  112. }
  113. void Widget::meet_s() //遇到月亮
  114. {
  115. if((point.x()-random_x < 20 && point.x()-random_x > -20)&& (point.y() - random_y < 20 &&point.y() - random_y > -20) )
  116. meet = true;
  117. if(!meet)
  118. {
  119. /* 豆豆 */
  120. QRectF target_Peas(random_x,random_y, 100, 100);
  121. QRectF source_Peas(0,0, 400,400);
  122. QPixmap pixmap_Peas(":/new/prefix1/peas3.jpg"); //此处使用自己添加的资源文件夹内的图片
  123. painter->drawPixmap(target_Peas, pixmap_Peas, source_Peas);
  124. }
  125. else
  126. {
  127. qDebug() <<"遇见";
  128. random_x = Xrandom();
  129. random_y = Yrandom();
  130. Score++;
  131. meet = false;
  132. }
  133. }
  134. void Widget::Direction() //控制人物改变方向
  135. {
  136. QRectF target(-10,-10, 40.0, 40.0);
  137. QRectF source(0.0, 0.0, 400.0, 400.0);
  138. QPixmap pixmap_right(":/new/prefix1/character_right.jpg"); //此处使用自己添加的资源文件夹内的图片
  139. QPixmap pixmap1_left(":/new/prefix1/character_left.jpg"); //人物向左移动是的图片
  140.  
  141. if(Qt::Key_Up == direction) //
  142. {
  143. painter->rotate(-90);
  144. painter->drawPixmap(target, pixmap_right, source);
  145. }
  146. else if(Qt::Key_Down == direction) //
  147. {
  148. painter->rotate(90);
  149. painter->drawPixmap(target, pixmap_right, source);
  150. }
  151. else if(Qt::Key_Left == direction) //
  152. {
  153. painter->drawPixmap(target, pixmap1_left, source);
  154. }
  155. else //
  156. {
  157. painter->drawPixmap(target, pixmap_right, source);
  158. }
  159. }
  160. void Widget::paintEvent(QPaintEvent *event)
  161. {
  162. painter = new QPainter(this);
  163. /* 画笔 */
  164. QPen pen (Qt::red,10);
  165. QPen pen1 (Qt::green,5);
  166. painter->setPen(pen1);
  167. /* 边框 */
  168. QRectF rectangle(0, 0,this->width(),this->width());
  169. QRectF rectangle1(10, 10, this->width()-20, this->height()-20);
  170. /* 背景 */
  171. QRectF target(0,0, this->width(), this->width());
  172. QRectF source(0,0, this->width(), this->width());
  173. QPixmap pixmap_background(":/new/prefix1/background.jpg");
  174. painter->drawPixmap(target, pixmap_background, source);
  175. painter->setRenderHint(QPainter::Antialiasing,true); //抗锯齿
  176.  
  177. /* 画边框 */
  178. painter->drawRect(rectangle);
  179. painter->drawRect(rectangle1);
  180. /* 得分 */
  181. Score_data = "得分:" + QString::number(Score);
  182. painter->drawText(0,0,100,100,Qt::AlignCenter,Score_data);
  183. painter->setPen(pen);
  184. meet_s(); //绘制月亮
  185. painter->translate(point.x()+10,point.y()+10); //移动画家
  186. Direction(); //画人物
  187. update(); //必须要刷新
  188. }
  189. Widget::~Widget()
  190. {
  191. delete ui;
  192. }
运行效果图:

原文链接:http://www.cnblogs.com/IntelligencePointer/p/11519704.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号