C#利用控件拖拽技术制作拼图游戏
主要实现的功能:
1.程序附带多张拼图随机拼图。
2.可手动添加拼图。
3.游戏成功判断。
4.30秒超时判断。
Puzzle.cs
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.IO; namespacePuzzle { publicpartialclassPuzzle:Form { //图片列表 PictureBox[]pictureList=null; //图片位置字典 SortedDictionary<string,Bitmap>pictureLocationDict=newSortedDictionary<string,Bitmap>(); //LocationList Point[]pointList=null; //图片控件字典 SortedDictionary<string,PictureBox>pictureBoxLocationDict=newSortedDictionary<string,PictureBox>(); //拼图时间 intsecond=0; //所拖拽的图片 PictureBoxcurrentPictureBox=null; //被迫需要移动的图片 PictureBoxhaveToPictureBox=null; //原位置 PointoldLocation=Point.Empty; //新位置 PointnewLocation=Point.Empty; //鼠标按下坐标(control控件的相对坐标) PointmouseDownPoint=Point.Empty; //显示拖动效果的矩形 Rectanglerect=Rectangle.Empty; //是否正在拖拽 boolisDrag=false; publicPuzzle() { InitializeComponent(); InitGame(); } ///<summary> ///初始化游戏资源 ///</summary> publicvoidInitGame() { pictureList=newPictureBox[9]{pictureBox1,pictureBox2,pictureBox3,pictureBox4,pictureBox5,pictureBox6,pictureBox7,pictureBox8,pictureBox9}; pointList=newPoint[9]{newPoint(0,0),newPoint(100,0),newPoint(200,0),newPoint(0,100),newPoint(100,100),newPoint(200,100),newPoint(0,200),newPoint(100,200),newPoint(200,200)}; if(!Directory.Exists(Application.StartupPath.ToString()+"\\Picture")) { Directory.CreateDirectory(Application.StartupPath.ToString()+"\\Picture"); Properties.Resources.默认.Save(Application.StartupPath.ToString()+"\\Picture\\1.jpg"); Properties.Resources._1.Save(Application.StartupPath.ToString()+"\\Picture\\2.jpg"); Properties.Resources._2.Save(Application.StartupPath.ToString()+"\\Picture\\3.jpg"); Properties.Resources._3.Save(Application.StartupPath.ToString()+"\\Picture\\4.jpg"); Properties.Resources._4.Save(Application.StartupPath.ToString()+"\\Picture\\5.jpg"); Properties.Resources.成功.Save(Application.StartupPath.ToString()+"\\Picture\\6.jpg"); Properties.Resources.欢呼.Save(Application.StartupPath.ToString()+"\\Picture\\7.jpg"); } Randomr=newRandom(); inti=r.Next(7); Flow(Application.StartupPath.ToString()+"\\Picture\\"+i.ToString()+".jpg"); } privatevoidPuzzle_Paint(objectsender,PaintEventArgse) { if(rect!=Rectangle.Empty) { if(isDrag) { e.Graphics.DrawRectangle(Pens.White,rect); } else { e.Graphics.DrawRectangle(newPen(this.BackColor),rect); } } } ///<summary> ///不好用 ///</summary> ///<returns></returns> publicPictureBoxGetPictureBoxByLocation() { PictureBoxpic=null; if(this.ActiveControl.Name.Contains("pictureBox")) { pic=(PictureBox)this.ActiveControl; } returnpic; } publicPictureBoxGetPictureBoxByLocation(MouseEventArgse) { PictureBoxpic=null; foreach(PictureBoxiteminpictureList) { if(e.Location.X>item.Location.X&&e.Location.Y>item.Location.Y&&item.Location.X+100>e.Location.X&&item.Location.Y+100>e.Location.X) { pic=item; } } returnpic; } publicPictureBoxGetPictureBoxByLocation(intx,inty) { PictureBoxpic=null; foreach(PictureBoxiteminpictureList) { if(x>item.Location.X&&y>item.Location.Y&&item.Location.X+100>x&&item.Location.Y+100>y) { pic=item; } } returnpic; } ///<summary> ///通过hashcode获取picture,用mouseeventargs之后获取相对于picture的坐标不是相对窗体 ///</summary> ///<paramname="hascode"></param> ///<returns></returns> publicPictureBoxGetPictureBoxByHashCode(stringhascode) { PictureBoxpic=null; foreach(PictureBoxiteminpictureList) { if(hascode==item.GetHashCode().ToString()) { pic=item; } } returnpic; } privatevoidpictureBox_MouseDown(objectsender,MouseEventArgse) { oldLocation=newPoint(e.X,e.Y); currentPictureBox=GetPictureBoxByHashCode(sender.GetHashCode().ToString()); MoseDown(currentPictureBox,sender,e); } publicvoidMoseDown(PictureBoxpic,objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Left) { oldLocation=e.Location; rect=pic.Bounds; } } privatevoidpictureBox_MouseMove(objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Left) { isDrag=true; rect.Location=getPointToForm(newPoint(e.Location.X-oldLocation.X,e.Location.Y-oldLocation.Y)); this.Refresh(); } } privatevoidreset() { mouseDownPoint=Point.Empty; rect=Rectangle.Empty; isDrag=false; } privatePointgetPointToForm(Pointp) { returnthis.PointToClient(pictureBox1.PointToScreen(p)); } privatevoidpictureBox_MouseUp(objectsender,MouseEventArgse) { oldLocation=newPoint(currentPictureBox.Location.X,currentPictureBox.Location.Y); if(oldLocation.X+e.X>300||oldLocation.Y+e.Y>300||oldLocation.X+e.X<0||oldLocation.Y+e.Y<0) { return; } haveToPictureBox=GetPictureBoxByLocation(oldLocation.X+e.X,oldLocation.Y+e.Y); newLocation=newPoint(haveToPictureBox.Location.X,haveToPictureBox.Location.Y); haveToPictureBox.Location=oldLocation; PictureMouseUp(currentPictureBox,sender,e); if(Judge()) { lab_result.Text="成功!"; //MessageBox.Show("恭喜拼图成功"); } } publicvoidPictureMouseUp(PictureBoxpic,objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Left) { if(isDrag) { isDrag=false; pic.Location=newLocation; this.Refresh(); } reset(); } } publicvoidExchangePictureBox(MouseEventArgse) {} privatevoidbtn_sta_Click(objectsender,EventArgse) { MessageBox.Show(this.ActiveControl.Name); } ///<summary> ///初始化 ///</summary> ///<paramname="path"></param> publicvoidFlow(stringpath) { Imagebm=CutPicture.Resize(path,300,300); CutPicture.BitMapList=newList<Bitmap>(); for(inty=0;y<300;y+=100) { for(intx=0;x<300;x+=100) { //stringkey=x+"-"+y; Bitmaptemp=CutPicture.Cut(bm,x,y,100,100); //pictureLocationDict.Add(key,temp); CutPicture.BitMapList.Add(temp); } } ImportBitMap(); } ///<summary> ///打乱数据 ///</summary> ///<paramname="pictureArray"></param> ///<returns></returns> publicPictureBox[]DisOrderArray(PictureBox[]pictureArray) { PictureBox[]tempArray=pictureArray; for(inti=tempArray.Length-1;i>0;i--) { Randomrand=newRandom(); intp=rand.Next(i); PictureBoxtemp=tempArray[p]; tempArray[p]=tempArray[i]; tempArray[i]=temp; } returntempArray; } ///<summary> ///判断是否拼图成功 ///</summary> ///<returns></returns> publicboolJudge() { boolresult=true; inti=0; foreach(PictureBoxiteminpictureList) { if(item.Location!=pointList[i]) { result=false; } i++; } returnresult; } privatevoidbtn_import_Click(objectsender,EventArgse) { lab_result.Text=""; ofd_picture.ShowDialog(); CutPicture.PicturePath=ofd_picture.FileName; Flow(CutPicture.PicturePath); CountTime(); } ///<summary> ///计时 ///</summary> publicvoidCountTime() { lab_time.Text="0"; timer1.Start(); } ///<summary> ///给piturebox赋值 ///</summary> publicvoidImportBitMap() { try { inti=0;//DisOrderArray(pictureList) foreach(PictureBoxiteminpictureList) { Bitmaptemp=CutPicture.BitMapList[i]; item.Image=temp; i++; } ResetPictureLocation(); } catch(Exceptionexp) { Console.WriteLine(exp.Message); } } ///<summary> ///打乱位置列表 ///</summary> ///<returns></returns> publicPoint[]DisOrderLocation() { Point[]tempArray=(Point[])pointList.Clone(); for(inti=tempArray.Length-1;i>0;i--) { Randomrand=newRandom(); intp=rand.Next(i); Pointtemp=tempArray[p]; tempArray[p]=tempArray[i]; tempArray[i]=temp; } returntempArray; } ///<summary> ///重新设置图片位置 ///</summary> publicvoidResetPictureLocation() { Point[]temp=DisOrderLocation(); inti=0; foreach(PictureBoxiteminpictureList) { item.Location=temp[i]; i++; } } ///<summary> ///计时,超过30秒停止计时 ///</summary> ///<paramname="sender"></param> ///<paramname="e"></param> privatevoidtimer1_Tick(objectsender,EventArgse) { second++; lab_time.Text=second.ToString(); if(second==30) { timer1.Stop(); lab_result.Text="失败!"; } } privatevoidbtn_sta_Click_1(objectsender,EventArgse) { lab_result.Text=""; timer1.Start(); } } }
CutPicture.cs
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Drawing; usingSystem.Drawing.Imaging; usingSystem.Windows.Forms; namespacePuzzle { classCutPicture { publicstaticstringPicturePath=""; publicstaticList<Bitmap>BitMapList=null; ///<summary> ///剪切图片 ///</summary> ///<paramname="b">图片</param> ///<paramname="StartX">X坐标</param> ///<paramname="StartY">Y坐标</param> ///<paramname="iWidth">宽</param> ///<paramname="iHeight">高</param> ///<returns></returns> publicstaticBitmapCut(Imageb,intStartX,intStartY,intiWidth,intiHeight) { if(b==null) { returnnull; } intw=b.Width; inth=b.Height; if(StartX>=w||StartY>=h) { returnnull; } if(StartX+iWidth>w) { iWidth=w-StartX; } if(StartY+iHeight>h) { iHeight=h-StartY; } try { BitmapbmpOut=newBitmap(iWidth,iHeight,PixelFormat.Format24bppRgb); Graphicsg=Graphics.FromImage(bmpOut); g.DrawImage(b,newRectangle(0,0,iWidth,iHeight),newRectangle(StartX,StartY,iWidth,iHeight),GraphicsUnit.Pixel); g.Dispose(); returnbmpOut; } catch { returnnull; } } ///<summary> ///保存图片到根目录的Pictures文件夹下 ///</summary> ///<paramname="path">文件路径</param> ///<paramname="iWidth">调整的宽</param> ///<paramname="iHeignt">调整的高</param> ///<returns></returns> publicstaticImageResize(stringpath,intiWidth,intiHeignt) { Imagethumbnail=null; try { varimg=Image.FromFile(path); thumbnail=img.GetThumbnailImage(iWidth,iHeignt,null,IntPtr.Zero); thumbnail.Save(Application.StartupPath.ToString()+"\\Picture\\img.jpeg"); } catch(Exceptionexp) { Console.WriteLine(exp.Message); } returnthumbnail; } } }
mouse_down
privatevoidpictureBox_MouseDown(objectsender,MouseEventArgse) { oldLocation=newPoint(e.X,e.Y); currentPictureBox=GetPictureBoxByHashCode(sender.GetHashCode().ToString()); MoseDown(currentPictureBox,sender,e); } publicvoidMoseDown(PictureBoxpic,objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Left) { oldLocation=e.Location; rect=pic.Bounds; } }
mouse_move
privatevoidpictureBox_MouseMove(objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Left) { isDrag=true; rect.Location=getPointToForm(newPoint(e.Location.X-oldLocation.X,e.Location.Y-oldLocation.Y)); this.Refresh(); } }
mouse_up
privatevoidpictureBox_MouseUp(objectsender,MouseEventArgse) { oldLocation=newPoint(currentPictureBox.Location.X,currentPictureBox.Location.Y); if(oldLocation.X+e.X>300||oldLocation.Y+e.Y>300||oldLocation.X+e.X<0||oldLocation.Y+e.Y<0) { return; } haveToPictureBox=GetPictureBoxByLocation(oldLocation.X+e.X,oldLocation.Y+e.Y); newLocation=newPoint(haveToPictureBox.Location.X,haveToPictureBox.Location.Y); haveToPictureBox.Location=oldLocation; PictureMouseUp(currentPictureBox,sender,e); if(Judge()) { lab_result.Text="成功!"; //MessageBox.Show("恭喜拼图成功"); } } publicvoidPictureMouseUp(PictureBoxpic,objectsender,MouseEventArgse) { if(e.Button==MouseButtons.Left) { if(isDrag) { isDrag=false; pic.Location=newLocation; this.Refresh(); } reset(); } }
reset
privatevoidreset() { mouseDownPoint=Point.Empty; rect=Rectangle.Empty; isDrag=false; }
以上所述就是本文的全部内容了,希望大家能够喜欢。