基于QT实现贪吃蛇

0.项目展示 

 

1.游戏大厅界面搭建

1.1 效果展示

1.2 背景添加

  •  通过重写paintEvent事件来绘画界面

部分窗口大小,标题,图标的优化 

1.3 开始按钮 

  • 使用CSS机制,添加样式,去掉边框

1.4 跳转游戏界面 

1.5 问题:如何实现2个界面直接的跳转

  •  创建一个新的类,作为新界面
  • 使用信号与槽机制进行跳转,其中类名.show表示展示界面

1.6 问题:为什么包含不了QSound头文件

  • 在项目源文件中,添加multimedia模块,之后才能继续添加QSound头文件

 2. 渲染游戏关卡界面

2.1 返回按钮 

2.2 三种模式按钮 && 历史查询

2.3 跳转游戏界面

 2.4 渲染游戏房间

3.游戏逻辑 

3.1 相关变量设计

  • 将贪吃蛇看成一个一个小矩形连接而成的链表(QList),链表中存储的是矩形(QRectF) 

3.2 moveUP

void GameRoom::moveUp()
{QPointF leftTop;//左上角QPointF rightBottom;// 右下角坐标QRectF snakeNode = snakeList.front();//头节点int headX = snakeNode.x();int headY = snakeNode.y();//考虑穿墙问题if(headY < 0){//穿墙了leftTop = QPointF(headX,this->height()-kSnakeNodeHeight);}else{leftTop = QPointF(headX,headY-kSnakeNodeHeight);}rightBottom = leftTop + QPointF(kSnakeNodeWidth,kSnakeNodeHeight);snakeList.push_front(QRectF(leftTop,rightBottom));
}
  • 一个矩形(QRectF)由左上角右下角2个点(QPointF)构成 
  • 这里穿墙的处理方法是从一侧穿过,另一侧穿出

3.3 moveDown

3.4 moveLeft

3.5 moveRight 

3.6 checkFail 

3.7 渲染贪吃蛇 && 食物

 3.8 初始化贪吃蛇

GameRoom::GameRoom(QWidget *parent) : QWidget(parent)
{this->setWindowIcon(QIcon(":res/ico.png"));this->setWindowTitle("游戏房间");//初始化snakeList.push_back(QRectF(this->width()*0.9,this->height()*0.5,\kSnakeNodeWidth,kSnakeNodeHeight));moveUp();moveUp();//创建食物creatNewFood();timer = new QTimer(this);connect(timer,&QTimer::timeout,this,[=](){int cnt = 1;if(snakeList.front().intersects(foodRect)){creatNewFood();cnt++;}//蛇吃豆子,豆子占一个,移动占一格,一共走2格while(cnt--){switch (moveDirect) {case SnackDirect::UP:moveUp();break;case SnackDirect::DOWN:moveDown();break;case SnackDirect::LEFT:moveLeft();break;case SnackDirect::RIGHT:moveRight();break;}}snakeList.pop_back();//删除尾部upDate();});
}
  •  蛇吃豆子,豆子占一个,移动占一格,一共走2格
  • QRectF中的intersects方法表示判断2个矩形是否重叠

3.9 游戏开始 && 暂停

 

3.10 方向控制 

// 方向控制QPushButton* up = new QPushButton(this);QPushButton* down = new QPushButton(this);QPushButton* left = new QPushButton(this);QPushButton* right = new QPushButton(this);up->move(865,395);down->move(865,485);left->move(800,440);right->move(930,440);up->setText("↑");down->setText("↓");left->setText("←");right->setText("→");//去掉边框up->setStyleSheet("QPushButton{border:0px;}");down->setStyleSheet("QPushButton{border:0px;}");left->setStyleSheet("QPushButton{border:0px;}");right->setStyleSheet("QPushButton{border:0px;}");QFont ft("宋体",30);up->setFont(ft);down->setFont(ft);left->setFont(ft);right->setFont(ft);connect(up,&QPushButton::clicked,this,[=](){if(moveDirect!=SnackDirect::DOWN){moveDirect = SnackDirect::UP;}});connect(down,&QPushButton::clicked,this,[=](){if(moveDirect!=SnackDirect::UP){moveDirect = SnackDirect::DOWN;}});connect(right,&QPushButton::clicked,this,[=](){if(moveDirect!=SnackDirect::LEFT){moveDirect = SnackDirect::RIGHT;}});connect(left,&QPushButton::clicked,this,[=](){if(moveDirect!=SnackDirect::RIGHT){moveDirect = SnackDirect::LEFT;}});

