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. 个人负责模块或 ...
随机推荐
- mac eclipse Android开发环境搭建
http://www.cnblogs.com/macro-cheng/archive/2011/09/30/android-001.html
- SPOJ- Distinct Substrings(后缀数组&后缀自动机)
Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...
- TypeScript - 类型声明、枚举、函数、接口
目录 可定义的类型 类型声明 枚举 函数 接口 可定义的类型 以下所写的并不代表typescript的数据类型,而是在使用过程中可以用作定义的类型 number : 数值类型: string ...
- Ceph 集群搭建
1.Ceph部署 1.1 Ceph 安装前准备,环境与拓扑图如下: 主机名 外网IP 内网IP 安装组件 磁盘块 c720181 172.22.69.84 192.168.20.181 ceph-de ...
- nessus安装、msfconsole辅助模块使用(网安全实训第三天)
本期内容:nessus安装.msfconsole辅助模块使用.后渗透攻击 1. nessus安装 2.msfconsole辅助模块使用 3.后渗透攻击 1. nessus安装 (1)下载nessus ...
- Day 07 字符串内置方法和爬虫基础3
目录 异常处理 LeetCode使用之两数之和(示例) 字符串内置方法 爬虫基础3 selenium基本使用 selenium模拟百度登录 selenium爬取京东商品信息 异常处理 try: pri ...
- 【JS】285- 拆解 JavaScript 中的异步模式
JavaScript 中有很多种异步编程的方式.callback.promise.generator.async await 甚至 RxJS.我最初接触不同的异步模式时,曾想当然的觉得 promise ...
- 常见的web安全问题总结
we安全对于web前端从事人员也是一个特别重要的一个知识点,也是面试的时候,面试官经常问的安全前端问题.掌握一些web安全知识,提供安全防范意识,今天就会从几个方面说起前端web攻击和防御的常用手段 ...
- Django模型层—ORM
目录 一.模型层(models) 1-1. 常用的字段类型 1-2. 字段参数 1-3. 自定义char字段 1-4. 外键关系 二.Django中测试脚本的使用 三.单表操作 3-1. 添加记录 3 ...
- 详解EMC测试国家标准GB/T 17626
电波暗室,用于模拟开阔场,同时用于辐射无线电骚扰(EMI)和辐射敏感度(EMS)测量的密闭屏蔽室. 来源:http://gememc.com/upload/201712/201712010930227 ...