拼图游戏

1、系统概述

本次实验的主要内容是设计开发一个趣味拼图游戏,其功能是对加载的图片进行分割(如分割成3×3矩阵或其他类型矩阵)并随机加载到图片框矩阵中,用户使用鼠标拖动图片框中的图片进行拼图,系统能够自动判别拼图是否成功并进行提示。

2、系统设计

2.1 设计目标

拼图游戏开发及其项目扩展

2.2 设计分析与算法流程

在这里插入图片描述

2.3 界面设计

在这里插入图片描述

在这里插入图片描述

2.4 关键类图

在这里插入图片描述

3、系统实现(运行调试)

在这里插入图片描述

4、系统扩展

增加挑战模式,单击开始后,系统记录用户拼图的时间,当在规定的时间内完成拼图时,挑战成功;否则游戏终止,挑战失败。

5、总结

通过该项目的开发,使我进一步了解基于对话框界面的Windows应用程序的开发过程,并通过项目实训的扩展练习加深印象,为开发较为复杂的应用程序打下基础。

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Windows.Forms;

using System.IO;

namespace myPuzzle

{

    public partial class Form_Main : Form

    {

        PictureBox[] pictureList = null;

        SortedDictionary pictureLocationDict = new SortedDictionary();

        Point[] pointList = null;

        SortedDictionary pictureBoxLocationDict = new SortedDictionary();

        int second = 0;  //拼图时间

        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 ImgNumbers

        {

            get

            {

                return (int)this.numericUpDown1.Value;

            }

        }

        ///

        /// 要切割成的正方形图片边长

        ///

        private int SideLength

        {

            get

            {

                return 600 / this.ImgNumbers;

            }

        }

        private void InitRandomPictureBox()

        {

            pnl_Picture.Controls.Clear();

            pictureList = new PictureBox[ImgNumbers * ImgNumbers];

            pointList = new Point[ImgNumbers * ImgNumbers];

            for (int i = 0; i < this.ImgNumbers; i++)

            {

                for (int j = 0; j < this.ImgNumbers; j++)

                {

                    PictureBox pic = new PictureBox();

                    pic.Name = "pictureBox" + (j + i * ImgNumbers + 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(pictureBox_MouseDown);

                    pic.MouseMove += new MouseEventHandler(pictureBox_MouseMove);

                    pic.MouseUp += new MouseEventHandler(pictureBox_MouseUp);

                    pnl_Picture.Controls.Add(pic);

                    pictureList[j + i * ImgNumbers] = pic;

                    pointList[j + i * ImgNumbers] = new Point(j * SideLength, i * SideLength);

                }

            }

        }

        private void btn_sta_Click(object sender, EventArgs e)

        {

            Random r = new Random();

            int i = r.Next(99);

            originalpicpath = Application.StartupPath.ToString() + "\\timg (" + i.ToString() + ").jpg";

            //Application.StartupPath.ToString() + "\\timg (58).jpg"

            Flow(originalpicpath, true);

            //MessageBox.Show(this.ActiveControl.Name);

            lab_result.Text = "";

            timer1.Start();

            CountTime();

        }



        public void Flow(string path, bool disorder)

        {

            InitRandomPictureBox();

            Image bm = CutPicture.Resize(path, 600, 600);

            CutPicture.BitMapList = new List();

            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);

                }

            }

