<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了C#實現拼圖小遊戲的具體程式碼,供大家參考,具體內容如下
1.首先佈置好介面。
標題列,選單欄,狀態列,以及放置圖片框的panel。
2.定義圖片框類
/// <summary> /// 圖片框類,包含虛擬XY位置 /// </summary> public class PictureBoxEx : PictureBox { private Point _xy ; private Point _inxy; /// <summary> /// 初始XY位置 /// </summary> public Point inxy { get { return _inxy; } // set { _inxy = value; } } /// <summary> /// 當前XY位置 /// </summary> public Point xy { get { return _xy; } set { _xy = value; } } public PictureBoxEx(Point txy) : base() { _inxy=_xy = txy; } /// <summary> /// 判斷是否回到初始位置 /// </summary> /// <returns>true:回到初始位置</returns> public bool judge() { return (_xy.X == _inxy.X) && (_xy.Y == _inxy.Y); } }
每個分割的圖片都是PictureBoxEx物件,儲存在list或者矩陣中。
3.載入圖片,隨機亂序排布
/// <summary> /// 生成PictureBoxEx ,排布在panel上 /// </summary> /// <param name="img">原圖</param> /// <param name="random">是否打亂顯示</param> private void initPbx(Image img, bool random) { pbxs.Clear();//清除圖片框列表 panelMain.Controls.Clear();//清除panel包含的控制元件 byte[] rands = new byte[column*row] ; //儲存隨機亂序一維陣列 if (random) { try { generateDisorderArray(ref rands); } catch { MessageBox.Show("生成亂序錯誤!"); } } srcBmp = new Bitmap(srcImg); Size rbmpSize = new System.Drawing.Size(srcBmp.Width / column, srcBmp.Height / row); int bw = srcBmp.Width / column, bh = srcBmp.Height / row; int rw = panelMain.ClientSize.Width / column, rh = panelMain.ClientSize.Height / row; int cnt = 0; for (int i = 0; i < column; i++)//行 { pbxs.Add( new List<PictureBoxEx>() ); for (int j = 0; j < row; j++)//列 { PictureBoxEx pb = new PictureBoxEx( new Point(i,j)); pb.Size = new System.Drawing.Size(rw,rh); pb.BorderStyle = BorderStyle.None; pb.Dock = DockStyle.None; pb.BackgroundImageLayout = ImageLayout.Stretch; panelMain.Controls.Add(pb); pb.Location = new Point(rw*i,rh*j); pbxs[i].Add(pb); Bitmap tbmp = new Bitmap(rw, rh); Graphics g = Graphics.FromImage(tbmp); Point bmppt; if (random) { //一維轉二維 int ri = rands[cnt] % column; int rj = (rands[cnt] / column) % row; bmppt = new Point(bw * ri, bh * rj); pb.xy = new Point(ri, rj); cnt++; } else { bmppt = new Point(bw * i, bh * j); } g.DrawImage(srcBmp, pb.ClientRectangle, new Rectangle( bmppt , rbmpSize), GraphicsUnit.Pixel); g.DrawRectangle( Pens.Red ,pb.ClientRectangle); if (!random) { g.DrawString(pb.xy.ToString(), new Font(System.Drawing.SystemFonts.DefaultFont.Name, 10),new SolidBrush(Color.Red), new PointF(1.0f, 1.0f)); } g.Dispose(); pb.BackgroundImage = tbmp; //為實現拖動圖片,加入3個滑鼠事件函數 pb.MouseDown += new MouseEventHandler(pb_MouseDown); pb.MouseMove += new MouseEventHandler(pb_MouseMove); pb.MouseUp += new MouseEventHandler(pb_MouseUp); if (random) { isStartGame = true; lab_canplay.BackColor = Color.Green; } else { isStartGame = false; lab_canplay.BackColor = Color.Red; } } } }
生成隨機亂序陣列函數:單純的亂陣列是不行的,因為隨機不一定亂序。
/// <summary> /// 生成隨機亂序陣列,洗牌 FisherYates Shuffle /// 隨機不一定無序,所以還需要檢查無序的度 /// </summary> public void generateDisorderArray(ref byte[] arr ) { byte len = (byte)arr.Length; if (len == 1U) { arr[0] = 0; } else if (len == 2U) { arr[0] = 1; arr[1] = 0; } else { for (byte i = 0; i < len; i++) { arr[i] = i; } byte[] rands = new byte[len * 4]; rng.GetBytes(rands); for (int j = len-1; j >=0; j--) { int idx = (int)(BitConverter.ToUInt32(rands, j * 4) % (byte)(j + 1)); SwapValue<byte>(ref arr[idx], ref arr[j]); } //下面簡單檢查無序度 List<byte> defs = new List<byte>(); for (byte a=0; a < len;a++ ) { if (a == arr[a]) defs.Add(a); //記錄位置 } //有一半在原位置,則不夠無序,首尾換位 if ( defs.Count > 1 && defs.Count >= (len/2) ) { for (byte i = 0; i < defs.Count/2; i++) { SwapValue<byte>(ref arr[defs[i]], ref arr[defs[defs.Count - 1 - i]]); } } } } /// <summary> /// 交換數值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="a"></param> /// <param name="b"></param> public static void SwapValue<T>(ref T a, ref T b) { T temp=a ; a=b ; b=temp ; }
4.圖片拖動交換
/// <summary> /// 交換圖片,位置資訊 /// </summary> /// <param name="srcXY">源位置</param> /// <param name="dstXY">目的位置</param> private void SwapPbx(Point srcXY, Point dstXY) { PictureBoxEx pba = pbxs[srcXY.X ][ srcXY.Y]; PictureBoxEx pbb = pbxs[dstXY.X ][ dstXY.Y]; if (srcXY.X == dstXY.X && srcXY.Y == dstXY.Y) { pba.Location = startloc; } else { pba.Location = startloc; var img = pba.BackgroundImage; pba.BackgroundImage = pbb.BackgroundImage ; pbb.BackgroundImage = img; var temp = pba.xy; pba.xy = pbb.xy; pbb.xy = temp; } } /// <summary> /// 畫素點位置轉化為虛擬XY座標 /// </summary> /// <param name="pt">畫素點位置</param> /// <param name="sz">所在的範圍</param> /// <returns>虛擬XY座標</returns> private Point PointToXY(Point pt, Size sz) { Size s = sz; Point p = pt; int rw = s.Width / column; int rh = s.Height / row; return new Point(p.X / rw, p.Y / rh); }
三個滑鼠事件函數
private void pb_MouseUp(object sender, MouseEventArgs e) { if (isDrag) { isDrag = false; Point upxy = PointToXY(((Control)sender).Parent.PointToClient(Control.MousePosition), ((Control)sender).Parent.Size); SwapPbx(startxy, upxy); gameSteps++; toolStripLab_Step.Text = "步數:" + gameSteps; { if (judgeResult(pbxs))//拼圖OK { toolStripLab_Tip.Text = "完成拼圖"; DialogResult res = new FormOK( "完成拼圖!r使用步數:" + gameSteps ).ShowDialog(); if (res == DialogResult.Abort) { this.Close(); } else if (res == DialogResult.OK) { if (srcImg != null) { initPbx(srcImg, true); isStartGame = true; } } enableNumud(true); gameSteps = 0; } } } } private void pb_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && isDrag) { Point mousePos = Control.MousePosition; mousePos.Offset(mouse_offset.X, mouse_offset.Y); ((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos); } } private void pb_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && pbxs.Count > 0 && isStartGame ) { isDrag = true; enableNumud( false ); startloc = ((Control)sender).Location; mouse_offset = new Point(-e.X, -e.Y); ((Control)sender).BringToFront(); Point pp = ((Control)sender).Parent.PointToClient(Control.MousePosition); startxy = PointToXY(pp, ((Control)sender).Parent.Size); } }
5.判斷是否成功
/// <summary> /// 判斷是否成功 /// </summary> /// <param name="pbxs">圖片矩陣</param> /// <returns>是否歸位了</returns> private bool judgeResult(List<List<PictureBoxEx>> pbxs) { bool res = true; foreach (var i in pbxs) { foreach (var j in i) { if (!j.judge()) { res = false; return res; } } } return res; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45