玩无限消乐的设计示例(基础篇)随机布局

一盘游戏刚开始,布局一定是不能有直接可消的排列,为此要生成一个横竖都无连续3个相同动画元素的布局,就要用到随机生成,还要有检查重复的功能。
1.随机生成元素代码:
        private void 布局生成()
        {
            int 列数 = 0, 行数 = 0, 数量 = 19;
            while (行数 < 数量 - 2)
            {
                列数 = 0;
                while (列数 < 数量)
                {
                    int 随机数 = new Random(DateTime.Now.Millisecond).Next(100, 119);
                    if (列检查(行数, 列数, 随机数))
                    {
                        玩无限消乐.Rows[行数].Cells[列数].Tag = 随机数;
                        玩无限消乐.Rows[行数].Cells[列数++].Value = new Bitmap("动画素材/e" + 随机数.ToString() + ".gif");
                    }
                }
                行数++;
            }
        }

2.检查重复元素代码:
        private bool 列检查(int 行数, int 列数, int 随机数)
        {
            int 重复 = 0;
            if (列数 >= 2)
            {
                int 起列 = 列数 - 2;
                while (起列 < 列数)
                    if ((int)玩无限消乐.Rows[行数].Cells[起列++].Tag == 随机数)
                        ++重复;
            }
            return 重复 >= 2 ? false : true;
        }
首先写了列的重复检查,运行结果发现会有横向连3元素发生,因此,修改相关代码:
        private void 布局生成()
        {
            int 列数 = 0, 行数 = 0, 数量 = 19;
            while (行数 < 数量 - 2)
            {
                列数 = 0;
                while (列数 < 数量)
                {
                    int 随机数 = new Random(DateTime.Now.Millisecond).Next(100, 119);
                    if (检查重复(行数, 列数, 随机数) && 检查重复(行数, 列数, 随机数, false))
                    {
                        玩无限消除.Rows[行数].Cells[列数].Tag = 随机数;
                        玩无限消除.Rows[行数].Cells[列数++].Value = new Bitmap("动画素材/e" + 随机数.ToString() + ".gif");
                    }
                }
                行数++;
            }
        }
        private bool 检查重复(int 行数, int 列数, int 随机数, bool 控 = true)
        {
            int 重复 = 0;/*检查前面2个是否重复,从而生成不连续3个重复的*/
            if ((控 ? 列数 : 行数) >= 2)
            {
                int 起数 = (控 ? 列数 : 行数) - 2;
                while (起数 < 列数)
                    if ((int)玩无限消除.Rows[控 ? 行数 : 起数++].Cells[控 ? 起数++ : 列数].Tag == 随机数)
                        ++重复;
            }
            return 重复 >= 2 ? false : true;
        }

修改窗体初始代码:
        private void Form1_Load(object sender, EventArgs e)
        {
            this.TopMost = true;
            //System.Threading.Thread.Sleep(2000);
            玩无限消乐.AllowDrop = true;
            玩无限消乐.AllowUserToAddRows = false;
            玩无限消乐.AllowUserToOrderColumns = false;
            玩无限消乐.AllowUserToResizeColumns = false;
            玩无限消乐.AllowUserToResizeRows = false;
            玩无限消乐.ReadOnly = true;
            玩无限消乐.Anchor = (AnchorStyles.Top | AnchorStyles.Left);
            //玩无限消乐.Location = new Point(0, 27);
            玩无限消乐.BackgroundColor = System.Drawing.Color.Linen;
            玩无限消乐.ColumnHeadersVisible = false;
            玩无限消乐.MultiSelect = false;
            玩无限消乐.RowHeadersVisible = false;
            玩无限消乐.ScrollBars = ScrollBars.None;
            //玩无限消乐.Capture = true;
            玩无限消乐.AutoSize = true;
            //玩无限消乐.ColumnCount = 14;
            int 列数 = 0, 数量 = 19;
            while (列数++ < 数量)
            { DataGridViewImageColumn 新图列 = new DataGridViewImageColumn(); 玩无限消乐.Columns.Add(新图列); }
            玩无限消乐.RowCount = 数量 - 2;
            玩无限消乐.AutoResizeColumns();
            布局生成();
        }

运行结果如下图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值