“坦克大战”项目设计文档

news2024/11/16 7:25:38

「坦克大战」项目的设计文档

功能设计

游戏部分

​ 在存在 障碍物 的地图上,玩家需要操作一辆绿色的坦克与敌对的灰色坦克作战。 坦克 以及其发射的 炮弹 均会被障碍物所阻挡。玩家用键盘上的 wasd按键 控制坦克移动,用 鼠标 控制炮弹发射方向,按下 空格键 以发射炮弹。而敌方坦克则会自主移动并发射炮弹攻击玩家。炮弹碰到障碍物时会 反弹 ,但是反弹超过一定次数时炮弹就会消失。击毁敌方坦克可以得到一定的分数。每一关均有不同通关条件,分别是一星、二星、三星需要的通关分数。当玩家 用完炮弹操作的坦克被击毁 时,游戏结束。

关卡设计部分

​ 为了让玩家体验更多的快乐,并将快乐分享给其他人 (互相折磨) ,我们开发了 自定义关卡 功能。玩家可以自主设计关卡,将其储存到自己的存档里或生成 分享码 (一个由数字和符号构成的字符串),而其他玩家可以通过输入分享码导入关卡。除了完全自主设计之外,玩家也可以在其他关卡的基础上进行设计 ,让它更加折磨人

控制部分

​ 为了便于保存游戏进度,我们提供了 存档功能 ,将游戏自带文件以及玩家存档都放到游戏目录下的 datas 文件夹中。存档中包含了玩家各个关卡的进度,以及玩家自定义的关卡。

整体架构设计

输出图形时所使用的工具

​ 考虑到 C++ 自带的控制台不能绘制出这一游戏的画面,我们上网查阅了资料,决定使用 Easyx 图形库。使用 Easyx 可以便捷地画出直线、圆、矩形等几何图形,输出文本,导入图片,检测鼠标和键盘的状态。基于这些功能我们就能绘制出游戏中的坦克、炮弹、障碍物,以及控制游戏时用到的按钮、文本框、消息窗口了。

控制部分

widget类有三大功能:初始化, 页面跳转 ,以及绘图。初始化时构造背景数据,并用list容器存储;绘图时迭代器访问并输出;页面跳转:widget类通过 currentindex (记录当前页面的编号)这个变量实现功能的分类。在接受鼠标和键盘信息后,通过 button 类改变 currentindex 的值,再调用不同的函数实现对应的功能。点击“开始游戏”则运行 Level_Editor() 函数,点击“设计关卡”则通过 look_up_pages() 函数查看并选择关卡,选择完毕就进入 Game 类的成员函数 run() 中运行游戏。

游戏的运行

​ 通过 Game 类来实现运行功能。首先数据初始化,以及背景图绘制,接着点击“开始游戏”则开始运行游戏,在每次键盘和鼠标操作后,改变对应数据(坦克,炮弹,背景图中的分数等),并通过双缓冲统一绘制出来,以及改变帧率以此改善画质体验感。最后通过 is_win 这个布尔量判断是否结束循环,展示相应的动画的同时保留并改变该用户相应的数据。

自定义关卡 的实现思路与之类似。

存档部分

​ 通过 File_Manager 类来实现文件操作的功能。游戏一开始,先检测游戏文件是否完整,接着读取所有玩家的用户名和密码以完成登录。当玩家在某一关卡创造了新纪录,或保存正在编辑的关卡时,都要将新的玩家数据存档。我们按照一定规律编排数据,使得玩家信息、关卡信息都可以转化成字符串,同时也可以从字符串中读入这些信息。

数据结构设计

存档部分

​ 使用 Level_Data 类储存一个关卡的数据,包含坦克的初始位置、障碍物的位置、通关条件等信息。使用 Player_Data 类储存一个玩家的数据,包括用户名、密码、得分等。

​ 以下展示这两个类的部分定义:

struct d_wall    //储存障碍物数据的结构体
{
	int stx,sty,edx,edy; // 左上角、右下角的坐标 
};
struct d_player  //储存我方坦克数据的结构体
{
	int dir,x,y;     // 初始坦克位置 
	int bullet_num;  // 初始炮弹数量 
};
struct d_enemy   //储存敌方坦克数据的结构体
{
	int dir,x,y,seed,score;
	// 朝向( 0 表示横向, 1 表示纵向),初始坦克位置,随机种子,分值 
};
class Level_Data
{
public:
	string name;                // 关卡名 
	int score3,score2,score1;   // 通关的分数要求 
	list<d_wall> wall;          // 障碍物
	d_player player;            // 我方坦克
	list<d_enemy> enemy;        // 敌方坦克
}
class Player_Data
{
public:
	int file_id;          // 玩家存档的编号
	string name;          // 用户名
	string password;      // 密码
	list<int> score;      // 所有关卡的得分(先是固定关卡,再是自定义关卡) 
	list<string> c_level; // 自定义关卡的关卡分享码 
}

