当前位置: 首页 > news >正文

网络规划设计师通过率多少湖北短视频seo营销

网络规划设计师通过率多少,湖北短视频seo营销,惠州酒店网站建设,ps图做ppt模板下载网站有哪些内容最近刷抖音经常看到别人使用类似chatGPT的al工具实现这个贪吃蛇游戏,正好我之前也写过,那么今天看看怎么去实现这个简单的游戏 我这边使用的是C的QT框架,当然用哪些框架都可以,主要是逻辑思路 1.生成画布,开始是一些…

最近刷抖音经常看到别人使用类似chatGPT的al工具实现这个贪吃蛇游戏,正好我之前也写过,那么今天看看怎么去实现这个简单的游戏

我这边使用的是C++的QT框架,当然用哪些框架都可以,主要是逻辑思路

1.生成画布,开始是一些框的配置

// 构造函数,初始化 Widget 类
Widget::Widget(QWidget *parent): QWidget(parent) // 调用 QWidget 的构造函数来初始化父类, ui(new Ui::Widget) // 创建 Widget 类的私有成员 ui,用于用户界面
{// 在用户界面上设置布局ui->setupUi(this);// 创建一个 qiu 对象并将其赋给 yuan 指针this->yuan = new qiu(this);// 创建一个定时器对象,并设置其间隔为 100 毫秒time->setInterval(100);// 设置窗口大小为 600x368 像素this->setFixedSize(QSize(600, 368));// 设置窗口标题为 "贪吃蛇"this->setWindowTitle("贪吃蛇");
}

还需要画这个框的背景,代码如下

QPainter huajia(this);  // 创建一个 QPainter 对象 huajia,并将其绑定到当前窗口或绘图设备
QPixmap p1 = QPixmap(":/C:/Users/Administrator/Pictures/tp2.png");  // 创建一个 QPixmap 对象 p1,加载指定路径下的图片// 使用 QPainter 绘制图片到指定区域
// 参数解释: (0, 0) 是绘制的起始位置,this->width() 是绘制的宽度,this->height() 是绘制的高度,p1 是要绘制的图片
huajia.drawPixmap(0, 0, this->width(), this->height(), p1);

47ebe6630c42442dbfe5d3d2353e8824.png

可能不是那么美观,主要是实现功能,之后的话都可以改良

 2.贪吃蛇主要还是蛇,蛇的话我是使用一个QRectF链表来表示蛇

为什么使用链表呢,因为我的蛇移动是删除最后一个元素新增为第一个元素,而链表本身比较适合元素的移动,可以插入第一个,删除最后一个元素,当我删除一个元素后后面的元素会扑上来,实现动态的蛇的移动

 QWidget头文件如下

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTimer>
#include <QRect>
#include "qiu.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECT// 声明一个枚举类型,用于表示蛇的移动方向enum fangxiang { shang, xia, zuo, you, ting, kai };public:// 构造函数,可以接受一个父窗口对象作为参数Widget(QWidget *parent = nullptr);// 析构函数~Widget();// 更新蛇的位置void gengxin();// 保存蛇的各个部分的矩形区域QList<QRectF> she;// 当前蛇的移动方向fangxiang zhujue = shang;// 指向 qiu 对象的指针qiu* yuan;// 键盘事件处理函数,用于捕捉键盘输入void keyPressEvent(QKeyEvent *event);// 绘制事件处理函数,用于绘制蛇和其他图形void paintEvent(QPaintEvent *event);// 向上移动蛇的头部void addshang();// 向下移动蛇的头部void addxia();// 向左移动蛇的头部void addzuo();// 向右移动蛇的头部void addyou();// 停止蛇的移动void tingzhi();// 开始蛇的移动void kaishi();// 保存小球的矩形区域QRect xiaoqiu;public slots:
private:Ui::Widget *ui;
};#endif // WIDGET_H

如上所示,蛇的移动是一个定时器,使用定时器进行绘画蛇这个数组,定时器每次到对应的时间会首先增加一个新元素到蛇前面,将最后一个元素上升,如图

d5e55f937d734f8a89a4938236d73718.png

使用绘画室事件画蛇,画蛇的话只需要在这个框内蛇的坐标,要么是左上角加上宽高,或者左上角坐标,右下角坐标等

应为我这边使用的蛇的身躯是一些小正方形组成的,所以可以直接使用左上角坐标加上宽高为20
//使用画家对象绘画蛇的方块
huajia.drawPixmap(yuan->x,yuan->y,20,20,yuan->p);

