小方块有了,我们下一步就要得到游戏中的组合方块,这里创建一个Block类,为游戏中的组合方块类。那这个类有什么属性呢?位置(Location),周围颜色(SurroundColor),中心颜色(CenterColor) 。那么大小(Size)还需要吗,如果需要我们可以通过小方块的位置和数量得到。其实组合方块的Size是不需要的,我们以后的判断都是将组合块的所有小方块循环遍历的。
3.1  一个组合方块由多个小方块组成,那么我们就需要一个Square类型的集合来存储小方块。Block类添加个Squares属性,List<Square> squares。
3.2 接下来组合方块是可以转动的。定义一个枚举类型Direction,里面是方块的四个不同方向(North,East,South,West),Block类里面加个Direction属性,枚举类型,表示方块初始化的方向。
3.3 为了方便,我们规定所有类型的组合方块,以中心的方块旋转。组合方块是由不同小方块相对于中心小方块的位置变化组成的。在以后我们判断游戏出界面,高度,宽度等,都是判断组合方块的小方块集合。根据分析我们得出Block类有Location,SurroundColor,CenterColor,Squares,Direction共5个属性。
3.4 俄罗斯方块有基本形状7种。这些形状她们有Block类的共同属性,但是它们小方块的位置是不同的,旋转方法也是不同的。
我们采用继承,将Block类作为父类,7种基本形状类作为子类。
3.5 子类的共同方法有:
3.5.1 在游戏界面中显示大方块形状ShowBlock()。
3.5.2 将移动后的方块隐藏重绘HideBlock()。
3.5.3 初始化所有小方块位置的方法,定义为抽象方法Init(Direction direction)。
3.5.4 方块是随机出来的,每个方块出来的方向也是随机的,所以需要一个随机数,去得到方块初始的方向InitDirection()方法。并在这个方向的值传递给初始化方块位置Init()方法。将随机数对象在Gmae类中声明。
3.5.5 所有组合方块的旋转方法Ratate()。
3.5.6移动方法,移动有三个方向左右和下,Left()、Right()、Down()。

3.6 接下来看看每个方法是怎么具体实现的:
3.6.1 ShowBlock()方法和HideBlock()方法:只需遍历squares集合循环调用Square类的ShowSquare(Graphicsg)方法和HideSquares()方法,将所有小方块显示或重绘下。这里需要注意,在俄罗斯方块中要显示下一块方块是的形状,但面板对象不一样,把两个方法重构下,传入不同面板对象。
 
3.6.2  InitDirection()方法得到初始化的方向:
Direction = (Direction)Game.Random.Next(0, 4);//Random为随机数对象。
3.6.3  移动的方法:移动我们首先要判断是否出了游戏界面,这里用二维数组来存放游戏界面里所有的小方块对象。Square[,] SquareArray = new Square[Rows, Cols],Rows为游戏界面中的行,Clos为游戏界面中列。这样我们就可以知道游戏界面中某行某列是否有小方块。
3.6.4 将Rows,Cols和Square[,] SquareArray = new Square[Rows, Cols]声明到Game类中,并初始化。在Game类里面添加一个 IsEmpty(int row,int col)方法。来判断是否出界和是否有小方块对象在移动的方向上。

Code:
  1. /// <summary>
  2. /// 判断方块所在行数是否出界,行和列都是从0开始,是否有方块
  3. /// </summary>
  4. /// <param name="row"></param>
  5. /// <param name="col"></param>
  6. /// <returns></returns>
  7. public static bool IsEmpty(int row, int col)
  8. {
  9. //判断游戏区域某个点是否已有方块,并且没出界
  10. if ( row >= 0 && row < Rows && col >= 0 && col < Cols)
  11. return SquareArray[row, col] == null;
  12. else return false;
  13. }

3.6.5在Block类里接下来移动方法就只需要判断所有小方块是否满足IsEmpty(int row,int col)方法返回True就可以移动否则不能移动。下面以往下移为例:(其他的方向同理),下移返回bool值,其他方向无返回值。

Code:
  1. //判断是否可以落下
  2. public bool Down(){
  3. bool flag = true;
  4. HideBlock();
  5. foreach (Square s in Squares)
  6. flag = flag & Game.IsEmpty(s.Location.Y / Game.Side + 1, s.Location.X / Game.Side);
  7. if (flag){
  8. //可以落下
  9. foreach (Square s in Squares) s.Location = new Point(s.Location.X, s.Location.Y + s.Size.Height);
  10. ShowBlock();
  11. return true;
  12. }
  13. else {
  14. //不可以落下
  15. ShowBlock();
  16. return false;
  17. }
  18. }