            ImportBitMap(disorder);

        }

        public void ImportBitMap(bool disorder)

        {

            try

            {

                int i = 0;

                foreach (PictureBox item in pictureList)

                {

                    Bitmap temp = CutPicture.BitMapList[i];

                    item.Image = temp;

                    i++;

                }

                if (disorder)

                    ResetPictureLocation();

            }

            catch (Exception exp)

            {

                Console.WriteLine(exp.Message);

            }

        }

        public void ResetPictureLocation()

        {

            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;

        }

        public void InitGame()

        {

            if (!Directory.Exists(Application.StartupPath.ToString() + "\\Picture"))

            {

                Directory.CreateDirectory(Application.StartupPath.ToString() + "\\Picture");

                Properties.Resources.timg__1_.Save(Application.StartupPath.ToString() + "\\timg (1).jpg");

                Properties.Resources.timg__2_.Save(Application.StartupPath.ToString() + "\\timg (2).jpg");

                Properties.Resources.timg__3_.Save(Application.StartupPath.ToString() + "\\timg (3).jpg");

                Properties.Resources.timg__4_.Save(Application.StartupPath.ToString() + "\\timg (4).jpg");

                Properties.Resources.timg__5_.Save(Application.StartupPath.ToString() + "\\timg (5).jpg");

                Properties.Resources.timg__6_.Save(Application.StartupPath.ToString() + "\\timg (6).jpg");

                Properties.Resources.timg__7_.Save(Application.StartupPath.ToString() + "\\timg (7).jpg");

                Properties.Resources.timg__8_.Save(Application.StartupPath.ToString() + "\\timg (8).jpg");

                Properties.Resources.timg__9_.Save(Application.StartupPath.ToString() + "\\timg (9).jpg");

                Properties.Resources.timg__10_.Save(Application.StartupPath.ToString() + "\\timg (10).jpg");

                Properties.Resources.timg__11_.Save(Application.StartupPath.ToString() + "\\timg (11).jpg");

                Properties.Resources.timg__12_.Save(Application.StartupPath.ToString() + "\\timg (12).jpg");

                Properties.Resources.timg__13_.Save(Application.StartupPath.ToString() + "\\timg (13).jpg");

                Properties.Resources.timg__14_.Save(Application.StartupPath.ToString() + "\\timg (14).jpg");

                Properties.Resources.timg__15_.Save(Application.StartupPath.ToString() + "\\timg (15).jpg");

                Properties.Resources.timg__16_.Save(Application.StartupPath.ToString() + "\\timg (16).jpg");

                Properties.Resources.timg__17_.Save(Application.StartupPath.ToString() + "\\timg (17).jpg");

                Properties.Resources.timg__18_.Save(Application.StartupPath.ToString() + "\\timg (18).jpg");

                Properties.Resources.timg__19_.Save(Application.StartupPath.ToString() + "\\timg (19).jpg");

                Properties.Resources.timg__20_.Save(Application.StartupPath.ToString() + "\\timg (20).jpg");

                Properties.Resources.timg__21_.Save(Application.StartupPath.ToString() + "\\timg (21).jpg");

                Properties.Resources.timg__22_.Save(Application.StartupPath.ToString() + "\\timg (22).jpg");

                Properties.Resources.timg__23_.Save(Application.StartupPath.ToString() + "\\timg (23).jpg");

                Properties.Resources.timg__24_.Save(Application.StartupPath.ToString() + "\\timg (24).jpg");

                Properties.Resources.timg__25_.Save(Application.StartupPath.ToString() + "\\timg (25).jpg");

                Properties.Resources.timg__26_.Save(Application.StartupPath.ToString() + "\\timg (26).jpg");

                Properties.Resources.timg__27_.Save(Application.StartupPath.ToString() + "\\timg (27).jpg");

                Properties.Resources.timg__28_.Save(Application.StartupPath.ToString() + "\\timg (28).jpg");

                Properties.Resources.timg__29_.Save(Application.StartupPath.ToString() + "\\timg (29).jpg");

                Properties.Resources.timg__30_.Save(Application.StartupPath.ToString() + "\\timg (30).jpg");

                Properties.Resources.timg__31_.Save(Application.StartupPath.ToString() + "\\timg (31).jpg");

                Properties.Resources.timg__32_.Save(Application.StartupPath.ToString() + "\\timg (32).jpg");

                Properties.Resources.timg__33_.Save(Application.StartupPath.ToString() + "\\timg (33).jpg");

                Properties.Resources.timg__34_.Save(Application.StartupPath.ToString() + "\\timg (34).jpg");

                Properties.Resources.timg__35_.Save(Application.StartupPath.ToString() + "\\timg (35).jpg");

                Properties.Resources.timg__36_.Save(Application.StartupPath.ToString() + "\\timg (36).jpg");

                Properties.Resources.timg__37_.Save(Application.StartupPath.ToString() + "\\timg (37).jpg");

                Properties.Resources.timg__38_.Save(Application.StartupPath.ToString() + "\\timg (38).jpg");

                Properties.Resources.timg__39_.Save(Application.StartupPath.ToString() + "\\timg (39).jpg");

                Properties.Resources.timg__40_.Save(Application.StartupPath.ToString() + "\\timg (40).jpg");

                Properties.Resources.timg__41_.Save(Application.StartupPath.ToString() + "\\timg (41).jpg");

                Properties.Resources.timg__42_.Save(Application.StartupPath.ToString() + "\\timg (42).jpg");

                Properties.Resources.timg__43_.Save(Application.StartupPath.ToString() + "\\timg (43).jpg");

                Properties.Resources.timg__44_.Save(Application.StartupPath.ToString() + "\\timg (44).jpg");

                Properties.Resources.timg__45_.Save(Application.StartupPath.ToString() + "\\timg (45).jpg");

                Properties.Resources.timg__46_.Save(Application.StartupPath.ToString() + "\\timg (46).jpg");

                Properties.Resources.timg__47_.Save(Application.StartupPath.ToString() + "\\timg (47).jpg");

                Properties.Resources.timg__48_.Save(Application.StartupPath.ToString() + "\\timg (48).jpg");

                Properties.Resources.timg__49_.Save(Application.StartupPath.ToString() + "\\timg (49).jpg");

                Properties.Resources.timg__50_.Save(Application.StartupPath.ToString() + "\\timg (50).jpg");

                Properties.Resources.timg__51_.Save(Application.StartupPath.ToString() + "\\timg (51).jpg");

                Properties.Resources.timg__52_.Save(Application.StartupPath.ToString() + "\\timg (52).jpg");

                Properties.Resources.timg__53_.Save(Application.StartupPath.ToString() + "\\timg (53).jpg");

                Properties.Resources.timg__54_.Save(Application.StartupPath.ToString() + "\\timg (54).jpg");

                Properties.Resources.timg__55_.Save(Application.StartupPath.ToString() + "\\timg (55).jpg");

                Properties.Resources.timg__56_.Save(Application.StartupPath.ToString() + "\\timg (56).jpg");

                Properties.Resources.timg__57_.Save(Application.StartupPath.ToString() + "\\timg (57).jpg");

                Properties.Resources.timg__58_.Save(Application.StartupPath.ToString() + "\\timg (58).jpg");

                Properties.Resources.timg__59_.Save(Application.StartupPath.ToString() + "\\timg (59).jpg");

                Properties.Resources.timg__60_.Save(Application.StartupPath.ToString() + "\\timg (60).jpg");

                Properties.Resources.timg__61_.Save(Application.StartupPath.ToString() + "\\timg (61).jpg");

                Properties.Resources.timg__62_.Save(Application.StartupPath.ToString() + "\\timg (62).jpg");

                Properties.Resources.timg__63_.Save(Application.StartupPath.ToString() + "\\timg (63).jpg");

                Properties.Resources.timg__64_.Save(Application.StartupPath.ToString() + "\\timg (64).jpg");

                Properties.Resources.timg__65_.Save(Application.StartupPath.ToString() + "\\timg (65).jpg");

                Properties.Resources.timg__66_.Save(Application.StartupPath.ToString() + "\\timg (66).jpg");

                Properties.Resources.timg__67_.Save(Application.StartupPath.ToString() + "\\timg (67).jpg");

                Properties.Resources.timg__68_.Save(Application.StartupPath.ToString() + "\\timg (68).jpg");

                Properties.Resources.timg__69_.Save(Application.StartupPath.ToString() + "\\timg (69).jpg");

                Properties.Resources.timg__70_.Save(Application.StartupPath.ToString() + "\\timg (70).jpg");

                Properties.Resources.timg__71_.Save(Application.StartupPath.ToString() + "\\timg (71).jpg");

                Properties.Resources.timg__72_.Save(Application.StartupPath.ToString() + "\\timg (72).jpg");

                Properties.Resources.timg__73_.Save(Application.StartupPath.ToString() + "\\timg (73).jpg");

                Properties.Resources.timg__74_.Save(Application.StartupPath.ToString() + "\\timg (74).jpg");

                Properties.Resources.timg__75_.Save(Application.StartupPath.ToString() + "\\timg (75).jpg");

                Properties.Resources.timg__76_.Save(Application.StartupPath.ToString() + "\\timg (76).jpg");

                Properties.Resources.timg__77_.Save(Application.StartupPath.ToString() + "\\timg (77).jpg");

                Properties.Resources.timg__78_.Save(Application.StartupPath.ToString() + "\\timg (78).jpg");

                Properties.Resources.timg__79_.Save(Application.StartupPath.ToString() + "\\timg (79).jpg");

                Properties.Resources.timg__80_.Save(Application.StartupPath.ToString() + "\\timg (80).jpg");

                Properties.Resources.timg__81_.Save(Application.StartupPath.ToString() + "\\timg (81).jpg");

                Properties.Resources.timg__82_.Save(Application.StartupPath.ToString() + "\\timg (82).jpg");

                Properties.Resources.timg__83_.Save(Application.StartupPath.ToString() + "\\timg (83).jpg");

                Properties.Resources.timg__84_.Save(Application.StartupPath.ToString() + "\\timg (84).jpg");

                Properties.Resources.timg__85_.Save(Application.StartupPath.ToString() + "\\timg (85).jpg");

                Properties.Resources.timg__86_.Save(Application.StartupPath.ToString() + "\\timg (86).jpg");

                Properties.Resources.timg__87_.Save(Application.StartupPath.ToString() + "\\timg (87).jpg");

                Properties.Resources.timg__88_.Save(Application.StartupPath.ToString() + "\\timg (88).jpg");

                Properties.Resources.timg__89_.Save(Application.StartupPath.ToString() + "\\timg (89).jpg");

                Properties.Resources.timg__90_.Save(Application.StartupPath.ToString() + "\\timg (90).jpg");

                Properties.Resources.timg__91_.Save(Application.StartupPath.ToString() + "\\timg (91).jpg");

                Properties.Resources.timg__92_.Save(Application.StartupPath.ToString() + "\\timg (92).jpg");

                Properties.Resources.timg__93_.Save(Application.StartupPath.ToString() + "\\timg (93).jpg");

                Properties.Resources.timg__94_.Save(Application.StartupPath.ToString() + "\\timg (94).jpg");

                Properties.Resources.timg__95_.Save(Application.StartupPath.ToString() + "\\timg (95).jpg");

                Properties.Resources.timg__96_.Save(Application.StartupPath.ToString() + "\\timg (96).jpg");

                Properties.Resources.timg__97_.Save(Application.StartupPath.ToString() + "\\timg (97).jpg");

                Properties.Resources.timg__98_.Save(Application.StartupPath.ToString() + "\\timg (98).jpg");

                Properties.Resources.timg__99_.Save(Application.StartupPath.ToString() + "\\timg (99).jpg");





            }

            Random r = new Random();



            int i = r.Next(99);

            originalpicpath = Application.StartupPath.ToString() + "\\timg (" + 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 pictureBox_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 pictureBox_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 void reset()

        {

            mouseDownPoint = Point.Empty;

            rect = Rectangle.Empty;

            isDrag = false;

        }

        private Point getPointToForm(Point p)

        {

            return this.PointToClient(pnl_Picture.PointToScreen(p));

        }



        private void pictureBox_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())

            {

                lab_result.Text = "成功!";

            }

        }

        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 = true;



                }

                i++;

            }

            return result;

        }



        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 Form_Main_Load(object sender, EventArgs e)

        {



        }



        private void btn_import_Click(object sender, EventArgs e)

        {

            OpenFileDialog new_picture = new OpenFileDialog();

            if (new_picture.ShowDialog() == DialogResult.OK)

            {

                lab_result.Text = " ";

                originalpicpath = new_picture.FileName;

                CutPicture.PicturePath = new_picture.FileName;

                Flow(CutPicture.PicturePath, true);

                CountTime();

            }

        }



        private void btn_Changepic_Click(object sender, EventArgs e)

        {

            Random r = new Random();

            int i = r.Next(99);

            originalpicpath = Application.StartupPath.ToString() + "\\timg (" + i.ToString() + ").jpg";

            //Application.StartupPath.ToString() + "\\timg (58).jpg"

            Flow(originalpicpath, true);

            CountTime();

        }





        private void btn_Reset_Click(object sender, EventArgs e)

        {

            Flow(originalpicpath, true);

            CountTime();

        }



        private void btn_Originalpic_Click(object sender, EventArgs e)

        {

            Form_Original original = new Form_Original();

            original.picpath = originalpicpath;

            original.ShowDialog();

        }



        private void splitContainer1_Panel2_Paint(object sender, PaintEventArgs e)

        {



        }



        private void numericUpDown1_ValueChanged(object sender, EventArgs e)

        {



        }



        private void numericUpDown1_ValueChanged_1(object sender, EventArgs e)

        {



        }



        private void lab_result_Click(object sender, EventArgs e)

        {



        }

        public void CountTime()

        {

            lab_time.Text = "0";

            timer1.Start();

        }

        //private void btn_sta_Click_1(object sender, EventArgs e)

        //{

        //

          //  lab_result.Text = "";

            //timer1.Start();

        //}



        private void timer1_Tick(object sender, EventArgs e)

        {

           // CountTime();

            second++;

            lab_time.Text = second.ToString();

            if (second == 30)

            {

                timer1.Stop();

                lab_result.Text = "失败!";

                MessageBox.Show("You are losed!");

            }





        }



        private void lab_time_Click(object sender, EventArgs e)

        {



        }



        private void pnl_Picture_Paint_1(object sender, PaintEventArgs e)

        {



        }

    }

 

}

具体的C#文件压缩包如下链接所示:
https://download.csdn.net/download/qq_41509200/11584088

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值