【Demo】拼图小游戏 winform (二) 只能在空格区域移动的拼图

与第一篇一样,同属简单Demo,这个在开始做的时候,想的是将PictureBox拖动到另一个PictureBox上,如果PictureBox没图片,就将Image传递,但想法是简单的,事实是复杂的:首先PictureBox不支持DragEnter和DragDrop事件,所以后面将图片的载体换成了Panel;其次图片全随机打乱不行,第一行的最后一张图片是不能随机的,必须为特定图片(当然这是因为这个Demo是所有小图都存在的,其实也可以做成随机取消一块图片的拼图游戏,只要在此Demo上做些调整);最后还有如何确认Panel是否允许拖动的问题。游戏玩法就是在小图片上按住鼠标拖动到空白区域(只有临近空白的几个方块允许拖动,只要将源码中一行代码取消注销掉,就可以取消掉这个限制),下面是运行时的截图,同样弄了个妹子赏眼点

与前一篇Demo相比,现在分割出来的小图片载体Panel既要接受MouseDown事件,又要接受DragEnter以及DragDrop事件,在MouseDown事件中确认该图片是否允许拖动,而是否允许拖动的判断逻辑就是:当前点击的Panel的Tag是否不为null(这里用Tag来判断是否空白区域),并且该Panel的上下左右四块区域是否有空白区域或为边界,至于索引如何换算成二维数组位置与第一篇中的规则一样,下面即为MouseDown事件执行的代码

      private void panel_MouseDown(object sender, MouseEventArgs e)
        {
            Panel panel = (Panel)sender;
            if (panel.Tag != null)
            {
                bool allowed;
                if (panel.Name.Contains('_'))
                {//非emptyPanel
                    int idx = int.Parse(panel.Name.Split('_')[1]);
                    int x = idx % this.ImgNumbers;//换算成x方向上第几块
                    int y = idx / this.ImgNumbers;//换算成y方向上第几块
                    //只要上下左右四个方向上是否有一个Panel是允许拖动的,就可以拖动
                    allowed = this.AllowDragDrop(x - 1, y) || this.AllowDragDrop(x + 1, y) || this.AllowDragDrop(x, y - 1) || this.AllowDragDrop(x, y + 1);
                }
                else
                {//emptyPanel只需要判断第N-1块是不是为空
                    allowed = this._splitPanels[this.SpecialIndex].Tag == null;
                }
                //allowed = true;//取消注释可以任意位置调整拼图
                if (allowed)
                {
                    this._dragPanel = panel;
                    panel.DoDragDrop(this._dragPanel.Tag, DragDropEffects.Move | DragDropEffects.Copy);
                }
            }
        }

对于AllowDragDrop,这里单独说明:if判断该x,y是否能够获取到对应Panel,如果获取不到,则代表已出了临界范围,肯定不能拖动;如果能取到Panel,这里又分两种情况,一种是第一行额外增加的专用于显示特定图片的Panel,还有就是正常分割出来的Panel,如果Panel对应的Tag为null,则代表该Panel为空白区域

        /// <summary>
        /// 判断特定的panel是否允许拖动
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        private bool AllowDragDrop(int x, int y)
        {
            bool allowed = true;
            if (x < 0 || y < 0 || y >= this.ImgNumbers || (x >= this.ImgNumbers && y > 0))
            {//不存在panel
                allowed = false;
            }
            else
            {
                if (x >= this.ImgNumbers && y == 0)
                {
                    allowed = this._emptyPanel.Tag == null;
                }
                else
                {
                    allowed = this._splitPanels[x + y * this.ImgNumbers].Tag == null;
                }
            }
            return allowed;
        }

最后的DragDrop事件这里就不多说了,跟文章开头说的一样,直接传递Image并修正Tag,同时修正AllowDrop属性

      void panel_DragDrop(object sender, DragEventArgs e)
        {
            Panel panel = (Panel)sender;
            panel.Tag = this._dragPanel.Tag;
            panel.BackgroundImage = this._splitImages[(int)panel.Tag];
            panel.AllowDrop = false;
            this._dragPanel.Tag = null;
            this._dragPanel.AllowDrop = true;
            this._dragPanel.BackgroundImage = null;

            if (this._emptyPanel.Tag == null && !this._splitPanels.Any((p) => string.Format("pnl_{0}", p.Tag) != p.Name))
            {//空Panel不再包含tag,并且Panel对应Tag顺序正确
                this._emptyPanel.AllowDrop = false;
                MessageBox.Show("恭喜你,图片拼好了");
            }
        }

