玩无限消乐的设计示例(基础篇)交换元素操作

本文介绍了一种使用拖放操作来实现两个元素位置交换的方法,并通过具体的编程实例展示了如何在.NET环境中利用C#语言实现这一功能。代码示例中详细说明了如何捕获拖动事件并完成元素间的动画交换。
拖放操作交换2个元素位置,在拖放事件方法中进行编码:
        private void 玩无限消乐_DragDrop(object sender, DragEventArgs e)
        {
            Point 平面二维 = 玩无限消乐.PointToClient(new Point(e.X, e.Y));
            玩无限消乐.Rows[选定坐标[1]].Cells[选定坐标[2]].Value = 玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value;
            玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value = (System.Drawing.Bitmap)e.Data.GetData(typeof(System.Drawing.Bitmap));/*System.String*/
        }

        private void 玩无限消乐_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All;
        }
        int[] 选定坐标 = new int[3];
        private void 玩无限消乐_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            选定坐标[0] = (int)玩无限消乐.Rows[e.RowIndex].Cells[e.ColumnIndex].Tag;
            选定坐标[1] = e.RowIndex; 选定坐标[2] = e.ColumnIndex;
            玩无限消乐.DoDragDrop(玩无限消乐.Rows[e.RowIndex].Cells[e.ColumnIndex].Value, DragDropEffects.All);
        }
为了记住开始拖放单元格位置,设置全局数组:选定坐标,用于存储行和列的序号及该单元格动画附加代表值;
之上代码直接用拖放事件中的e参数获得事件数据进行交换动画元素,还有一个办法是直接用选定坐标附加值进行交换动画元素:
        private void 玩无限消乐_DragDrop(object sender, DragEventArgs e)
        {
            Point 平面二维 = 玩无限消乐.PointToClient(new Point(e.X, e.Y));
            玩无限消乐.Rows[选定坐标[1]].Cells[选定坐标[2]].Value = 玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value;
            玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value = new Bitmap("动画素材/e" + 选定坐标[0].ToString() + ".gif");
        }

至此,完成了初步的编程,为下次进行动画消除做好预备工作。
        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;
            //玩无限消乐.Cursor =
            //玩无限消乐.Capture = true;
            玩无限消乐.AutoSize = true;
            //玩无限消乐.ColumnCount = 14;
            int 列数 = 0, 数量 = 19;
            while (列数++ < 数量)
            { DataGridViewImageColumn 新图列 = new DataGridViewImageColumn(); 玩无限消乐.Columns.Add(新图列); }
            玩无限消乐.RowCount = 数量 - 2;
            玩无限消乐.AutoResizeColumns();
            布局生成();
        }
        private void 玩无限消乐_DragDrop(object sender, DragEventArgs e)
        {
            Point 平面二维 = 玩无限消乐.PointToClient(new Point(e.X, e.Y));
            玩无限消乐.Rows[选定坐标[1]].Cells[选定坐标[2]].Value = 玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value;//new Bitmap("动画素材/e" + 选定坐标[0].ToString() + ".gif");
            玩无限消乐.Rows[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex].Cells[玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex].Value = (System.Drawing.Bitmap)e.Data.GetData(typeof(System.Drawing.Bitmap));/*System.String*/
        }
        private void 玩无限消乐_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.All;
        }
        int[] 选定坐标 = new int[3];
        private void 玩无限消乐_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            选定坐标[0] = (int)玩无限消乐.Rows[e.RowIndex].Cells[e.ColumnIndex].Tag;
            选定坐标[1] = e.RowIndex; 选定坐标[2] = e.ColumnIndex;
            玩无限消乐.DoDragDrop(玩无限消乐.Rows[e.RowIndex].Cells[e.ColumnIndex].Value, DragDropEffects.All);
        }
        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;
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值