文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#怎么实现拼图游戏

2023-06-20 17:47

关注

这篇文章主要介绍“C#怎么实现拼图游戏”,在日常操作中,相信很多人在C#怎么实现拼图游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么实现拼图游戏”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

本文实例为大家分享了C#实现拼图游戏的具体代码,供大家参考,具体内容如下

(一)需求:(这个需求书写较为简单)

(二)设计:

使用VS的c#来实现

界面设计:picturebox控件来显示图片,button控件来实现按钮点击的各类事件:图片重排、换图、查看原图等,使用numericUpDown控件来控制切割的边数。如下图:

C#怎么实现拼图游戏

把要拼的图片放进resource文件里
设计函数,使用cutpicture类来切割图片

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Drawing;using System.Drawing.Imaging;using System.Windows.Forms;namespace 拼图游戏{    class CutPicture    {        public static string picturePath = "";        public static List<Bitmap> BitMapList = null;        public static Image Resize(string path, int iwidth, int iheignt)        {            Image thumbnail = null;            try            {                var img = Image.FromFile(path);                thumbnail = img.GetThumbnailImage(iwidth, iheignt, null, IntPtr.Zero);                thumbnail.Save(Application.StartupPath.ToString() + "//Picture//img.jpeg");            }            catch (Exception exp)            {                Console.WriteLine(exp.Message);            }            return thumbnail;        }        public static Bitmap Cut(Image b, int startX, int startY, int iwidth, int iheight)        {            if (b == null)            { return null; }            int w = b.Width;            int h = b.Height;            if (startX >= w || startY >= h)            { return null; }            if (startX + iwidth > w)            { iwidth = w - startX; }            if (startY + iheight > h)            { iheight = h - startY; }            try            {                Bitmap bmpout = new Bitmap(iwidth, iheight, PixelFormat.Format24bppRgb);                Graphics g = Graphics.FromImage(bmpout);                g.DrawImage(b, new Rectangle(0, 0, iwidth, iheight), new Rectangle(startX, startY, iwidth, iheight),                    GraphicsUnit.Pixel);                g.Dispose();                return bmpout;            }            catch            {                return null;            }        }    }}