源码下载,在Program.cs里面Application.Run(new
RandomPictureForm2())运行即为此博客对应Demo

时间: 2024-11-17 04:11:36

【Demo】拼图小游戏 winform (二) 只能在空格区域移动的拼图的相关文章

【Demo】拼图小游戏 winform (一) 简单的拖动拼图

简单的Demo,可以用于学习Image的处理.winform里的拖动事件,也可以用于广大学生党的作业 (其实这就是帮学生党解决的作业,只不过后来又调整了下--),因为是Demo,所以代码也就随便了些,下面是运行时的截图,弄个妹子赏眼点,游戏方式就是将随机打乱的图片拖动到待拼图区域,如果位置一致时,在鼠标松开,图片就会被绘制到待拼图区域,同时在随机打乱的图片中移除这一块区域 首先是图片相关的部分:图片等比例缩放+分割,以下是相关代码 public static class Helpers { //

swift 拼图小游戏

根据这位朋友的拼图小游戏改编 http://tangchaolizi.blog.51cto.com/3126463/1571616 改编主要地方是: 原本着我仁兄的代码时支持拖动小图块来移动的,我参照之前自己java当初写的,其实不需要拖动,因为只有一个空出来地方,那么通过点击事件,接受到点击事件的小图只能向一个方向移动或者不能移动. 通过对这个游戏的学习,我也算是第一次用swift写一个有用的代码,大家互相学习. 代码下载位置 版权声明:本文为博主原创文章,未经博主允许不得转载.

《C++ Qt 设计模式》8|15拼图 小游戏的简单实现。拜托,别乱点!

第零章:介绍 看到这个游戏了,感觉蛮好玩的,实现了一下. 界面如下: 游戏玩法:在3×*3的矩阵中,每个按钮都可以点击,如果按钮四周有一个是空白,则点击此按钮则会移动到这个空白.按钮字母顺序变成“ABCD……”这样有序就赢了,最后空格可以出现在任何地方. 第一章:构思 设计模式基本上没接触过,所以就没有按书上的方式,自己想了大概要怎么实现,可能自己像的没有它给出的方式好吧,但是毕竟是菜鸟嘛,一步一步来! 1.用什么装这些按钮 学习了QGridLayOut,“The QGridLayout cla

JavaScript版拼图小游戏

慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 在线预览(Chrome):http://sandbox.runjs.cn/show/pcwfu7i5 拼图游戏其实挺简单,主要是涉及到一些细节的处理,以下是我的自己在实现中涉及到的问题: 图片的切割与拼接 如何随机布局 如何切换图片 拖动图片溢出处理 怎么知道图片是否还原成功 实现思路: 为了简单

仿苹果电脑任务栏菜单&amp;&amp;拼图小游戏&amp;&amp;模拟表单控件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

从头开始构建web前端应用——字符炸弹小游戏(二)

接上篇.欢迎指正. 现在,需要考虑如何拆分文件. 拆分文件的目的,是为了方便代码管理.很显然,样式表,网页源文件,js代码需要放在不同的地方.另外,对于前端开发来说,主要的逻辑控制流程,都在js文件里面,所以,还需要拆分js文件.我个人习惯上按功能模块来拆分.在拆分前,你需要仔细思考一下,每一个函数和其他函数之间的关联度,尽量做到相关功能函数在一个文件里. ok,开工.在html所在文件目录下创建2个新文件夹,分别命名为css,js. 1.拆分css. css样式表写的不多,直接在css文件夹下

jQuery拼图小游戏

jQuery拼图小游戏 最后样式 核心代码部分 <script type="text/javascript" > $(function () { $("td").click(function () { //获取点击的图片的id id = parseInt($(this).prop("id")); //向下 if (id + 3 < 10 && $("td[id=" + (id + 3) + &

绅士向纯原生250行拼图小游戏

拼图小游戏 先来预览,咳咳,这个比上次那个地鼠会好看点-- 代码是可以设置难度的,3就是9,9就是81-- 相比来说,此程序难度可是远远高过打地鼠的,希望小伙伴能跟上~ html <header> <button ='Game.restart()'>重新开始</button> <button id="download" ='Game.openImage()'>新标签打开图片</button> </header> &

拼图小游戏之计算后样式与CSS动画的冲突

先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲剧了,出现了一些不理解的情况.这个错误比较低级,不过还是被我遇到了,就拿来记录一下. 注意: 在交换每张图片位置的时候,我对它们设置了CSS中transition属性,有了缓冲动画效果,这样一来,每次打乱图片的时候,用getComputedStyle获取计算后样式,但是,动画有时长,而获取样式在触发时就完成了