6.搬砖工人类随机创建砖块
6.1 知识点
要实现的代码
主要操作
俄罗斯方块可以理解为有一个看不见的工人慢慢的把方块往下推,碰到墙壁后就把方块和墙壁融为一体,再搬下一个方块。
创建搬砖工人类。
创建工人手里的方块对象类 list,可以理解为当前工人手里拿着的方块。
搬砖工人心中要默默的知道各个形状的方块信息是什么,选择一个容器来记录各个方块的形态信息。我们选择 Dictionary 创建方块信息字典,主要目的是好找,并且起到练习的作用。Key 用方块类型枚举,值是方块信息类。
在板砖工人构造函数中初始化创建方块信息字典,把七种方块的枚举和信息放到字典中。
创建随机创建一个方块方法,随机一个方块类型赋值给工人手里的方块对象类 list,注意不要随机到墙类型。
初始化方块的原点方块位置,其他非原点方块位置根据方块信息字典里的信息获得。
再创建一个方块信息类的当前方块信息变量,用来记录当前方块的方块信息。
给当前方块信息变量赋值,并给当前方块随机出一种方块形态。取出其中一种形态的坐标信息,就可以算出工人手里的方块对象类 list 中非原点方块的坐标。
最后再构造函数中调用随机创建一个方块方法。
实现当前搬砖的绘制方法,就是遍历让工人手里拿着的方块绘制。
在游戏场景类中创建搬砖工人变量,构造函数初始化的时候 new 一个搬砖工人出来。
在游戏场景类的 Update 方法里让搬砖工绘制。
6.2 知识点代码
BlockWorker
using System;
using System.Collections.Generic;
using System.Text;
namespace CSharp实践教学
{
class BlockWorker : IDraw
{
//方块们
private List<DrawObject> blocks;
//心中要默默的知道 各个形状的方块信息是什么
//选择一个容器来纪录各个方块的形态信息
//用list和Dictionary都可以用来存储方块的几种信息
//我们选择Dictionary的主要目的是好找 并且起到练习的作用
private Dictionary<E_DrawType, BlockInfo> blockInfoDic;
//记录随机创建出来的方块的 具体形态信息
private BlockInfo nowBlockInfo;
public BlockWorker()
{
//初始化 装块信息
blockInfoDic = new Dictionary<E_DrawType, BlockInfo>()
{
{ E_DrawType.Cube, new BlockInfo(E_DrawType.Cube) },
{ E_DrawType.Line, new BlockInfo(E_DrawType.Line) },
{ E_DrawType.Tank, new BlockInfo(E_DrawType.Tank) },
{ E_DrawType.Left_Ladder, new BlockInfo(E_DrawType.Left_Ladder) },
{ E_DrawType.Right_Ladder, new BlockInfo(E_DrawType.Right_Ladder) },
{ E_DrawType.Left_Long_Ladder, new BlockInfo(E_DrawType.Left_Long_Ladder) },
{ E_DrawType.Right_Long_Ladder, new BlockInfo(E_DrawType.Right_Long_Ladder) },
};
//随机方块
RandomCreateBlock();
}
public void Draw()
{
for (int i = 0; i < blocks.Count; i++)
{
blocks[i].Draw();
}
}
/// <summary>
/// 随机创建一个方块
/// </summary>
public void RandomCreateBlock()
{
//随机方块类型
Random r = new Random();
E_DrawType type = (E_DrawType)r.Next(1, 8);
//每次新建一个 砖块 其实就是创建4个小方形
blocks = new List<DrawObject>()
{
new DrawObject(type),
new DrawObject(type),
new DrawObject(type),
new DrawObject(type),
};
//需要初始化方块位置
//原点位置 我们随机 自己定义 方块List中第0个就是我们的原点方块
blocks[0].pos = new Position(24, 5);
//其它三个方块的位置
//取出方块的形态信息 来进行具体的随机
//应该把取出来的 方块具体的形态信息 存起来 用于之后变形
nowBlockInfo = blockInfoDic[type];
//随机几种形态中的一种来设置方块的信息吧
int index = r.Next(0, nowBlockInfo.Count);
//取出其中一种形态的坐标信息
Position[] pos = nowBlockInfo[index];
for (int i = 0; i < pos.Length; i++)
{
//取出来的pos是相对原点方块的坐标 所以需要进行计算
blocks[i + 1].pos = blocks[0].pos + pos[i];
}
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com