手撸俄罗斯方块——游戏设计

手撸俄罗斯方块——游戏设计

概述

上一章我们介绍俄罗斯方块的基本信息,包括坐标点和方块的基本概念,这一章节我们继续介绍如何完成后续的游戏设计。

组成游戏的基本要素

俄罗斯方块作为一个 2D 的平面游戏,我们可以将整个参与元素做如下抽象,如下图:

在这里插入图片描述

  • 游戏(Game):游戏的核心,负责控制游戏的开始、暂停、结束等。

  • 舞台(Stage):游戏的舞台,是一个矩形的游戏区域,方块在舞台中移动和旋转。

    • 方块(Block):游戏的基本元素,包括各种形状的方块,每个方块由 4 个小方块组成。

    • 工厂(Factory):方块的生成器,负责生成不同形状的方块。

  • 控制器(Controller): 游戏控制器,用于注册事件,如键盘事件、鼠标事件等;

  • 渲染(Render):游戏的渲染器,负责将游戏的状态渲染到屏幕上。

    • 主题(Theme):游戏的主题,包括游戏的背景、方块的颜色等。

简单描述为:

  1. 通过工厂(Factory)产生方块(Block)

  2. 方块(Block)舞台(Stage)中移动和旋转。

  3. 控制器(Controller)监听用户输入,方块的移动和旋转是通过游戏(Game)实例做总体控制。

  4. 游戏的状态通过渲染(Render)渲染到屏幕上,输出样式由主题(Theme)进行控制。

Factory

工厂的目标是为了产生方块,因此它只需要提供产生方块的能力即可。可以抽象如下:

export abstract class AbstractFactory {abstract randomBlock(): Block;
}

没错,AbstractFactory只需要提供一个randomBlock,其随机产生一个方块。

Stage

Stage 作为整个游戏的舞台,它将方块进行组合,同时对外暴露一些能力,如:

  • tick,步进能力,包含三个操作: 生产新的方块、方块向下移动和方块结算。
  • rotate,旋转能力。
  • move,移动能力
  • reset,重置能力

除此之外,还需要提供几个状态的判断能力:

  • isOver,是否结束,tick无法继续。

为了完成上述能力,我们需要对一些信息进行存储,也是封装在Stage中。

  • current: Block,当前正在移动的方块。其要么是空,要么是一个固定的方块。
  • next: Block,下一个方块。
  • score: number,得分。
  • points: Point[][],一个二位数组,坐标轴的填充情况。
  • dimension: Dimension,定义坐标轴的可操作区域,所有的方块不能操作该区域。
  • factory: 方块生成器。
type Direction = "up" | "left" | "down" | "right";
class Dimension {xSize: number; // x坐标轴的最大值ySize: number; // y坐标轴的最大值
}class Stage {current: null | Block;next: null | Block;score: number;points: Point[][];dimension: Demension;tick() {}rotate() {}move(direction: Direction) {}reset() {}
}

Game

Game 作为程序的主入口,将多个元素进行聚合,并控制游戏的开始和结束。

我们首先来分析它的属性,它至少要包括如下属性:

  • status,游戏的状态,分别是 Ready、Running、Pause、Stop、Over。
  • stage,游戏的舞台。
  • render,渲染器
  • controller,控制器

它的目标是通过定时器来控制 Stage 的步进(tick),通过 contoller 监听用户输入,控制移动和旋转。

逻辑如下:

export interface GameOptions {dimension: Dimension;canvas: AbstractCanvas;factory?: AbstractFactory;controller?: AbstractController;
}export enum GameStatus {UNREADY = 0,READY = 1,RUNNING = 2,PAUSE = 3,STOP = 4,OVER = 5
}export class Game {controller?: AbstractController;canvas: AbstractCanvas;options: GameOptions;dimension: Dimension;stage: Stage;status: GameStatus;// 开始start() {}// 暂停pause() {}// 停止stop() {}// 旋转rotate() {}// 移动move(direction: Direction) {}toggle() {}destroy() {}
}

Render

对舞台进行渲染。一般对于游戏渲染,主要包括两个阶段:

  • 首次渲染,渲染基本场景;
  • 更新渲染,舞台发生变化时进行更新渲染。处于性能考量,更新时最好使用局部渲染。

定义如下:

class AbstractRender {theme: Theme;render(): void; // 首次渲染update(): void; // 更新渲染
}

Theme