Form_Main函数为主函数

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.IO;namespace 拼图游戏{    public partial class Form_Main : Form    {        PictureBox[] picturelist = null;        SortedDictionary<string, Bitmap> pictureLocationDict = new SortedDictionary<string, Bitmap>();        Point []pointlist=null;        SortedDictionary<string, PictureBox > pictureBoxLocationDict = new SortedDictionary<string, PictureBox>();                PictureBox currentpicturebox = null;        PictureBox havetopicturebox = null;        Point oldlocation = Point.Empty;        Point newlocation = Point.Empty;        Point mouseDownPoint = Point.Empty;        Rectangle rect = Rectangle.Empty;        bool isDrag = false;        public string originalpicpath;        private int Imgnubers        {            get            {                return (int)this.numericUpDown1.Value;            }        }        private int sidelength        {            get { return 600 / this.Imgnubers; }        }        public void InitRandomPictureBox()        {            pnl_Picture.Controls.Clear();            picturelist = new PictureBox[Imgnubers * Imgnubers];            pointlist = new Point [Imgnubers * Imgnubers];                       for (int i = 0; i < this.Imgnubers; i++)            {                for (int j = 0; j < this.Imgnubers; j++)                {                    PictureBox pic = new PictureBox();                    pic.Name = "picturebox" + (j + i * Imgnubers + 1).ToString();                    pic.Location = new Point(j * sidelength, i * sidelength);                    pic.Size = new Size(sidelength, sidelength);                    pic.Visible = true;                    pic.BorderStyle = BorderStyle.FixedSingle;                    pic.MouseDown += new MouseEventHandler(picture_MouseDown);                    pic.MouseMove += new MouseEventHandler(picture_MouseMove);                    pic.MouseUp += new MouseEventHandler(picture_MouseUp);                    pnl_Picture.Controls.Add(pic);                    picturelist[j + i * Imgnubers] = pic;                    pointlist[j + i * Imgnubers] = new Point(j * sidelength, i * sidelength);                }            }        }        public void Flow(string path, bool disorder)        {            InitRandomPictureBox();            Image bm = CutPicture.Resize(path, 600, 600);            CutPicture.BitMapList = new List<Bitmap>();            for(int y=0;y<600;y+=sidelength )            {                for (int x = 0; x < 600; x += sidelength)                {                    Bitmap temp = CutPicture.Cut(bm, x, y, sidelength, sidelength);                    CutPicture.BitMapList.Add(temp);                }            }                ImporBitMap(disorder );        }        public void ImporBitMap(bool disorder)        {            try            {                int i=0;                foreach (PictureBox item in picturelist )                {                    Bitmap temp = CutPicture.BitMapList[i];                    item.Image = temp;                    i++;                }                if(disorder )ResetPictureLoaction();            }            catch (Exception exp)            {                Console .WriteLine (exp.Message );            }        }        public void ResetPictureLoaction()        {            Point[] temp = DisOrderLocation();            int i = 0;            foreach (PictureBox item in picturelist)            {                item.Location = temp[i];                i++;            }        }        public Point[] DisOrderLocation()        {            Point[] tempArray = (Point[])pointlist.Clone();            for (int i = tempArray.Length - 1; i > 0; i--)            {                Random rand = new Random();                int p = rand.Next(i);                Point temp = tempArray[p];                tempArray[p] = tempArray[i];                tempArray[i] = temp;            }            return tempArray;        }          private void Form_Main_Load(object sender, EventArgs e)        {                }        public void initgame()        {            if (!Directory.Exists(Application.StartupPath.ToString() + "//Resources"))            {                Directory.CreateDirectory(Application.StartupPath.ToString() + "//Resources");                Properties.Resources._0.Save(Application.StartupPath.ToString() + "//Resources//0.jpg");                Properties.Resources._1.Save(Application.StartupPath.ToString() + "//Resources//1.jpg");                Properties.Resources._2.Save(Application.StartupPath.ToString() + "//Resources//2.jpg");                Properties.Resources._3.Save(Application.StartupPath.ToString() + "//Resources//3.jpg");                Properties.Resources._4.Save(Application.StartupPath.ToString() + "//Resources//4.jpg");            }            Random r=new Random ();            int i=r.Next (5);            originalpicpath = Application.StartupPath.ToString() + "//Resources//" + i.ToString() + ".jpg";            Flow(originalpicpath ,true );        }        public PictureBox GetPictureBoxByLocation(int x, int y)        {            PictureBox pic = null;            foreach (PictureBox item in picturelist)            {                if (x > item.Location.X && y > item.Location.Y && item.Location.X + sidelength > x && item.Location.Y + sidelength > y)                { pic = item; }            }            return pic;        }        public PictureBox GetPictureBoxByHashCode(string hascode)        {            PictureBox pic = null;            foreach (PictureBox item in picturelist)            {                if (hascode == item.GetHashCode().ToString())                {                    pic = item;                }            }            return pic;        }        private void picture_MouseDown(object sender, MouseEventArgs e)        {            oldlocation = new Point(e.X, e.Y);            currentpicturebox = GetPictureBoxByHashCode(sender.GetHashCode().ToString());            MoseDown(currentpicturebox, sender, e);        }        public void MoseDown(PictureBox pic, object sender, MouseEventArgs e)        {            if (e.Button == MouseButtons.Left)            {                oldlocation = e.Location;                rect = pic.Bounds;            }        }                private void picture_MouseMove(object sender, MouseEventArgs e)        {            if (e.Button == MouseButtons.Left)            {                isDrag = true;                rect.Location = getPointToForm(new Point(e.Location.X - oldlocation.X, e.Location.Y - oldlocation.Y));                this.Refresh();            }        }        private Point getPointToForm(Point p)        {            return this.PointToClient(pictureBox1 .PointToScreen (p));        }        private void reset()        {            mouseDownPoint = Point.Empty;            rect = Rectangle.Empty;            isDrag = false;        }        private void picture_MouseUp(object sender, MouseEventArgs e)        {            oldlocation = new Point(currentpicturebox .Location .X ,currentpicturebox .Location .Y );            if (oldlocation.X + e.X > 600 || oldlocation.Y + e.Y > 600 || oldlocation.X + e.X < 0 || oldlocation.Y + e.Y < 0)            {                return;            }            havetopicturebox  = GetPictureBoxByLocation(oldlocation.X + e.X, oldlocation.Y + e.Y);            newlocation = new Point(havetopicturebox.Location.X, havetopicturebox.Location.Y);            havetopicturebox.Location = oldlocation;            PictureMouseUp(currentpicturebox, sender, e);            if (Judge())            {                MessageBox.Show("恭喜拼图成功");              }        }        public void PictureMouseUp(PictureBox pic, object sender, MouseEventArgs e)        {            if (e.Button == MouseButtons.Left)            {                if (isDrag)                {                    isDrag = false;                    pic.Location = newlocation;                    this.Refresh();                }                reset();            }        }        public bool Judge()//判断是否成功        {            bool result=true;            int i=0;            foreach (PictureBox item in picturelist)            {                if (item.Location != pointlist[i])                { result = false; }                i++;            }            return result;        }        public void ExchangePictureBox(MouseEventArgs e)        { }        public PictureBox[] DisOrderArray(PictureBox[] pictureArray)        {            PictureBox[] tempArray = pictureArray;            for (int i = tempArray.Length - 1; i > 0; i--)            {                Random rand = new Random();                int p = rand.Next(i);                PictureBox temp = tempArray[p];                tempArray[p] = tempArray[i];                tempArray[i] = temp;            }            return tempArray;        }          public Form_Main()        {            InitializeComponent();            initgame();        }        private void pnl_Picture_Paint(object sender, PaintEventArgs e)        {        }        private void splitContainer1_Panel1_Paint(object sender, PaintEventArgs e)        {        }        private void btn_import_Click(object sender, EventArgs e)        {            if (new_picture.ShowDialog() == DialogResult.OK)            {                originalpicpath = new_picture.FileName;                CutPicture.picturePath = new_picture.FileName;                Flow(CutPicture.picturePath, true);            }                    }         private void btn_changepic_Click(object sender, EventArgs e)        {            Random r = new Random();            int i = r.Next(5);            originalpicpath = Application.StartupPath.ToString() + "//Resources//" + i.ToString() + ".jpg";            Flow(originalpicpath, true);        }        private void btn_Reset_Click(object sender, EventArgs e)        {            Flow(originalpicpath, true);        }        private void btn_originalpic_Click(object sender, EventArgs e)        {            Form_Original original = new Form_Original();            original.picpath = originalpicpath;            original.ShowDialog();        }        private void button1_Click(object sender, EventArgs e)        {            timer1.Start();            timer1.Enabled = true;            timer1.Interval = 10000;                              }        private void timer1_Tick(object sender, EventArgs e)        {            if (Judge())            { MessageBox.Show("挑战成功"); timer1.Stop(); }            else { MessageBox.Show("挑战失败"); timer1.Stop(); }        }    }}

ps:挑战模式貌似有点小问题,没法显示倒数的时间在页面上,体验感觉不好。

接下来是设计显示原图的页面,只需要一个picturebox即可,代码如下:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace 拼图游戏{    public partial class Form_Original : Form    {        public string picpath;        public Form_Original()        {            InitializeComponent();        }        private void pic_Original_Click(object sender, EventArgs e)        {        }        private void Form_Original_Load(object sender, EventArgs e)        {            pic_Original.Image = CutPicture.Resize(picpath, 600, 600);        }    }}

到此,关于“C#怎么实现拼图游戏”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