QT--吃月亮小游戏
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--吃月亮小游戏的更多相关文章
- html+css+js实现狼吃羊小游戏
html+css+js实现狼吃羊小游戏 一.总结 一句话总结:给动的元素下标记,这里表现为将要活动的标签动态增加class,这是一种很好的思想. 1.如何实现棋子走动的时候简单精确定位? 用重构坐标系 ...
- Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述
Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述 Overview 本章的主要的内容是贪吃蛇小游戏的分析和实现,关于实现的具体代码可以在,文章底部的github的链接中找到. 整个游戏通 ...
- 【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接 ...
- Qt 制作2048小游戏
相信大家都玩过2048把,下面是我用qt写得2048小游戏. 2048.pro HEADERS += \ Widget.h SOURCES += \ Widget.cpp \ main.cpp QT ...
- C++吃金币小游戏
上图: 游戏规则:按A,D键向左和向右移动小棍子,$表示金币,0表示炸弹,吃到金币+10分,吃到炸弹就GAME OVER. 大体思路和打字游戏相同,都是使用数组,refresh和run函数进行,做了一 ...
- Qt 贪吃蛇小游戏
简单的实现了走和变大的样子,剩下的还在完善 贴代码 #include "mainwindow.h" #include "ui_mainwindow.h" #in ...
- 用C++、Qt实现的小游戏2048
窗口布局与游戏截图: 实现思路: 1.使用二维数组模拟整个游戏网格,并将二维数组中每个数的大小用作游戏中每个网格中的数据. 2.将对游戏的数据及数据的操作(即玩家的操作对游戏数据的影响)作为一个类,游 ...
- python小游戏-pygame模块
一.tkinter模块的GUI 基本上使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinter模块中我们需要的东西. 创建一个顶层窗口对象并用它来承载整个GUI应用. 在顶层窗口对象上 ...
- JAVA课程设计——“小羊吃蓝莓”小游戏
JAVA课程设计--"小羊吃蓝莓"小游戏 1. 团队课程设计博客链接 http://www.cnblogs.com/HXY071/p/7061216.html 2. 个人负责模块或 ...
随机推荐
- 使用ASP.NET Core 3.x 构建 RESTful API - 3.3 状态码、错误/故障、ProblemDetails
HTTP状态码 HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码.HTTP状态码一 ...
- ASP.NET Core 选项模式源码学习Options IOptions(二)
前言 上一篇文章介绍IOptions的注册,本章我们继续往下看 IOptions IOptions是一个接口里面只有一个Values属性,该接口通过OptionsManager实现 public in ...
- react-native修改xcode项目名
目录 1. 选中旧工程名,改为新的工程名 2. 依次选择黄色文件夹,修改名字,千万不要在Xcode外修改!!! 3. 点击Find,点击Find and Replace in Project... 4 ...
- HDU-3727 Jewel
Jimmy wants to make a special necklace for his girlfriend. He bought many beads with various sizes, ...
- Linux(CentOS)安装SQL Server
1.下载Microsoft SQL Server Red Hat 存储库配置文件 curl -o /etc/yum.repos.d/mssql-server.repo https://packages ...
- Orleans 初接触
简介 这篇随笔主要记录了自己学习Orleans的经过和理解,在学习过程中会一直更新,思路和理解可能有些偏颇,如果有幸有大佬看到这篇文章,希望能给予批评指正. 导航 (一) 入门例子 (二) 测试用例 ...
- 自建邮件服务器域名解析设置(A与MX记录)
自建邮件服务器域名解析设置(A与MX记录) 前言 如果域名没有做解析,只能用于内网收发邮件.要想实现与外网邮箱的收发,需要做域名解析.是在"域名解析后台"进行设置(域名提供商提供& ...
- 《Java基础知识》Java访问修饰符(访问控制符)
Java 通过修饰符来控制类.属性和方法的访问权限和其他功能,通常放在语句的最前端.例如: public class className { // body of class } private bo ...
- Base64编码原理及应用
最近在做一个H5上传图片并压缩的项目,其过程主要是先将图片上传通过readAsDataURL获取上传图片base64编码,然后根据高宽比将图片画到canvas上实现压缩,在通过toDataURL获取压 ...
- 基于 TrueLicense 的项目证书验证
一.简述 开发的软件产品在交付使用的时候,往往有一段时间的试用期,这期间我们不希望自己的代码被客户二次拷贝,这个时候 license 就派上用场了,license 的功能包括设定有效期.绑定 ip.绑 ...