7.地图结构体

7.游戏场景-地图结构体


7.1 知识点

class 语句块外 namespace 语句块内

创建地图类型

struct Map
{
}

格子类型数组

public Grid[] grids;

初始化地图构造函数

/// <summary>
/// 初始化地图构造函数中,初始了各个格子的类型和位置
/// </summary>
/// <param name="x">起始格子的 x 坐标</param>
/// <param name="y">起始格子的 y 坐标</param>
/// <param name="num">格子的数量</param>
public Map(int x, int y, int num)
{
}

给格子类型数组分配新房间

grids = new Grid[num];

创建随机和随机变量,用于随机创建不同类型的格子

Random r = new Random();
int randomNum;

创建用于位置改变计数的变量

// 表示 X 变化的次数
int indexX = 0;
// 表示 Y 变化的次数
int indexY = 0;
// x 的步长,可以用于反向
int stepNum = 2;

创建绘制格子的循环

for (int i = 0; i < num; i++)
{
}

设置随机变量

randomNum = r.Next(0, 101);

根据随机变量的值设置格子类型

// 有 85% 的几率是普通格子(首尾两个格子必为普通格子)
if (randomNum < 85 || i == 0 || i == num - 1)
{
    grids[i].type = E_Grid_Type.Normal;
}
// 有 5% 的几率是炸弹
else if (randomNum >= 85 && randomNum < 90)
{
    grids[i].type = E_Grid_Type.Boom;
}
// 有 5% 的几率是暂停
else if (randomNum >= 90 && randomNum < 95)
{
    grids[i].type = E_Grid_Type.Pause;
}
// 有 5% 的几率是时空隧道
else
{
    grids[i].type = E_Grid_Type.Tunnel;
}

根据位置改变计数的变量设置格子位置

// 给格子的位置创建新房间
grids[i].pos = new Vector2(x, y);

// 每次循环都应该按一定规则去变化位置

// 如果 X 的计数累加了 10 次
if (indexX == 10)
{
    // 格子位置的 y 坐标就要加 1
    y += 1;

    // Y 的计数加 1
    ++indexY;

    // 如果 Y 的计数累加了 2 次
    if (indexY == 2)
    {
        // X 和 Y 的计数都清 0
        indexX = 0;
        indexY = 0;

        // 反向步长,蛇形地图
        stepNum = -stepNum;
    }
}
// 如果 X 的计数没有累加 10 次
else
{
    // 格子位置的 x 坐标就要加一个步长的值
    x += stepNum;

    // X 的计数加 1
    ++indexX;
}

class 语句块内 主函数外 游戏场景逻辑函数内

绘制地图

// 初始化一张地图 
Map map = new Map(14, 3, 80);
// 调用地图的画方法
map.Draw();

7.2 知识点代码

class语句块外 namespace语句块内

//创建地图类型
struct Map
{
    //格子类型数组
    public Grid[] grids;

    //初始化地图构造函数
    /// <summary>
    /// 初始化地图构造函数中 初始了 各个格子的 类型 和 位置
    /// </summary>
    /// <param name="x">其实格子的x坐标</param>
    /// <param name="y">其实格子的y坐标</param>
    /// <param name="num">格子的数量</param>
    public Map(int x, int y, int num)
    {
        //给格子类型数组分配新房间
        grids = new Grid[num];

        //创建随机和随机变量 用于随机创建不同类型的格子
        Random r = new Random();
        int randomNum;

        //创建用于位置改变计数的变量

        //表示X变化的次数
        int indexX = 0;
        //表示Y变化的次数
        int indexY = 0;
        //x的步长 可以用于反向
        int stepNum = 2;

        //创建绘制格子的循环
        for (int i = 0; i < num; i++)
        {
            //设置随机变量
            randomNum = r.Next(0, 101);

            //根据随机变量的值 设置格子类型

            //有85%几率 是普通普通格子(首尾两个格子 必为普通格子)
            if (randomNum < 85 || i == 0 || i == num - 1)
            {
                grids[i].type = E_Grid_Type.Normal;
            }
            //有5%的几率 是炸弹
            else if (randomNum >= 85 && randomNum < 90)
            {
                grids[i].type = E_Grid_Type.Boom;
            }
            //有5%的几率 是暂停
            else if (randomNum >= 90 && randomNum < 95)
            {
                grids[i].type = E_Grid_Type.Pause;
            }
            //有5%的几率 是时空隧道
            else
            {
                grids[i].type = E_Grid_Type.Tunnel;
            }

            //根据位置改变计数的变量 设置格子位置

            //给格子的位置创建新房间
            grids[i].pos = new Vector2(x, y);

            //每次循环都应该按一定规则去变化位置

            //如果X的计数累加了10次
            if (indexX == 10)
            {
                //格子位置的y坐标就要加1
                y += 1;

                //Y的计数加1
                ++indexY;

                //如果Y的计数累加了2次
                if (indexY == 2)
                {
                    //X和Y的计数都清0
                    indexX = 0;
                    indexY = 0;

                    //反向步长 蛇形地图
                    stepNum = -stepNum;
                }
            }
            //如果X的计数没有累加10次
            else
            {
                //格子位置的x坐标就要加一个步长的值
                x += stepNum;

                //X的计数加1
                ++indexX;
            }
        }
    }

    public void Draw()
    {
        for (int i = 0; i < grids.Length; i++)
        {
            grids[i].Draw();
        }
    }
}

class语句块内 主函数外 游戏场景逻辑函数内

//绘制地图

//初始化一张地图 
Map map = new Map(14, 3, 80);
//调用地图的画方法
map.Draw();


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