【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!
俄罗斯方块的核心玩法非常简单,所以制作起来并不是很复杂,我准备先用2篇文字的篇幅详细讲解一下俄罗斯方块的制作方法。
今天咱们算是第一篇,主要讲解俄罗斯方块中如何定义方块,以及如何实现方块的移动、旋转、下落等操作。
1. 需求分析
俄罗斯方块中的基本逻辑非常简单,不过在介绍之前,我们先确定一下名词,防止出现词不达意的现象。
这种方块,是构成容器的基本单位,我们称之为小方块。
由四个小方块组成,用来填充容器的东西,我们叫做大方块。
用来存放大方块的地方,我们叫做容器。
定义了这三种东西之后,我们就可以这样描述俄罗斯方块这个游戏了。俄罗斯方块主要由一个存放正方形小方块的虚拟容器和实时下落的7种大方块构成。
容器的宽是 10 列,高是 20 行,行高和列宽是相等的,所以容器可以看作是 200 个正方形小方块平铺的结果。
每个实时下落的大方块都是由 4个正方形小方块组成,共 7 种固定样式,每种方块都可以旋转,所以理论上最多有 28 种样式,但其中有一些大方块在旋转的时候样式不会发生变化。
7 种大方块按照形象可以由 7种字母替代,它们是:S、Z、L、J、I、O、T。
这些大方块在下落到容器最底部或碰撞到其它容器中的小方块时会被固定在容器中,然后容器上方会重新产生一个随机的大方块,重复原来的下落流程。
当容器中出现满行的时候,整行会被消除,该行上面的所有小方块都会依次掉落。
2. 大方块的定义
俄罗斯方块中虽然基本的单位是小方块,但是所有操作的对象都是大方块,所以这里直接定义大方块的结构类型。
在定义大方块之前,我们需要先定义两个结构,分别是大方块的类型和大方块的旋转状态。
使用上面两个类型,就可以确定当前大方块的样式。除了样式之外,因为大方块会按照固定的速度移动,所以这里需要定义大方块的位置信息,加上前面两个成员,大方块可定义如下:
这里之所以没有定义大方块的下落速度是因为所有的大方块下落速度都是一样的,因此不需要在每个大方块内部都定义一个变量,只需要在外部定义一个速度变量即可。
确认了大方块的结构,我们还有一个问题需要解决,就是如何获取大方块的具体形状。
虽然大方块里面已经定义了类型和状态,但是并没有保存当前方块的形状,为了解决这个问题,我们可以定义一个全局的静态数组,数组的每一项代表一种方块的形状,算上重复的,一共可存放 28 种形状。
static unsigned short gBlockList[BT_NUM][BS_NUM];
注意这里,数组的每一项用了一个 unsigned short 类型表示。
因为大方块是由 4 个小方块组成,所以每个大方块都可以用一个 4 * 4 的二维数组来表示。
因为二维数组的每一项都只有两种状态,所以可以进一步变形,每一项用一个比特位,这样算下来,16 位比特就可以描述一个大方块的形状,而 16 位比特对应 C语言中的数据类型,正好是 unsigned short。
虽然确认了方案,但是我们还需要确认一个表达规则,就是 16 位比特串低四位是表示大方块的第一行,还是表示最后一行,又或者表示左边的列,还是右边的列。
方法很多,只需要取一个认为方便的就好,这里我是这样定义的:
即低四位表示第一行。最终我们可以求出 28 个形状对应的每一个值:
以后如果在程序中如果需要获取当前大方块的形状,只需要使用类似下面的语句:
gBlockList[i][j]
3. 大方块的操作
确定了大方块的定义,接下来就是对大方的操作实现。首先是初始化操作:
接着就是移动操作,因为我们使用两个变量来确定大方块的位置,所以代码逻辑非常简单:
除了移动,大方块还有一个常用旋转操作,因为前面我们已经使用打表法定义了所有方块的旋转状态,这里直接获取即可:
除了上面这些操作,其实还有碰撞检测以及渲染等操作。我们将在下一章节将为大家详细阐述!
如果你也想学编程,可以来我的C语言/C++编程学习基地【点击进入】!
还有免费的(源码,零基础教程,项目实战教学视频)!
涉及:游戏开发、课程设计、常用软件开发、编程基础知识、黑客等等...
【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!的更多相关文章
- java客房管理小项目,适合java小白练手的项目!
java客房管理小项目 这个客房管理小项目,适合java初学者练手.功能虽然不多,但是内容很齐全! 喜欢这样文章的可以关注我,我会持续更新,你们的关注是我更新的动力!需要更多java学习资料的也可以私 ...
- 【C语言程序设计】小游戏之俄罗斯方块(二)!适合初学者上手、练手!
第二篇,主要实现俄罗斯方块中的主体部分,包括容器的数据结构以及容器的相关操作,特别是大方块和容器之间的交互逻辑,包括碰撞检测,消除检测等等. 1. 容器的表示 大方块的实现涉及到位运算,而容器同样如此 ...
- C#,JavaScript两种语言 2048小游戏
<html> <head> <style type="text/css"> .haha { border-width: 2; font-size ...
- 原生javascript开发仿微信打飞机小游戏
今天闲来无事,于是就打算教一个初学javascript的女童鞋写点东西,因此为了兼顾趣味性与简易程度,果断想到了微信的打飞机小游戏.. 本来想用html5做的,但是毕竟人家才初学,连jquery都还不 ...
- C#俄罗斯方块小游戏程序设计与简单实现
C#俄罗斯方块小游戏程序设计与简单实现 相信90后或者80后都玩过这款小游戏,一直想干一票,琢磨一下,但又不太懂,于是网上搜集修改就有了以下效果!bug较多,多多包涵! 1.效果展示 2.实现方法 参 ...
- 【C语言程序设计】—最近超火的小游戏—【数字炸弹】!
✍ 准备工作和建议 一.程序的原理 在动手编程之前,得先跟大家说一下这个程序是干什么的. 我们可以称呼这个游戏为<数字炸弹>. 游戏的原理是这样: 每一轮电脑从 1 到 100 中随机抽 ...
- .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块
.Net Core ORM选择之路,哪个才适合你 因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...
- C语言-纸牌计算24点小游戏
C语言实现纸牌计算24点小游戏 利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的.程序主要功能已完成,目前还有部分细节 ...
- 【C语言探索之旅】 第一部分第八课:第一个C语言小游戏
内容简介 1.课程大纲 2.第一部分第八课:第一个C语言小游戏 3.第一部分第九课预告: 函数 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写 ...
随机推荐
- 5分钟掌握企业LVM磁盘划分
逻辑卷管理LVM是一个多才多艺的硬盘系统工具.无论在Linux或者其他类似的系统,都是非常的好用.传统分区使用固定大小分区,重新调整大小十分麻烦.但是,LVM可以创建和管理“逻辑”卷,而不是直接使用物 ...
- 大量数据也不在话下,Spring Batch并行处理四种模式初探
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring相关文章:Springboot-Cloud 前面写了一篇文章<通过例子讲解Spring Batch入门,优 ...
- Centos6.5 离线 Openssh 升级
目录 OpenSSH 升级 一.基于 Dropbear 设置备用 ssh 服务器 二. Openssh 更新 2.1 ssh配置 备份 2.2 openssh 升级 Openssl 升级(由于Open ...
- [Java并发包学习八]深度剖析ConcurrentHashMap
转载自https://blog.csdn.net/WinWill2012/article/details/71626044 还记得大学快毕业的时候要准备找工作了,然后就看各种面试相关的书籍,还记得很多 ...
- 1.Concurrent概述
- 7.kafka HA
- 【原创】K8S使用ceph-csi持久化存储之RBD
一.集群和组件版本 K8S集群:1.17.3+Ceph集群:Nautilus(stables)Ceph-CSI:release-v3.1snapshotter-controller:release-2 ...
- 《zookeeper原理与实践》笔记
第1章 分布式架构 1.1 分布式 分布式特点:分布性.对等性.并发性.缺乏全局时钟.故障总是会发生. 分布式问题:通讯异常.网络分区(脑裂).三态.节点故障. 1.2 ACID到CAP/BASE ...
- node中的cookie
为什么需要cookie 我们知道http是无状态的协议,无状态是什么意思呢?我来举一个小例子来说明:比如小明在网上购物,他浏览了多个页面,购买了一些物品,这些请求在多次连接中完成,如果不借助额外的手段 ...
- spring aop 源码分析(二) 代理方法的执行过程分析
在上一篇aop源码分析时,我们已经分析了一个bean被代理的详细过程,参考:https://www.cnblogs.com/yangxiaohui227/p/13266014.html 本次主要是分析 ...