为了确定游戏的背景,我们需要将游戏区域进行划分。划分如下图:

在这里插入图片描述

从上到下,我们可以将整个操作界面分为如下区域:

  • 外框区域: 包括外框的颜色和整体的背景,以及外框的样式;

  • 分数区域: 用于显示分数;

  • 当前图形: 显示当前正在移动的方块;

  • 下一图形: 显示接下来要出现的方块;

  • 游戏状态: 显示当前游戏的状态,如: 游戏暂停;

  • 已填充图形: 显示已填充的图形;

按照上述划分,我们可以将theme抽象为如下:

abstract class AbstractTheme {/*** 设置外框的样式,如外框的颜色、整体的背景等。* @param outer 指代外框对象的元素,通过修改其内容改变显示样式。*/abstract outStyle(outer: any): void;/*** 设置内框的样式,如内框的颜色、整体的背景等。* @param inner 指代内框对象的元素,通过修改其内容改变显示样式。*/abstract innerStyle(inner: any): void;/*** 设置分数的样式。* @param score 指代分数对象的元素,通过修改其内容改变显示样式。*/abstract scoreStyle(score: any): void;/*** 设置状态栏的样式* @param status 指代状态对象的元素。*/abstract statusStyle(status: any): void;/*** 分数的格式化字符串,输入一个分数的数字,将其转换为目标的样式;* @param score {number} 当前游戏的分数*/abstract scoreTemplate(score: number): string;abstract nextStyle(blocks: any): void;abstract currentStyle(current: any): void;/*** 设置方块区域的样式* @param block 指代当前方块区域*/abstract blockStyle(block: any): void;/*** 设置current区域和已填充区域的小方块的样式* @param blockItem 当前小方块,如一个IBlock会拆分成4各BlockItem。* @param point 当前小方块的位置信息,包括`x`轴和`y`轴的坐标等信息*/abstract blockPointStyle(blockItem: any, point: Point): void;/*** 设置next区域的小方块的样式* @param blockItem* @param point*/abstract nextPointStyle(blockItem: any, point: Point): void;
}

小结

本章主要描述了俄罗斯方块的几个控制元素,也仅仅是几个相关的骨架。后续章节将进一步介绍方块的设计。

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

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

相关文章

简过网:工程专业最吃香的6个证书,你考了几个了?

工程专业最吃香的6个证书,你考了几个了?我们一起来看看吧! 1、二级建造师 报考条件:工程类大专及以上学历/从事相关职业 考试时间:3月报名、6月考试 就业前景:建筑设计院、房产开发公司、施工单位 2、一…

如何管理一百个ai专家智能体——ai调度系统设计

前言 如果你用过openai的chatgpt服务,你肯定知道一个叫做GPTs的智能体商店,里面提供了大量的来自官方和个人制作的专门针对某个领域的gpt助手。比如,你想让gpt帮忙写文章,并且要能够写得好,你就可以在商店中搜索相关的…

【C语言】符号优先级详解

C语言符号优先级详细解析 在C语言中,不同的运算符具有不同的优先级和结合性,这决定了在表达式中运算符的计算顺序。理解这些优先级和结合性是正确编写和理解C语言程序的基础。本文将详细解析C语言中的符号优先级,包括各类运算符的优先级、结…

Smail语句如何使用判断语句跳过验证卡密界面?谈谈思路

🏆本文收录于《CSDN问答解惑》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…

数据融合工具(5)面中心线提取

这是一个重磅工具,建议先看视频。 提取中心线 一、需求背景 说真的,当小编第一次使用ArcGIS中的Polygon To Centerline工具提取面要素中心线时,激动得无以言表,毕竟,以前要提取面中心线,是一件非常麻烦的事…

uniapp图片压缩之后在上传