游戏运行部分

​ 当玩家点进一个关卡后,我们通过 Game 类完成一个关卡的运行。 Game 类中包含若干个成员,其中 optank 类型的数组 Enermy 储存的是 敌方坦克 的数据, tank 类型的变量 my_tank 储存的是 我方坦克 的数据, Bullet 类型的链表 bulletoptank_bullet 分别储存 我方坦克发射的炮弹敌方坦克发射的炮弹 的数据, Wall 类型的链表 wall 储存 障碍物 的数据。

Game 类的定义如下:

class Game{
	private:
		list<Wall> wall;                //障碍物
		list<Bullet> my_bullet;         //我方坦克发射的炮弹 
		list<Bullet> optank_bullet[30]; //敌方坦克发射的炮弹
		optank Enermy[30];              //敌方坦克
		tank my_tank;                   //我方坦克 
		Level_Data lvl;                 //这个关卡的数据
		int num;                        //敌方坦克数量 
}

关键算法设计

多线程的实现

​ 在游戏中,我们需要让敌方坦克、炮弹同时移动,同时能够让玩家随时操作我方坦克移动或攻击。但是 C++ 的程序是单线程运行的,这就需要我们把多线程的任务拆分成更小的子任务,每隔 20 毫秒依次执行各个子任务。我们拆分的子任务依次为:

  1. 检测鼠标左键是否被按下,如果是的话,我方坦克发射一枚炮弹;
  2. 敌方坦克移动;
  3. 我方炮弹移动;
  4. 敌方坦克发射炮弹;
  5. 敌方坦克炮弹移动;
  6. 判断我方坦克是否被敌方炮弹击中;
  7. 判断敌方坦克是否被我方炮弹击中;
  8. 如果分值发生变化,更新屏幕上显示的分值。

​ 在实现 文本框按钮 ,制作 自定义关卡 界面时,也同样采取了这种思路。

图形的绘制

​ 尽管有了 Easyx 这一工具,也要通过拼接各种几何图形完成游戏内容的绘制。

  • 文本框:边框为圆角矩形,内部绘制文本;

  • 按钮:先绘制有内部填充的圆角矩形,再在内部绘制文本;

  • 坦克:先绘制有内部填充的矩形(车身),再绘制由坦克中心指向鼠标的线段,最后绘制有内部填充的圆形(炮塔);

  • 子弹:有内部填充的圆形。

    这些图形的展示图如下:

    在这里插入图片描述
    ​ 后期在对游戏界面进行美化时,我们还制作了启动游戏时的渐变动画。这则是通过每隔40毫秒计算每个像素点的RGB值,并重新输出实现的(后来发现这样对于电脑显卡的要求很高,但是目前也想不到优化的方案)。

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

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

相关文章

删除倒数第N个结点---链表Oj

https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envType=study-plan-v2&envId=top-100-liked 1、常规解法 删除倒数第N个结点,那就是删除整数第(len - N + 1)个结点,我们只需要找到第len-N个结点,让它的next指向倒数第N个结点…

赛氪荣获“2023天津高新技术企业大会支持单位”

1月23日上午&#xff0c;2023天津市高新技术企业大会新闻发布会在天开高教科技园核心区综合服务中心召开&#xff0c;市高企协以及来自高校、企业、社会组织等80余人现场参会。 大会组委会秘书长张博航介绍到&#xff1a;“本次大会将实现自开办以来的多个首次&#xff0c;首次…

【刷题】 leetcode 面试题 08.05.递归乘法

递归乘法 1 题目描述2 思路一&#xff08;返璞归真版&#xff09;3 思路二&#xff08;二进制乘法器版&#xff09;4 思路三&#xff08;变态版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 1 题目…

CTF CRYPTO 密码学-7

题目名称&#xff1a;敲击 题目描述&#xff1a; 让我们回到最开始的地方 0110011001101100011000010110011101111011011000110110010100110011011001010011010100110000001100100110001100101101001101000011100001100011001110010010110100110100011001000011010100110000…

2024年第04周农产品价格报告

一、摘要 农产品价格监测主要涉及对畜禽类产品、水产品、蔬菜类产品、水果类产品的价格&#xff0c;以周为单位&#xff0c;进行变化情况的数据监测。其中&#xff0c;蔬菜类产品共18种&#xff0c;分别为大白菜、西红柿、黄瓜、青椒、芹菜、土豆、白萝卜、茄子、豆角、胡萝卜…

论文精读--BERT

不像视觉领域&#xff0c;在Bert出现之前的nlp领域还没有一个深的网络&#xff0c;使得能在大数据集上训练一个深的神经网络&#xff0c;并应用到很多nlp的任务上 Abstract We introduce a new language representation model called BERT, which stands for Bidirectional En…

IDEA中git的使用和代码对比神器Beyond Compare

