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

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

首先是图片相关的部分:图片等比例缩放+分割,以下是相关代码

    public static class Helpers
    {
        /// <summary>
        /// 获取等比例缩放的图片(高宽不一致时获取最中间部分的图片)
        /// </summary>
        /// <param name="fromImage"></param>
        /// <param name="width">要获取的宽度</param>
        /// <param name="height">要获取的高度</param>
        /// <returns></returns>
        public static Image AdjImageToFitSize(this Image fromImage, int width, int height)
        {
            Bitmap bitmap = new Bitmap(width, height);
            Graphics graphics = Graphics.FromImage(bitmap);
            Point point = new Point(0, 0);
            Point point2 = new Point(width, 0);
            Point point3 = new Point(0, height);
            Point[] destPoints = new Point[] { point, point2, point3 };
            Rectangle rect = GetImageRectangle(fromImage);
            graphics.DrawImage(fromImage, destPoints, rect, GraphicsUnit.Pixel);
            Image image = Image.FromHbitmap(bitmap.GetHbitmap());
            bitmap.Dispose();
            graphics.Dispose();
            return image;
        }
        private static Rectangle GetImageRectangle(Image fromImage)
        {//居中位置获取
            int x = 0;
            int y = 0;
            int height = fromImage.Height;
            int width = fromImage.Width;
            if (fromImage.Height > fromImage.Width)
            {
                height = fromImage.Width;
                y = (fromImage.Height - fromImage.Width) / 2;
            }
            else
            {
                width = fromImage.Height;
                x = (fromImage.Width - fromImage.Height) / 2;
            }
            return new Rectangle(x, y, width, height);
        }

        /// <summary>
        /// 将图片切割成小图片,图片顺序为先水平后垂直
        /// </summary>
        /// <param name="fromImage"></param>
        /// <param name="cx">x方向切割数</param>
        /// <param name="cy">y方向切割数</param>
        /// <returns></returns>
        public static Image[] SplitToSmallImages(this Image fromImage, int cx, int cy)
        {
            Image[] imgs = new Image[cx * cy];
            int nWidth = fromImage.Width / cx;
            int nHeight = fromImage.Height / cy;
            Bitmap image = new Bitmap(nWidth, nHeight);
            Graphics graphics = Graphics.FromImage(image);
            for (int i = 0; i < cy; i++)
            {
                for (int j = 0; j < cx; j++)
                {
                    graphics.DrawImage(fromImage, 0, 0, new Rectangle(j * nWidth, i * nHeight, nWidth, nHeight), GraphicsUnit.Pixel);
                    Image img = Image.FromHbitmap(image.GetHbitmap());
                    int idx = j + i * cx;
                    img.Tag = idx;
                    imgs[idx] = img;
                }
            }
            return imgs;
        }
    }

然后各种点击、拖动交互的就不多说了,可以自行去下载代码后查看,因为图片分割的时候是分割成了一维数组,这里就说下如何根据索引编号获取对应的二维数组,下面是相关代码片段,上面的代码中在切割图片时已经采用了先水平后垂直的方式,那根据索引获取二维位置也就只要这样就行了,即水平位置的计算方式为 索引号%每行分割块数,垂直位置的计算方式为 索引号/每行分割块数,当然下面的代码中不是通过索引来获取x,y进行对比,而是根据x,y获取对应索引

            int idx = (int)e.Data.GetData(typeof(int));
            Point p = this.pnl_DragOn.PointToClient(new Point(e.X, e.Y));
            int x = p.X / this.SideLength;//计算x方向上的位置
            int y = p.Y / this.SideLength;//计算y方向上的位置
            if (idx == x + this.ImgNumbers * y)//判断图片位置是否与计算出来的位置一致
            {
                Graphics graphics = this.pnl_DragOn.CreateGraphics();
                graphics.DrawImage(this._dragPic.Image, x * this.SideLength, y * this.SideLength);
                this._dragPic.Image = null;//图片放置后,移除Box上的Image
                if (!this._splitPictureBoxes.Any(pb => pb.Image != null))
                {
                    MessageBox.Show("恭喜你,图片拼好了");
                }
            }

源码下载

时间: 2024-10-05 09:21:19

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

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

与第一篇一样,同属简单Demo,这个在开始做的时候,想的是将PictureBox拖动到另一个PictureBox上,如果PictureBox没图片,就将Image传递,但想法是简单的,事实是复杂的:首先PictureBox不支持DragEnter和DragDrop事件,所以后面将图片的载体换成了Panel:其次图片全随机打乱不行,第一行的最后一张图片是不能随机的,必须为特定图片(当然这是因为这个Demo是所有小图都存在的,其实也可以做成随机取消一块图片的拼图游戏,只要在此Demo上做些调整):最

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

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

JavaScript版拼图小游戏

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

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

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

仿苹果电脑任务栏菜单&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-

swift 拼图小游戏

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

jQuery拼图小游戏

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

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

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

速度挑战 - 2小时完成HTML5拼图小游戏

初学lufylegend.js之日,我用lufylegend.js开发了第一个HTML5小游戏--拼图游戏,还写了篇博文来炫耀一下:HTML5小游戏<智力大拼图>发布,挑战你的思维风暴.不过当时初学游戏开发,经验浅薄,所以没有好好专研游戏里的算法和代码的缺陷,导致游戏出现了很多bug,甚至拼图打乱后很可能无法复原.最近经常有朋友问起这个游戏,希望我能把代码里的bug改一下方便初学者学习,顺便我也打算测试一下自己写这种小游戏的速度,所以就抽出了一些时间将这个游戏从头到尾重新写了一遍,计算了一下用