91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-06-22 02:56:16 來源:網絡 閱讀:2927 作者:切你小JJ 欄目:編程語言

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

先看一下這個Winform程序

游戲的界面是這樣的,看著很簡單

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

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

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

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

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

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


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

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

  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(p_w_picpaths[r, c]))
                {
                    dic.Add(diccount.ToString(), p_w_picpaths[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();
                }
            }
            p_w_picpaths = imgs;
            return imgs;
        }

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

  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 == p_w_picpaths[i, j])
                        {
                            win = true;
                        }
                        else
                        {
                            return false;
                        }
                        pStart++;
                    }
                }
            }
            catch
            {
                return false;
            }
            return win;
        }

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海丰县| 英德市| 贡嘎县| 灵石县| 和平县| 馆陶县| 安新县| 西安市| 张家界市| 莱芜市| 河南省| 图们市| 鸡东县| 河津市| 水城县| 密云县| 垦利县| 亚东县| 屯门区| 南陵县| 沾化县| 夹江县| 永福县| 岗巴县| 吉木乃县| 垣曲县| 龙胜| 民和| 佛教| 鄯善县| 清涧县| 宣汉县| 青州市| 乌兰察布市| 田林县| 望城县| 和龙市| 丘北县| 周宁县| 周至县| 潜山县|