和多同学idea配置好了&#xff0c;但是使用却不知道怎么使用。 我这里说说idea中使用的几招常用操作。如&#xff1a;提交&#xff0c;拉取&#xff0c;推送&#xff0c;合并&#xff0c;取消合并&#xff0c;撤回本地提交。 以及一些刚接触idea使用git的怕把公司代码搞砸了的同…

遗传算法改进leach协议(附MATLAB代码)

LEACH&#xff08;低能量自适应聚簇层次&#xff09;协议是无线传感器网络中最早的、最具有影响力的分簇协议之一。它通过随机选举一些传感器节点作为簇头&#xff0c;其他节点加入其中一个簇头组成一个簇&#xff0c;然后簇头负责汇聚数据并将数据发送给基站&#xff0c;从而达…

UE4运用C++和框架开发坦克大战教程笔记(十五)(第46~48集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十五&#xff09;&#xff08;第46~48集&#xff09; 46. 批量加载 UClass 功能测试批量加载多个同类 UClass 资源 47. 创建单个资源对象测试加载并创建单个 UClass 资源对象 48. 创建同类资源对象 46. 批量加载 UClass 功能 逻…

【HTML 基础】元素和标签

文章目录 1. <p> - 段落标签2. <h1> - <h6> - 标题标签3. <a> - 超链接标签4. <img> - 图片标签5. <ul>, <ol>, <li> - 列表标签无序列表有序列表 总结 HTML&#xff08;Hypertext Markup Language&#xff09;是构建 Web 页面…

Prometheus 监控系统的初步了解与系统搭建

目录 目录 目录 前言 Prometheus的相关知识 Prometheus特点 Prometheus的存储引擎&#xff1a;TSDB Prometheus的组件 1.核心组件&#xff1a;prometheus server Prometheus server又分为三个部分&#xff1a; 2.exports 3.client Library 4.cadvisor 5.blackbox-ex…

二维数组的学习

前言 在前面我们学习了一维数组&#xff0c;但是有的问题需要用二位数组来解决。 二维数组常称为矩阵&#xff0c;把二维数组写成行和列的排列形式&#xff0c;可以有助于形象化的理解二维数组的逻辑结构。 一、二维数组的定义 二维数组定义的一般格式&#xff1a; 数据类型 数…

【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】

文章目录: 1. 下拉菜单 2. 文本域3.label标签 4.按钮- button 4.1 reset重置按钮结合form表单区域使用 5.无语义的布局标签 6.字符实体 注册信息综合案例 表单第二节 1. 下拉菜单 标签: select嵌套option,select是下拉菜单整体&#xff0c;option是下拉菜单的每一项。 代码…

自媒体必备,这10个免费素材网站,一定要收藏~

自媒体必备素材库&#xff0c;视频、图片、音效、各种类型BGM&#xff0c;这10个网站都能找到&#xff0c;免费下载可商用&#xff0c;朋友们赶紧收藏一波~ 视频素材 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库虽然是个设计素材网站&#xff0c;但…

文物预防性保护新高度:守护历史,个性化定制保护方案

一、西安市研究院宣布西安长安曹家堡村发现2823座古代遗迹 深藏于西安长安曹家堡村地下的2823座古代遗迹&#xff0c;在西安文物维护考古研究院的用心调研下&#xff0c;逐渐揭开了神秘面纱。其中&#xff0c;已有1088座陵墓重见天日&#xff0c;出土的文物琳琅满目&#xff0…

如何实现Win系统ssh连接Ubuntu使用vscode远程敲代码

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接…

【.NET Core】深入理解C#中的特殊字符

【.NET Core】深入理解C#中的特殊字符 文章目录 【.NET Core】深入理解C#中的特殊字符一、概述二、$-- 字符串内插2.1 内插字符串的结构2.2 内插原始字符串字面量2.3 特殊字符2.4 内插字符串编译 三、-- 逐字字符串标识符四、“”“--原始字符串文本 一、概述 特殊字符是预定义…

Vite+Electron快速构建一个VUE3桌面应用(一)

一. 简介 首先&#xff0c;介绍下vite和Electron。 Vite是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入Chromium和Node.js到二进制的 Electron 允许您保持一个 JavaScript 代码代码…

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示

elementui-table组件列表中的tooltip内容过长超出屏幕换行显示 el-table列属性中带的有show-overflow-tooltip&#xff0c;可以设置内容超出列宽度显示为…&#xff0c;并且有tooltip提示&#xff0c;但是内容过多时&#xff0c;提示会超出屏幕&#xff1a; 但是el-table组件…

cad设计绘图 -- AutoCAD 2024 中文

AutoCAD 2024是一款全球领先的CAD软件&#xff0c;广泛应用于建筑、机械、电子等领域。相比其他CAD软件&#xff0c;它具有以下优势&#xff1a;首先&#xff0c;AutoCAD 2024提供了丰富的绘图和设计工具&#xff0c;满足各种工作需求&#xff1b;其次&#xff0c;其界面直观、…