您好,登錄后才能下訂單哦!
這是我用C#做的第一款小游戲,算法有點復雜,當我移植到 IOS 中的時候,我發現了一個更簡單的算法.這個以后再講.
先看一下這個Winform程序
游戲的界面是這樣的,看著很簡單
1.左側顯示分割后的圖片的,第一個為空
2.右側上部是選擇你要生成的 圖像距陣
3.右側中部是切換拼圖使用的圖片,可以選擇系統自帶的,也可以自定義
4.下邊有一個狀態欄,主要顯示是否開始,以及所走的步數,
5.當你拼圖完成的時候,就會彈出一個提示對話框
下面開始介紹一下算法思路:用 a ,s ,d,w 來控制方向
先定義一個p_w_picpath 的集合,用來存儲分割后的圖片
定義一個圖片位置Dictionary,用來存儲 小圖位置與小圖資源
定義初始位置PointX,PointY,因為第一個圖片為空,所以初始值為0
當你按下A的時候,PointX向右移動一位,將右邊的圖片賦值給左邊,當前位置設置為空,這樣就實現了圖片的向左移動
當你按下S鍵的時候,PointY向上移動一位,將上面的圖片給下邊,當前位置設置為空,這樣就實現了圖片的向下移動
當你按下D的時候,與A的恰好相反,按下W時,與S的算法相反(注意PointX,PointY的大小,不能越界)
狀態檢測,每走一步就檢測一下是否完成,我這里用的是判斷圖片是否與集合中同樣下標的圖片數據相等來檢測的,
下面貼一下代碼:
開始按鈕:
//開始按鈕 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 下載
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。