QT--吃月亮小游戏

简介:

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

代码:

1.widget.h文件:

#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QPaintEvent> //绘图事件
#include <QMouseEvent> //鼠标
#include <QPoint>
#include <QKeyEvent> //键盘
#include <QPainter>
#include <QList>
#include <QLineEdit> namespace Ui {
class Widget;
} class Widget : public QWidget
{
Q_OBJECT public:
explicit Widget(QWidget *parent = nullptr);
~Widget(); public:
int random_x; //保存月亮随机坐标
int random_y;
int direction; //保存键盘事件
int Score = ; //得分
QString Score_data; //保存得分 bool meet = false;
QPainter *painter;
QLineEdit *line; void Wall_x(int &);
void Wall_y(int &); //遇见墙壁
void meet_s(); //遇到月亮,重画月亮
int Xrandom(); //产生随机数
int Yrandom(); //产生随机数
void Direction(); //控制人物改变方向 void paintEvent(QPaintEvent *event); //绘图
void mousePressEvent(QMouseEvent *event); //鼠标点击
void mouseMoveEvent(QMouseEvent *event); //鼠标拖动
void keyPressEvent(QKeyEvent *event); //键盘事件
private:
QPoint point; private:
Ui::Widget *ui;
}; #endif // WIDGET_H