俄罗斯方块之三——Block类相关推荐

  1. Enterprise Library: Configuration Application Block类设计分析篇

    Enterprise Library: Configuration Application Block类设计分析篇<?xml:namespace prefix = o ns = "ur ...

  2. cocos2dx掼蛋_cocos2dx游戏开发——别踩白块学习笔记(一)——Block类

    一.Block类介绍 当然啦,Block类在这个游戏里就是必需品= =,因为整体都是由这个搞出来的,所以我们可以把游戏需要实现的功能都放在这里. 主要有下面这些功能(经典模式): 1.创建一个Bloc ...

  3. 堆晶结构_-岩石地球化学之三--火成岩类及其构造岩石组合.ppt

    4-岩石地球化学之三--火成岩类及其构造岩石组合 火成岩类及其构造岩石组合 玄武岩类 玄武岩类是相当于辉长岩类成分的喷出岩.SiO2的含量在45-52%之间,主要由基性科长石(一般是拉长石,也可以是培 ...

  4. java中block类6_Java 实现区块链中的区块,BLOCK的实现

    区块链由若干个区块组成,区块是区块链的基础单元 2.区块链中区块的基本属性 区块6个属性的说明-Index 区块的索引值,区块链中的唯一键 区块6个属性的说明-Timestamp 区块的时间戳,用于区 ...

  5. MFC和Win32之三___CGdiObject类和windows Gdi对象

    小结: 前面讲到的windows窗口对象,在windows下用句柄来代表之,并且用了一个数据结构WNDCLASS(窗口类)来描述之.同理,windows的Gdi对象也有一些句柄来代表之(比如hPen等 ...

  6. QT5开发及实例学习之三字符串类

    文章目录 前言 一.操作字符串 二.查询字符串数据 三.字符串的转换 四.NULL字符串和空(empty)字符串的区别 五.隐式共享 六.内存分配策略 前言 标准C++提供了两种字符串:一种是C语言风 ...

  7. java俄罗斯方块七中图形类_俄罗斯方块shell 实现

    ubuntu12 .04 俄罗斯方块效果展示: 源码分享: # Tetris Game # 10.21.2003 xhchen #APP declaration APP_NAME="${0# ...

  8. java俄罗斯方块七中图形类_shell脚本俄罗斯方块--代码真正详解

    无意中看到代码,想仔细了解下源码实现,结果网上搜索都是抄袭的一个版本,有的就写了个开头的分析,没有具体代码分析.所以个人就花了点时间,详细分析了一下代码,在这里分享给大家. 排版不会弄,将就看吧,转载 ...

  9. java俄罗斯方块七中图形类_shell中的俄罗斯方块小游戏

    搜索热词 俄罗斯方块的shell脚本 #!/bin/Bash # Tetris Game #APP declaration APP_NAME="${0##*[\\/]}" APP_ ...

最新文章

  1. 闪电网络运行过程中存在的一些问题
  2. matlab 自再现模,平行平面腔自再现模FoxLi数值迭代解法及MATLAB实现
  3. 华为服务器型号命名,服务器的命名规则
  4. python socket多线程并发_【Python之旅】第五篇(三):Python Socket多线程并发
  5. Go 神坑 1 —— interface{} 与 nil 的比较
  6. 2018 NLPCC Chinese Grammatical Error Correction 论文小结
  7. Java面试题---基础篇
  8. 基于Springboot开发的精品小说平台网站源码带爬虫工具
  9. 微软笔试题《Arithmetic Puzzles》- 题解
  10. 视觉开发应用1- 机器视觉基本知识之工业相机
  11. springboot证书管理系统的设计与实现毕业设计源码162317
  12. 【金融系列】使用Python分析债券,画零息利率曲线,对债券进行精确定价,计算债券的麦考利久期、修正久期和凸度,并进行价格敏感性分析
  13. 教程:如何制作一个多功能U盘
  14. 一刹那,是幡然悔悟的一刹那
  15. 秋招总结|阿里转正失败,到拿到10个大厂产品offer
  16. python 爬取 网易翻译
  17. CAS单点登录学习笔记二之部署CAS Server
  18. 【八月英语----照亮我心】
  19. 雨敲窗python_标签 Python - 雨敲窗个人博客
  20. 涨势迅猛!拼多多跨境平台TEMU在美掀起流量风暴!

热门文章

  1. ubuntu20下安装nginx插件geoip2查询ip信息
  2. 2022-2028年中国云制造行业深度调研及投资前景预测报告
  3. 双水箱matlab仿真,基于组态王和Matlab的双容水箱液位控制
  4. 专业音视频播放器:Elmedia Video Player Pro mac中文版
  5. python百度语音实时识别成文字(Key值获取)
  6. Cesium:地球初始设置
  7. Acrel-2000E/B配电室综合监控系统在配电室的应用
  8. codeforces 1100D
  9. 人人人人人人人人人人人人人人人人人人人
  10. lab2000p程序H11.asm