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. luogu P3830 [SHOI2012]随机树

    输入格式 输入仅有一行,包含两个正整数 q, n,分别表示问题编号以及叶结点的个数. 输出格式 输出仅有一行,包含一个实数 d,四舍五入精确到小数点后 6 位.如果 q = 1,则 d 表示叶结点平均 ...

  2. git 使用详解(9)-- 分支的新建与合并 git branch -d、merge、 --merged/--no-merged/-v

    现在让我们来看一个简单的分支与合并的例子,实际工作中大体也会用到这样的工作流程: 开发某个网站. 为实现某个新的需求,创建一个分支. 在这个分支上开展工作. 假设此时,你突然接到一个电话说有个很严重的 ...

  3. GlusterFS 存储

    GlusterFS简介: 互联网四大开源分布式文件系统分别是:MooseFS.CEPH.Lustre.GusterFS. GluterFS最早由Gluster公司开发,其目的是开发一个能为客户提供全局 ...

  4. python学习-excel读取

    # 第三方库 openpyxl # install 安装# pip install openpyxl # 引入第三方库# excel操作的流程:# 打开excel,进入工作薄 workbook# 选择 ...

  5. c++ const问题小记

    int* a = new int; const int* b = a; const int* a = new int; int* b = (int*)a; const int m = 10; int ...

  6. 如何在PHP框架里把Traits使用起来

    我们都知道PHP只能使用单一继承,这意味着一个类只能从另一个类继承. 例如,您可能想从几个不同的类继承方法以防止代码重复.  PHP 5.4中添加了新的语言特性Traits,而且它在Laravel框架 ...

  7. hdu 1052 Tian Ji -- The Horse Racing (田忌赛马)

    Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  8. HTML连载56-网易注册界面实战之全部代码

    一.今天完成了网易邮箱注册界面的全部编写,编写一个小小的网页就需要这么多时间来进行设计.测量.排版.编写.测试,才能进行使用,同时编写这个网页复习了几乎前面的所有内容,最后来一个汇总就可以了. < ...

  9. sql手工注入1

    手工注入常规思路 1.判断是否存在注入,注入是字符型还是数字型 2.猜解 SQL 查询语句中的字段数 3.确定显示的字段顺序 4.获取当前数据库 5.获取数据库中的表 6.获取表中的字段名 7.查询到 ...

  10. 通过谷歌浏览器从官网下载Android Studio

    谷歌访问助手安装教程参考:https://www.cnblogs.com/waiwai14/p/11697371.html 谷歌访问助手下载地址:https://pan.baidu.com/s/1YH ...