2.widget.cpp文件:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPainter> //绘图画家
#include <QTime>
#include <QMutableListIterator> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setMinimumSize(,); //窗口大小 point.setX(this->width()/); //初始化人物 在窗口中央
point.setY(this->width()/); random_x = Xrandom(); //初始化月亮
random_y = Yrandom(); } void Widget::mousePressEvent(QMouseEvent *event) //鼠标点击
{
qDebug() << event->pos() ;
point = event->pos();
update();
} void Widget:: mouseMoveEvent(QMouseEvent *event) //鼠标拖动
{
qDebug() <<event->pos();
point = event->pos();
update();
} void Widget::Wall_x(int &x) //遇见墙壁
{
if(x <= )
{
x += ; //遇见就弹回
Score -= ;
}
else if (x >= this->width()-)
{
x -= ;
Score -= ;
}
}
void Widget::Wall_y(int &y) //遇见墙壁
{
if(y <= )
{
y += ;
Score -= ;
}
else if (y >= this->height()-)
{
y -= ;
Score -= ;
}
}
void Widget::keyPressEvent(QKeyEvent *event) //键盘事件,控制人物移动
{
int x = point.x();
int y = point.y();
qDebug() << event->key() ;
direction = event->key();
switch(event->key())
{
case Qt::Key_Up: //上
qDebug() <<"上";
y -= ;
Wall_y(y);
break;
case Qt::Key_Down: //下
qDebug() <<"下";
y += ;
Wall_y(y);
break;
case Qt::Key_Left: //左
qDebug() <<"左";
x -= ;
Wall_x(x);
break;
case Qt::Key_Right: //右
qDebug() <<"右";
x += ;
Wall_x(x);
break; default :
break;
}
point.setX(x) ;
point.setY(y); qDebug() <<x <<":" <<y;
} int Widget::Xrandom() //产生随机数
{
int random_q;
QTime time;
time= QTime::currentTime();
qsrand(time.msec()+time.second()*); random_q = qrand() % (this->width()-);
if(random_q < )
random_q += ;
return random_q;
}
int Widget::Yrandom() //产生随机数
{
int random_q;
QTime time;
time= QTime::currentTime();
qsrand(time.msec()+time.second()*); random_q = qrand() % (this->height()-);
if(random_q < )
random_q += ;
return random_q;
} void Widget::meet_s() //遇到月亮
{ if((point.x()-random_x < && point.x()-random_x > -)&& (point.y() - random_y < &&point.y() - random_y > -) )
meet = true;
if(!meet)
{
/* 豆豆 */
QRectF target_Peas(random_x,random_y, , );
QRectF source_Peas(,, ,);
QPixmap pixmap_Peas(":/new/prefix1/peas3.jpg"); //此处使用自己添加的资源文件夹内的图片
painter->drawPixmap(target_Peas, pixmap_Peas, source_Peas);
}
else
{
qDebug() <<"遇见";
random_x = Xrandom();
random_y = Yrandom();
Score++;
meet = false;
}
} void Widget::Direction() //控制人物改变方向
{
QRectF target(-,-, 40.0, 40.0);
QRectF source(0.0, 0.0, 400.0, 400.0);
QPixmap pixmap_right(":/new/prefix1/character_right.jpg"); //此处使用自己添加的资源文件夹内的图片
QPixmap pixmap1_left(":/new/prefix1/character_left.jpg"); //人物向左移动是的图片 if(Qt::Key_Up == direction) //上
{
painter->rotate(-);
painter->drawPixmap(target, pixmap_right, source);
} else if(Qt::Key_Down == direction) //下
{
painter->rotate();
painter->drawPixmap(target, pixmap_right, source);
}
else if(Qt::Key_Left == direction) //左
{
painter->drawPixmap(target, pixmap1_left, source);
}
else //右
{
painter->drawPixmap(target, pixmap_right, source);
}
}
void Widget::paintEvent(QPaintEvent *event)
{
painter = new QPainter(this); /* 画笔 */
QPen pen (Qt::red,);
QPen pen1 (Qt::green,);
painter->setPen(pen1); /* 边框 */
QRectF rectangle(, ,this->width(),this->width());
QRectF rectangle1(, , this->width()-, this->height()-); /* 背景 */
QRectF target(,, this->width(), this->width());
QRectF source(,, this->width(), this->width());
QPixmap pixmap_background(":/new/prefix1/background.jpg");
painter->drawPixmap(target, pixmap_background, source); painter->setRenderHint(QPainter::Antialiasing,true); //抗锯齿 /* 画边框 */
painter->drawRect(rectangle);
painter->drawRect(rectangle1); /* 得分 */
Score_data = "得分:" + QString::number(Score);
painter->drawText(,,,,Qt::AlignCenter,Score_data);
painter->setPen(pen); meet_s(); //绘制月亮
painter->translate(point.x()+,point.y()+); //移动画家 Direction(); //画人物
update(); //必须要刷新 } Widget::~Widget()
{
delete ui;
}

3.运行效果图:

QT--吃月亮小游戏的更多相关文章

  1. html+css+js实现狼吃羊小游戏

    html+css+js实现狼吃羊小游戏 一.总结 一句话总结:给动的元素下标记,这里表现为将要活动的标签动态增加class,这是一种很好的思想. 1.如何实现棋子走动的时候简单精确定位? 用重构坐标系 ...

  2. Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述

    Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述 Overview 本章的主要的内容是贪吃蛇小游戏的分析和实现,关于实现的具体代码可以在,文章底部的github的链接中找到. 整个游戏通 ...

  3. 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...

  4. Qt 制作2048小游戏

    相信大家都玩过2048把,下面是我用qt写得2048小游戏. 2048.pro HEADERS += \ Widget.h SOURCES += \ Widget.cpp \ main.cpp QT ...

  5. C++吃金币小游戏

    上图: 游戏规则:按A,D键向左和向右移动小棍子,$表示金币,0表示炸弹,吃到金币+10分,吃到炸弹就GAME OVER. 大体思路和打字游戏相同,都是使用数组,refresh和run函数进行,做了一 ...

  6. Qt 贪吃蛇小游戏

    简单的实现了走和变大的样子,剩下的还在完善 贴代码 #include "mainwindow.h" #include "ui_mainwindow.h" #in ...

  7. 用C++、Qt实现的小游戏2048

    窗口布局与游戏截图: 实现思路: 1.使用二维数组模拟整个游戏网格,并将二维数组中每个数的大小用作游戏中每个网格中的数据. 2.将对游戏的数据及数据的操作(即玩家的操作对游戏数据的影响)作为一个类,游 ...

  8. python小游戏-pygame模块

    一.tkinter模块的GUI 基本上使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinter模块中我们需要的东西. 创建一个顶层窗口对象并用它来承载整个GUI应用. 在顶层窗口对象上 ...

  9. JAVA课程设计——“小羊吃蓝莓”小游戏

    JAVA课程设计--"小羊吃蓝莓"小游戏 1. 团队课程设计博客链接 http://www.cnblogs.com/HXY071/p/7061216.html 2. 个人负责模块或 ...

随机推荐

  1. Linux下基于Docker部署.Net Core web api项目

    Docker的好处我就不说啦,问问度娘就知道了

  2. Spring Data JPA 的一对多,一对多,多对多操作

    一对一的关联关系   需求:用户与角色的一对一的关联关系 用户:一方 角色:一方     创建 Users 实体 @Entity @Table(name = "t_users") ...

  3. Ubuntu18.04安装openCV4.1.2

    Ubuntu18.04下安装openCV4.1.2 注意: 在整个安装过程中,包括后期QT的使用中不要出现中文路径.会很坑的. 一.下载openCV4.1.2 可以再官网进行下载https://ope ...

  4. zabbix监控系统系列

    来自网站:http://www.361way.com/zabbix-summarize/3335.html 一.zabbix的特点 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能 ...

  5. Newman

    目录 简介 安装 使用 简介 Newman是为postman而生,专门用来运行postman编写好的脚本 使用Newman,你可以很方便的用命令行来执行postman collections Newm ...

  6. Linux服务器绑定多网卡IP

    需求:在1台Linux上绑定两个公网IP,实现扩展IP用于专用的服务 问题:添加了一个网卡上绑定1个弹性IP,主网卡绑定的公网ip可以正常访问,但是扩展网卡的公网ip无法访问. 原因:没有设置路由规则 ...

  7. 小胖求学系列之-文档生成利器(下)-smart-doc

    叮叮叮....一阵铃声响起,大家都陆续来到了课堂,看老师没来,小张和小胖又闲聊起来,小张问:怎么样,smart-doc好用吧.小胖笑着说:挺好用的,不过? 小张看卖关子,问到:不过什么,有什么新发现? ...

  8. struct socket结构体详解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://weiguozhihui.blog.51cto.com/3060615/15852 ...

  9. linus 命令

    系统信息 arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) h ...

  10. 在 Spring Boot 项目中使用 activiti

    新建springBoot项目时勾选activiti,或者在已建立的springBoot项目添加以下依赖: <dependency> <groupId>org.activiti& ...