3.定时器,定时器主要的作用是控制蛇的移动,主要方式为蛇的数组进行删除最后一个元素,新增一个元素到首部,只要定时循环,那么就会呈现蛇的移动

新增槽函数

// 使用 Qt 的信号与槽机制,在定时器时间间隔内触发 gengxin 函数
connect(time, &QTimer::timeout, this, [=]() {this->gengxin();
});

槽函数内部为蛇的枚举,我这边,上下左右等, 

void Widget::gengxin() {// 根据当前的蛇的移动方向执行相应的移动函数switch (zhujue) {case shang:addshang();break;case xia:addxia();break;case zuo:addzuo();break;case you:addyou();break;case ting:// 如果蛇的状态是 "ting",则不进行移动break;case kai:// 如果蛇的状态是 "kai",则不进行移动break;}// 请求重新绘制界面,以更新蛇的位置update();// 移除蛇的尾部,相当于模拟蛇在前进时的效果she.removeLast();
}

4.设置键盘事件,我这边使用的是键盘右边的那四个方向,代码如下

void Widget::keyPressEvent(QKeyEvent *event) {// 响应用户的键盘按键事件switch (event->key()) {case Qt::Key_Up:// 如果用户按下向上箭头键,且当前蛇的方向不是向下,则将蛇的方向设置为向上if (zhujue != xia) {zhujue = shang;}break;case Qt::Key_Down:// 如果用户按下向下箭头键,且当前蛇的方向不是向上,则将蛇的方向设置为向下if (zhujue != shang) {zhujue = xia;}break;case Qt::Key_Left:// 如果用户按下向左箭头键,且当前蛇的方向不是向右,则将蛇的方向设置为向左if (zhujue != you) {zhujue = zuo;}break;case Qt::Key_Right:// 如果用户按下向右箭头键,且当前蛇的方向不是向左,则将蛇的方向设置为向右if (zhujue != zuo) {zhujue = you;}break;case Qt::Key_Space:// 如果用户按下空格键,切换蛇的状态为 "ting"(停止)或 "kai"(开始)if (zhujue == ting) {zhujue = kai;time->start(); // 启动定时器,继续游戏}else {time->stop(); // 停止定时器,暂停游戏zhujue = ting; // 将蛇的状态设置为 "ting"(停止)}break;default:break;}
}

这样的话比如我点一下上,zhujue这个值就会一直会朝向对于的方向,如下

513a9fa0f56a4ce79be65d11d1f1a26c.png

移动一下 

63c4518284d04b88a6017d0ad099be8a.png

停是应为我在键盘事件中设置了如果为空格那么 

 case Qt::Key_Space:// 如果用户按下空格键,切换蛇的状态为 "ting"(停止)或 "kai"(开始)if (zhujue == ting) {zhujue = kai;time->start(); // 启动定时器,继续游戏}else {time->stop(); // 停止定时器,暂停游戏zhujue = ting; // 将蛇的状态设置为 "ting"(停止)}break;

反之本来就是停止就会继续

5.最后是怎么根据我现在的方向移动蛇呢

比如我现在zhujue=上方,那么会一直执行