3.11 游戏退出

  • 使用了QMessageBox盒子 

3.12 渲染积分

  • 可变参数传参

3.13  渲染游戏结束

3.14 实现3种游戏模式

 

3.15 历史战绩

connect(history_button,&QPushButton::clicked,this,[=](){QWidget* widget = new QWidget;widget->setWindowTitle("历史战绩");widget->setFixedSize(500,300);QTextEdit* edit = new QTextEdit(widget);edit->setFont(font);edit->setFixedSize(500,300);QFile file("C:/Users/46285/Desktop/Greedy_Snake/Snake/1.txt");file.open(QIODevice::ReadOnly);QTextStream in(&file);//文本流int data = in.readLine().toInt();//toInt将字符转换成整数edit->append("得分:"+QString::number(data));widget->show();});

4.优化

该项目还有很多需要优化的地方,但我时间有限,暂不优化

 4.1 退出优化

  • 还有一个小bug,记得设置每个窗口的大小 

5.完整项目链接 

GitHub - 1LYC/projects: 一些实战项目

6.项目面经 

6.1 请简单介绍一下你的项目

  •  开发环境是windows下qt creater的环境

  • 项目所使用的技术有,QList链表,QTimer定时器,qrand()产生随机数,update函数,QFile文件操作,QMessageBox消息盒子等

6.2 项目实现的功能

  • 实现的功能有,游戏开始界面,游戏关卡选择界面,游戏房间界面,
  • 完成了贪吃蛇的主逻辑:上下左右,吃食物,增加分数,以及查看历史界面的逻辑

6.3 从项目中学习到了什么

  • 学习到了在qt中如何使用各种控件属性,搭建一个简单的小游戏,
  • 理解到了游戏搭建的过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat 预览变更sql

需求 用了Flyway&#xff08;数据库迁移工具&#xff09;后&#xff0c;需要记录变更sql&#xff0c;所以要知道变更sql。 查看方式 Navicat提供了预览变更sql功能&#xff0c;右击表---->设计表&#xff0c;比如修改字段后&#xff0c;点击SQL预览标签页&#xff0c; 顺…

实时数据开发 | 一文理解Flink窗口机制

窗口操作在流处理和批处理之间起到了桥梁的作用。 Flink引擎本质上是流式引擎&#xff0c;认为批处理是流处理的一个特例。因此&#xff0c;通过窗口将流数据划分为有限大小的集合&#xff0c;使得在这些有界的数据集上可以进行批处理风格的计算。 通过配置窗口的参数&#xf…

数据结构——用数组实现栈和队列

目录 用数组实现栈和队列 一、数组实现栈 1.stack类 2.测试 二、数组实现队列 1.Queue类 2.测试 查询——数组&#xff1a;数组在内存中是连续空间 增删改——链表&#xff1a;链表的增删改处理更方便一些 满足数据先进后出的特点的就是栈&#xff0c;先进先出就是队列…

【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测

简介&#xff1a;介绍 TM-16多线激光雷达 在8210A载板&#xff0c;TX2核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX2里已经安装了ROS版本&#xff1a;Melodic。 大家好&#xff0c;…

预告|ROS中超好用固定翼仿真开源平台即将上线!

迅翼计划于年底推出基于ROS环境的固定翼上层仿真开发平台。该平台将采用PX4与Gazebo架构&#xff0c;充分融合ROS、PX4和Gazebo三大生态系统&#xff0c;致力于打造最简便、易用的固定翼上层算法仿真平台。 无论您是初学者&#xff0c;还是正在寻找适合的仿真平台进行算法验证&…

什么是 SQL 注入

目录 什么是 SQL 注入&#xff1f; SQL 注入的基本原理 如何发生 SQL 注入&#xff1f; SQL 注入的工作原理 SQL 注入的危害 常见的 SQL 注入攻击场景 什么是 SQL 注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是一种常见的安全漏洞&#xff0c;攻击…

染色体微阵列(CMA)技术

1. 染色体微阵列&#xff08;CMA&#xff09;简介 染色体是细胞核中载有遗传信息的物质&#xff0c;正常人体细胞具有23对染色体&#xff0c;包括22对常染色体和1对性染色体。染色体携带众多基因&#xff0c;决定着细胞功能及个体的发育。染色体数目增多、减少或局部发生微缺失…

安装QT6.8(MSVC MinGW)+QT webengine+QT5.15.2

本篇主要针对只使用过QT5的qmake&#xff0c;没有用过MSVC&#xff0c;VS的老同学。 建议一部分一部分安装&#xff0c;全部勾选安装遇到问题会中断&#xff0c;前功尽弃。 我自己需要的是QT5&#xff0c;编出的软件用在公司设备上。 QT6&#xff1a;建议也安装学习&#xf…

【我在CSDN成长】我的五周年创作纪念日

感叹 五年的时光匆匆而过&#xff0c; 像一阵风&#xff0c;拂过岁月的湖面&#xff0c; 泛起层层涟漪&#xff0c;又悄然离去。 曾经的欢笑与泪水&#xff0c; 那些奋斗的日夜&#xff0c; 如同电影般在脑海中放映&#xff0c; 却已成为遥远的回忆。 五年&#xff0c;说长不长…

使用 Docker Compose 来编排部署LMTNR项目

使用 Docker Compose 来部署一个包含 Linux、MySQL、Tomcat、Nginx 和 Redis 的完整项目的例子。假设我们要部署一个简单的 Java Web 应用&#xff0c;并且使用 Nginx 作为反向代理服务器。 项目目录结构 首先需要确保 Docker 和docker-compose已经安装并正在运行。docker --v…

如何利用ChatGPT加速开发与学习:以BPMN编辑器为例

在现代开发中&#xff0c;开发者经常会遇到各种需要编写和学习新技术的任务。ChatGPT作为一种强大的自然语言处理工具&#xff0c;不仅可以辅助编写代码&#xff0c;还可以帮助学习新的编程概念和解决开发中的难题。本文将以开发一个BPMN&#xff08;业务流程建模与标注&#x…

如何搭建一个小程序:从零开始的详细指南

在当今数字化时代&#xff0c;小程序以其轻便、无需下载安装即可使用的特点&#xff0c;成为了连接用户与服务的重要桥梁。无论是零售、餐饮、教育还是娱乐行业&#xff0c;小程序都展现了巨大的潜力。如果你正考虑搭建一个小程序&#xff0c;本文将为你提供一个从零开始的详细…

Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表

使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表&#xff08;或依赖下拉列表&#xff09;的概念令人兴奋&#xff0c;但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框&#xff0c;分别显示…

aws服务--机密数据存储AWS Secrets Manager(1)介绍和使用

一、介绍 1、简介 AWS Secrets Manager 是一个完全托管的服务,用于保护应用程序、服务和 IT 资源中的机密信息。它支持安全地存储、管理和访问应用程序所需的机密数据,比如数据库凭证、API 密钥、访问密钥等。通过 Secrets Manager,你可以轻松管理、轮换和访问这些机密信息…

Redis中HGETALL和ZRANGE命令

Redis中HGETALL和ZRANGE命令 简单来说 HGETALL 命令用于返回哈希表中&#xff0c;所有的字段和值。 ZRANGE 命令用于返回有序集中&#xff0c;指定区间内的成员。 HGETALL 在 Redis 中&#xff0c;HGETALL 是一个用于操作哈希&#xff08;Hash&#xff09;数据类型的命令&…

数据结构 【双向哨兵位循环链表】

链表的结构分为8中&#xff0c;其实搞懂了单链表和双向哨兵位循环链表&#xff0c;这部分的知识也就掌握的差不多了。双向哨兵位循环链表的结构如下&#xff1a; 下面我从0构建一个双向哨兵位循环链表。 1、准备工作 构建节点结构体&#xff0c;双向循环链表的每一个…

RabbitMQ的交换机总结

1.direct交换机 2.fanout交换机

MVC、EL、JSTL

1.MVC设计模式 三层&#xff1a; MVC&#xff1a; M&#xff08;Model&#xff09;模型&#xff1a;负责业务逻辑处理&#xff0c;数据库访问。 V&#xff08;View&#xff09;视图&#xff1a;负责与用户交互。 C&#xff08;Controller&#xff09;控制器&#xff1a;负责流程…

map和redis关系

Map 和 Redis 都是用于存储和管理数据的工具&#xff0c;但它们在用途、实现和应用场景上有所不同。下面详细解释 Map 和 Redis 之间的关系和区别。 1. Map 数据结构 定义 Map 是一种数据结构&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。每个键都是…

《Python基础》之函数的用法

一、简介 在 Python 中&#xff0c;函数是一段可重用的代码块&#xff0c;用于执行特定的任务。函数可以帮助你将代码模块化&#xff0c;提高代码的可读性和可维护性。 函数的用途 代码重用&#xff1a;通过函数&#xff0c;你可以将常用的代码块封装起来&#xff0c;避免重复…