第十六节 生成方块 下
2019-06-24 本文已影响0人
安静的程序员
01.完善创建方法方法
每种方块都是由4个像素点组成,并且以左下角为原点,以下为补充完整的分支块:
switch (blockType)
{
case EBlockType.TYPE_T:
listPoint.Add(new MyPoint(0, 0));
listPoint.Add(new MyPoint(0, 1));
listPoint.Add(new MyPoint(0, 2));
listPoint.Add(new MyPoint(1, 1));
break;
case EBlockType.TYPE_L_LEFT:
listPoint.Add(new MyPoint(0, 0));
listPoint.Add(new MyPoint(0, 1));
listPoint.Add(new MyPoint(1, 1));
listPoint.Add(new MyPoint(2, 1));
break;
case EBlockType.TYPE_L_RIGHT:
listPoint.Add(new MyPoint(0, 0));
listPoint.Add(new MyPoint(0, 1));
listPoint.Add(new MyPoint(1, 0));
listPoint.Add(new MyPoint(2, 0));
break;
case EBlockType.TYPE_Z_LEFT:
listPoint.Add(new MyPoint(0, 0));
listPoint.Add(new MyPoint(1, 0));
listPoint.Add(new MyPoint(1, 1));
listPoint.Add(new MyPoint(2, 1));
break;
case EBlockType.TYPE_Z_RIGHT:
listPoint.Add(new MyPoint(0, 1));
listPoint.Add(new MyPoint(1, 0));
listPoint.Add(new MyPoint(1, 1));
listPoint.Add(new MyPoint(2, 0));
break;
case EBlockType.TYPE_I:
listPoint.Add(new MyPoint(0, 0));
listPoint.Add(new MyPoint(0, 1));
listPoint.Add(new MyPoint(0, 2));
listPoint.Add(new MyPoint(0, 3));
break;
case EBlockType.TYPE_O:
listPoint.Add(new MyPoint(0, 0));
listPoint.Add(new MyPoint(0, 1));
listPoint.Add(new MyPoint(1, 0));
listPoint.Add(new MyPoint(1, 1));
break;
case EBlockType.TYPE_TEST:
listPoint.Add(new MyPoint(0, 0));
listPoint.Add(new MyPoint(0, 1));
listPoint.Add(new MyPoint(0, 2));
listPoint.Add(new MyPoint(0, 3));
break;
}
02.测试生成方块
编辑导演类,修改之前添加坦克的代码,并注释或删除修改坐标的代码:
// 获取默认图层
Layer defaultLayer = _screenMain.GetLayer("DefaultLayer");
if (defaultLayer != null)
{
// 添加一个方块
defaultLayer.ViewData = BlockCrea-tor.GetInstance().CreateBlock(EBlockType.TYPE_T);
}
// 修改图层坐标
// defaultLayer.Point = new MyPoint(3, 8);
// 刷新屏幕
_screenMain.RefreshScreen();
回到Unity运行如下:

03.随机生成方块
Unity已经提供了生成随机数的类Random,并且可以指定随机范围。可以通过随机枚举值来生成随机方块类型:
// 添加一个方块
EBlockType blockType = (EBlockType)Random.Range(1, 7);
defaultLayer.ViewData = BlockCreator.GetInstance().CreateBlock(blockType);
现在每次运行都会显示不同的方块。
04.控制随机生成的概率
假如我希望游戏简单点,尽可能多的生成I字型,那就需要控制各种类型生成的概率了。
最开始我用了一种很粗暴的方法,就是在枚举类里添加很多I字型,I1,I2,I3...这样每次修改概率都需要修改随机的范围值,增加了维护难度。
现在,有一种更简单的方法,非常容易理解:
假设有一个盒子,存放了很多纸条,纸条上写的是方块类型,那么每次我都从中挑选一个纸条,用完后再放进去,那是不是只要盒子里面I字型的纸条很多,那我选到I字型的几率就更大?
下面就用代码实现,我将生成随机类型的代码放在了BlockCreator类中,视为该类的附加功能。在该类中需要添加一个方块盒子成员和一个生成随机类型的方法:
// 方块盒子 - 控制各个方块生成概率
private List<EBlockType> _blockBox;
在构造方法中填充盒子:
// 初始化和填充方块盒子
_blockBox = new List<EBlockType>
{
EBlockType.TYPE_T,
EBlockType.TYPE_L_LEFT,
EBlockType.TYPE_L_RIGHT,
EBlockType.TYPE_Z_LEFT,
EBlockType.TYPE_Z_RIGHT,
EBlockType.TYPE_I,
EBlockType.TYPE_I,
EBlockType.TYPE_I,
EBlockType.TYPE_O
};
添加一个方法生成随机类型:
// 随机一个方块类型
public EBlockType RandomBlockType()
{
return _blockBox[Random.Range(0, _blockBox.Count)];
}
完整代码请参考附加。
05.测试
修改添加方块的代码:
// 添加一个方块
EBlockType blockType = BlockCreator.GetInstance().RandomBlockType();
defaultLayer.ViewData = BlockCreator.GetInstance().CreateBlock(blockType);
运行多次,你会发现,出现I字型的几率较高,如果没有发现,说明你运行的还不够多,或者你可以往方块盒子里面再添加一些I字型。
代码链接:https://pan.baidu.com/s/1iSneYzaxUg-Tw0fQjkNYXw
提取码:btro