void Widget::gengxin(){switch (zhujue) {// 按下上键那么会一直执行case shang:addshang();break;
}

就会一直执行addshang()这个函数,那么

void Widget::addshang()
{// 定义两个 QPointF 类型的变量,用于存储矩形的左上角和右下角坐标QPointF zuoshang;  // 左上角坐标QPointF youxia;    // 右下角坐标// 检查蛇头是否超出窗口上边界if (she[0].y() - 20 <= 0) {// 如果蛇头超出上边界,将左上角坐标设置为当前位置的 x 坐标和窗口的高度 - 20zuoshang = QPointF(she[0].x(), this->height() - 20);// 右下角坐标设置为左上角坐标的 x 坐标 + 20 和窗口的高度youxia = QPointF(she[0].x() + 20, this->height());}else {// 如果蛇头未超出上边界,将左上角坐标设置为当前位置的 x 和 y 坐标,但 y 坐标减去 20zuoshang = QPointF(she[0].x(), she[0].y() - 20);// 右下角坐标设置为蛇头矩形的右上角坐标youxia = QPointF(she[0].topRight());}// 在蛇的头部插入一个新的矩形,使用左上角和右下角坐标创建矩形she.insert(0, QRectF(zuoshang, youxia));
}

这段代码是当向上移动时,那么对于蛇的每一个元素会将坐上坐标的x减去20,实现蛇的移动,如果出现she[0].y()的距离快到边框时,那么会重置到下面,详细代码如下

void Widget::addshang()
{// 定义左上角和右下角的 QPointF 类型变量,用于表示新矩形的坐标QPointF zuoshang;  // 左上角坐标QPointF youxia;    // 右下角坐标// 检查蛇头是否超出窗口的上边界if (she[0].y() - 20 <= 0) {// 如果蛇头超出上边界,将左上角坐标设置为蛇头的 x 坐标和窗口高度减去 20zuoshang = QPointF(she[0].x(), this->height() - 20);// 右下角坐标设置为左上角坐标的 x 坐标加上 20 和窗口的高度youxia = QPointF(she[0].x() + 20, this->height());} else {// 如果蛇头未超出上边界,将左上角坐标设置为蛇头的 x 坐标和 y 坐标减去 20zuoshang = QPointF(she[0].x(), she[0].y() - 20);// 右下角坐标设置为蛇头矩形的右上角坐标youxia = QPointF(she[0].topRight());}// 在蛇的头部插入一个新的矩形,使用左上角和右下角坐标创建矩形she.insert(0, QRectF(zuoshang, youxia));
}void Widget::addxia()
{// 定义左上角和右下角的 QPointF 类型变量,用于表示新矩形的坐标QPointF zuoshang;  // 左上角坐标QPointF youxia;    // 右下角坐标// 检查蛇头是否超出窗口的下边界if (she[0].y() + 40 > this->height()) {// 如果蛇头超出下边界,将左上角坐标设置为蛇头的 x 坐标和 0zuoshang = QPointF(she[0].x(), 0);} else {// 如果蛇头未超出下边界,将左上角坐标设置为蛇头底部左侧的坐标zuoshang = she[0].bottomLeft();}// 右下角坐标设置为左上角坐标加上 (20, 20) 的偏移youxia = zuoshang + QPointF(20, 20);// 在蛇的头部插入一个新的矩形,使用左上角和右下角坐标创建矩形she.insert(0, QRectF(zuoshang, youxia));
}void Widget::addzuo()
{// 定义左上角和右下角的 QPointF 类型变量,用于表示新矩形的坐标QPointF zuoshang;  // 左上角坐标QPointF youxia;    // 右下角坐标// 检查蛇头是否超出窗口的左边界if (she[0].x() - 20 < 0) {// 如果蛇头超出左边界,将左上角坐标设置为窗口宽度减去 20 和蛇头的 y 坐标zuoshang = QPointF(this->width() - 20, she[0].y());} else {// 如果蛇头未超出左边界,将左上角坐标设置为蛇头左上角坐标减去 (20, 0)zuoshang = she[0].topLeft() - QPointF(20, 0);}// 右下角坐标设置为左上角坐标加上 (20, 20) 的偏移youxia = zuoshang + QPointF(20, 20);// 在蛇的头部插入一个新的矩形,使用左上角和右下角坐标创建矩形she.insert(0, QRectF(zuoshang, youxia));
}void Widget::addyou()
{// 定义左上角和右下角的 QPointF 类型变量,用于表示新矩形的坐标QPointF zuoshang;  // 左上角坐标QPointF youxia;    // 右下角坐标// 检查蛇头是否超出窗口的右边界if (she[0].x() + 20 > this->width()) {// 如果蛇头超出右边界,将左上角坐标设置为 0 和蛇头的 y 坐标zuoshang = QPointF(0, she[0].y());} else {// 如果蛇头未超出右边界,将左上角坐标设置为蛇头右上角坐标zuoshang = QPointF(she[0].topRight());}// 右下角坐标设置为左上角坐标加上 (20, 20) 的偏移youxia = zuoshang + QPointF(20, 20);// 在蛇的头部插入一个新的矩形,使用左上角和右下角坐标创建矩形she.insert(0, QRectF(zuoshang, youxia));
}

这样的话就实现了蛇的移动,但是蛇需要加分,所以需要小球

6.创建小球类,如下

头文件如下

#ifndef QIU_H                // 防止头文件重复包含的预处理指令
#define QIU_H#include<QPixmap>           // 包含 QPixmap 类的头文件,用于处理图片
#include <QObject>          // 包含 QObject 类的头文件,用于定义对象
#include<QRect>             // 包含 QRect 类的头文件,用于定义矩形区域class qiu : public QObject  // 定义一个名为 qiu 的类,继承自 QObject
{Q_OBJECT               // 使用 Qt 的宏,标记这个类为 Qt 对象public:explicit qiu(QObject *parent = nullptr); // 构造函数,可以接受一个父对象指针QPixmap p;             // 用于存储蛇的图片int x;                // 蛇的 x 坐标int y;                // 蛇的 y 坐标QRect kuang;           // 蛇的判定框,用于碰撞检测void gengxin();       // 用于更新蛇的移动和坐标位置的函数signals:                  // Qt 信号声明部分};#endif // QIU_H               // 结束头文件的条件编译指令

源文件cpp为

#include "qiu.h"         // 包含自定义头文件 "qiu.h"
#include <ctime>          // 包含时间头文件,用于获取随机种子qiu::qiu(QObject *parent) : QObject(parent)
{p.load(":/C:/Users/Administrator/Pictures/tp4.png");  // 加载图片文件srand((unsigned int)time(NULL));  // 使用当前时间作为随机数种子this->x = rand() % (600 - 20);    // 生成 x 坐标的随机值this->y = rand() % (368 - 20);    // 生成 y 坐标的随机值this->kuang.setWidth(20);         // 设置矩形宽度为 20this->kuang.setHeight(20);        // 设置矩形高度为 20kuang.moveTo(x, y);               // 移动矩形到指定的 (x, y) 坐标
}void qiu::gengxin()
{this->x = rand() % (600 - 20);    // 生成新的 x 坐标的随机值this->y = rand() % (368 - 20);    // 生成新的 y 坐标的随机值kuang.moveTo(x, y);               // 移动矩形到新的 (x, y) 坐标
}

球的属性为:x坐标,y坐标,判定框,背景图片

球的行为为:瞬移,在被蛇吃掉时瞬移

7.最后是判定如下,在定时检查遍历蛇链表是否和小球的判定框相撞

if(she[0].intersects(yuan->kuang)){//判断蛇头元素是否和小球的框碰撞,碰撞执行gengxin()函数yuan->gengxin();
}

25be32b166fc41c18010822c3b5d3cf5.png

碰撞之后执行函数

void qiu::gengxin()
{this->x=rand()%(600-20); //随机框内x点this->y=rand()%(368-20); //随机框内y点kuang.moveTo(x,y); //随机移动
}

18193f1262814f7288e66b43e24e1ba9.png

随机刷新到一个地方

这样就简单的实现了这个贪吃蛇的游戏

http://www.rdtb.cn/news/23024.html

相关文章:

  • 用 可以做网站软件吗商品seo关键词优化
  • 玉树电子商务网站建设私域运营软件
  • 重庆网站建设设计b站网站推广mmm
  • 微信公众号网站开发语言哪里有网络推广
  • 网站建设方案意见石家庄疫情
  • 咖啡网站模板新网站百度seo如何做
  • 泰国做网站赌博要判几年河南郑州网站推广优化
  • 盐城高端网站制作公司武汉关键词排名工具
  • 武汉建设网官网首页广州seo网络营销培训
  • 微信公众号制作网站网站首页的优化
  • 广州网站系统开发电工培训
  • 手机下载视频网站模板下载百度搜索广告投放
  • 微网站在哪制作的响应式网站模板的应用
  • 高新区网站建设 意义上海百度seo优化
  • 专业电商网站建设东莞seo优化方案
  • 网站制作哪个好薇淘宝权重查询
  • 北京外贸网站开发谷歌搜索引擎官网
  • 做seo网站不用域名软文发布平台媒体
  • 国内做网站建设知名的公司白酒最有效的推广方式
  • 做网站没资源网站竞价推广
  • 湖南省住房和城乡建设网站seo基础知识
  • 单位网站建设的必要性荥阳网络推广公司
  • 公司装修效果图办公室手机seo排名软件
  • 长沙内容营销公司上海野猪seo
  • 哈尔滨住房和城乡建设信息网官网百度seo优化工具
  • 哪些企业网站做的不错seo外贸网站制作
  • 电商型企业网站建设百度贴吧官网首页
  • 音乐网站开发技术网络seo是什么
  • php 网站 教程企业网站建设cms
  • 成都网站建设公司哪家好外贸平台自建站