用C# 寫的 拼圖程序(winform 版)

這是我用C#做的第一款小遊戲,算法有點複雜,當我移植到 IOS 中的時候,我發現了一個更簡單的算法.這個以後再講.

先看一下這個Winform程序

遊戲的界面是這樣的,看着很簡單

  wKiom1RNtD-gZxrnAAHDceR-M_Y750.jpg

 1.左側顯示分割後的圖片的,第一個爲空

 2.右側上部是選擇你要生成的 圖像距陣

 3.右側中部是切換拼圖使用的圖片,可以選擇系統自帶的,也可以自定義

 4.下邊有一個狀態欄,主要顯示是否開始,以及所走的步數,

 5.當你拼圖完成的時候,就會彈出一個提示對話框


下面開始介紹一下算法思路:用 a ,s ,d,w 來控制方向

  1. 先定義一個image 的集合,用來存儲分割後的圖片

  2. 定義一個圖片位置Dictionary,用來存儲 小圖位置與小圖資源

  3. 定義初始位置PointX,PointY,因爲第一個圖片爲空,所以初始值爲0

  4. 當你按下A的時候,PointX向右移動一位,將右邊的圖片賦值給左邊,當前位置設置爲空,這樣就實現了圖片的向左移動

  5. 當你按下S鍵的時候,PointY向上移動一位,將上面的圖片給下邊,當前位置設置爲空,這樣就實現了圖片的向下移動

  6. 當你按下D的時候,與A的恰好相反,按下W時,與S的算法相反(注意PointX,PointY的大小,不能越界)

  7. 狀態檢測,每走一步就檢測一下是否完成,我這裏用的是判斷圖片是否與集合中同樣下標的圖片數據相等來檢測的,


下面貼一下代碼:


開始按鈕:

//開始按鈕
        private void btnStart_Click(object sender, EventArgs e)
        {
            PointX = 0;
            PointY = 0;
            stepCount = 0;
            Dictionary<string, Image> dic = new Dictionary<string, Image>();
            Random random = new Random();
            int diccount = 0;
            int c = random.Next(0, Imagecol);
            int r = random.Next(0, Imagerow);
            while (dic.Count < (Imagecol * Imagerow - 1))
            {
                if (c == 0 && r == 0)
                {
                    c = random.Next(0, Imagecol);
                    r = random.Next(0, Imagerow);
                    continue;
                }
                if (!dic.ContainsValue(images[r, c]))
                {
                    dic.Add(diccount.ToString(), images[r, c]);
                    diccount++;
                }
                c = random.Next(0, Imagecol);
                r = random.Next(0, Imagerow);
            }
            //佈局
            for (int i = 0; i < panel1.Controls.Count; i++)
            {
                PictureBox p = panel1.Controls[i] as PictureBox;
                p.Image = null;
                if (i != 0)
                {
                    p.Image = dic[(i - 1).ToString()];
                }
            }
            toolStripStatusLabel1.Text = "你共走了 " + stepCount.ToString() + " 步!";
        }

分割圖像算法:

 public static Image[,] GetImages(Image img, int col, int row, int width, int height)
        {
            Image[,] imgs = new Image[row, col];
            int iwidth = width / col;//每塊多寬
            int iheight = height / row;//每塊多高
            for (int i = 0; i < row; i++)
            {
                for (int j = 0; j < col; j++)
                {
                    #region
                    /*
                    //先初始化一個位圖對象,來存儲截取後的圖像
                    Bitmap bmpDest = new Bitmap(iwidth, iheight, PixelFormat.Format32bppRgb);
                    //這個矩形定義了,你將要在被截取的圖像上要截取的圖像區域的左頂點位置和截取的大小
                    Rectangle rectSource = new Rectangle(j * iwidth, i * iheight, iwidth, iheight);
                    //這個矩形定義了,你將要把 截取的圖像區域 繪製到初始化的位圖的位置和大小
                    //我的定義,說明,我將把截取的區域,從位圖左頂點開始繪製,繪製截取的區域原來大小
                    Rectangle rectDest = new Rectangle(0, 0, iwidth, iheight);
                    //第一個參數就是加載你要截取的圖像對象,第二個和第三個參數及如上所說定義截取和繪製圖像過程中的相關屬性,第四個屬性定義了屬性值所使用的度量單位
                    // g.DrawImage(img, rectDest, rectSource, GraphicsUnit.Pixel);*/
                    #endregion
                    Bitmap bm = new Bitmap(iwidth, iheight, PixelFormat.Format24bppRgb);
                    Graphics g = Graphics.FromImage(bm);
                    g.DrawImage(img, new Rectangle(0, 0, iwidth, iheight), new Rectangle(j * iwidth, i * iheight, iwidth, iheight), GraphicsUnit.Pixel);
                    imgs[i, j] = (Image)bm;
                    g.Dispose();
                }
            }
            images = imgs;
            return imgs;
        }

檢測是否完成遊戲:(遍歷panel 中所有的控件,判斷他們的image 是否和集合中對應的image相等)

  public static bool CheckImageGamesComplate(Panel panel, int row, int col)
        {
            bool win = false;
            try
            {
                int pStart = 0;
                for (int i = 0; i < row; i++)
                {
                    for (int j = 0; j < col; j++)
                    {
                        PictureBox pic = panel.Controls.Find(pStart.ToString(), true)[0] as PictureBox;
                        if (i == 0 && j == 0)
                        {
                            if (pic.Image != null)
                            {
                                return false;
                            }
                        }
                        else if (pic.Image == images[i, j])
                        {
                            win = true;
                        }
                        else
                        {
                            return false;
                        }
                        pStart++;
                    }
                }
            }
            catch
            {
                return false;
            }
            return win;
        }

具體的源碼請到 http://down.51cto.com/data/1889879 下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章