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;
}
以上所述就是本文的全部内容了,希望大家能够喜欢。