压缩图片js方法,新建imgPress.js /** * H5压缩 二分查找算法来找到一个合适的图像质量系数,使得压缩后的图片文件大小接近于目标大小* param {Object} imgSrc 图片url * param {Object} callback 回调设置返回值 * */ export function compressH5(fileI…

nginx热更新详解及实战操作

Nginx热更新,也被称为平滑升级或热部署,是指在不中断Nginx服务的情况下,对Nginx进行升级或更新其配置,以实现业务的无损和用户无感知的升级过程。以下是关于Nginx热更新的详细解释: 一、Nginx热更新的原理 Nginx热更…

Kubernetes APIServer 几种基本认证方式

"认证",形象地理解就是"你是谁"。在上文中,用户A在发起API请求时,管理员如何道该请求是用户A发起的呢?所以,客户端在发起API请求时,必须要携带一个身份信息来表明"我是谁"&a…

泰勒公式中拉格朗日余项和佩亚诺余项的区别及具体的应用场景案例

泰勒公式是微积分中的一个重要工具,用于将一个函数在某一点附近展开成多项式形式,以便于近似计算和分析。泰勒公式的一般形式为: f ( x ) f ( a ) f ′ ( a ) ( x − a ) f ′ ′ ( a ) 2 ! ( x − a ) 2 ⋯ f ( n ) ( a ) n ! ( x − a…

[CTF]-PWN:House of Cat堆题型综合解析

原理: 调用顺序: exit->_IO_wfile_jumps->_IO_wfile_seekoff->_IO_switch_to_wget_mode _IO_wfile_seekoff源码: off64_t _IO_wfile_seekoff (FILE *fp, off64_t offset, int dir, int mode) {off64_t result;off64_t delta, new…

AI绘画小白必备!Stable Diffusion常用插件合集,好用推荐!(附插件下载)

前言 宝子们,早上好啊~Stable Diffusion 常用插件,月月已经给大家整理好了,自取就好。 拥有这些SD常用插件,让您的图像生成和编辑过程更加强大、直观、多样化。以下插件集成了一系列增强功能,覆盖从自动补全提示词到…

开源项目:驱动创新与协作的时代引擎

《开源项目:驱动创新与协作的时代引擎》 在当今全球经济与科技环境瞬息万变的背景下,开源软件项目如同一颗璀璨的新星,在开发者社区的天空中熠熠生辉。其蓬勃发展的态势不仅成为了热门话题,更是引领着技术领域的变革潮流。 开源…

无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。【解决办法】

问题描述 新建好一台windows虚拟机,两台设备网络是互通的,但是物理机在访问虚拟机的网络共享文件资源时,出现图下所示的报错:XXX无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。用户…

echarts无法加载Map地图的问题

项目场景: echarts无法加载Map地图的问题 详情 查阅相关资料讲,echarts4.9以上版本已经移除了map,那么我们就得重新打包echarts文件了。打包echarts.min.js的链接:https://echarts.apache.org/zh/builder.html 在这个链接页面可…

考完软考之后,如何评职称?是否有有效期?

一、软考和职称之间的关系 软考和职称之间的关系可以这样理解:拿到软考证书并不意味着就能获得职称。软考证书是技术等级证书,而职称则是一种资格。如果单位聘用你做工程师,那么你的软考证书就可以发挥作用,相当于获得了职称证。…

单商户和多商户的区别

单商户商城通常由单个企业或品牌运营,专注于销售自家产品,而多商户商城则类似于一个平台,允许多个商家入驻并销售各自的商品。它们在经营模式、商家入驻和运营投入等方面有所不同。具体分析如下: 经营模式 单商户商城&#xff1…

MES:连接计划与执行的桥梁

想象一下,你的企业拥有一份完美的生产计划,但如何将这份计划准确无误地转化为实际生产中的每一步操作?这就是MES大展身手的地方。MES作为ERP(企业资源计划)与车间自动化控制之间的桥梁,确保生产计划能够顺畅…

hf-mirror (huggingface 的国内镜像)

官网: https://hf-mirror.com/ 网站域名 hf-mirror.com,用于镜像 huggingface.co 域名。作为一个公益项目,致力于帮助国内AI开发者快速、稳定的下载模型、数据集。 如何使用HF-Mirror 方法一:网页下载 在https://hf-mirror.com/…

边框插画:成都亚恒丰创教育科技有限公司

边框插画:艺术与生活的精致边界 在视觉艺术的广阔天地里,边框插画以其独特的魅力和细腻的表达方式,成为连接艺术与生活的一道精致边界。成都亚恒丰创教育科技有限公司它不仅仅是图像的外框装饰,更是情感、故事与创意的延伸&#…

看到指针就头疼?这篇文章让你对指针有更全面的了解!

文章目录 1.什么是指针2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1为什么会有野指针3.2 如何规避野指针 4.指针运算4.1 指针-整数4.2 指针减指针4.3 指针的关系运算 5.指针与数组6.二级指针7.指针数组 1.什么是指针 指针的两个要点 1.指针是内存中的一个最小单…