1、系统概述
本次实验的主要内容是设计开发一个趣味拼图游戏,其功能是对加载的图片进行分割(如分割成3×3矩阵或其他类型矩阵)并随机加载到图片框矩阵中,用户使用鼠标拖动图片框中的图片进行拼图,系统能够自动判别拼图是否成功并进行提示。
2、系统设计
2.1 设计目标
拼图游戏开发及其项目扩展
2.2 设计分析与算法流程
2.3 界面设计
2.4 关键类图
3、系统实现(运行调试)
4、系统扩展
增加挑战模式,单击开始后,系统记录用户拼图的时间,当在规定的时间内完成拼图时,挑战成功;否则游戏终止,挑战失败。
5、总结
通过该项目的开发,使我进一步了解基于对话框界面的Windows应用程序的开发过程,并通过项目实训的扩展练习加深印象,为开发较为复杂的应用程序打下基础。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
namespace myPuzzle
{
public partial class Form_Main : Form
{
PictureBox[] pictureList = null;
SortedDictionary pictureLocationDict = new SortedDictionary();
Point[] pointList = null;
SortedDictionary pictureBoxLocationDict = new SortedDictionary();
int second = 0; //拼图时间
PictureBox currentPictureBox = null;
PictureBox haveToPictureBox = null;
Point oldLocation = Point.Empty;
Point newLocation = Point.Empty;
Point mouseDownPoint = Point.Empty;
Rectangle rect = Rectangle.Empty;
bool isDrag = false;
public string originalpicpath;
///
/// 每个方向上要切割成的块数
///
private int ImgNumbers
{
get
{
return (int)this.numericUpDown1.Value;
}
}
///
/// 要切割成的正方形图片边长
///
private int SideLength
{
get
{
return 600 / this.ImgNumbers;
}
}
private void InitRandomPictureBox()
{
pnl_Picture.Controls.Clear();
pictureList = new PictureBox[ImgNumbers * ImgNumbers];
pointList = new Point[ImgNumbers * ImgNumbers];
for (int i = 0; i < this.ImgNumbers; i++)
{
for (int j = 0; j < this.ImgNumbers; j++)
{
PictureBox pic = new PictureBox();
pic.Name = "pictureBox" + (j + i * ImgNumbers + 1).ToString();
pic.Location = new Point(j * SideLength, i * SideLength);
pic.Size = new Size(SideLength, SideLength);
pic.Visible = true;
pic.BorderStyle = BorderStyle.FixedSingle;
pic.MouseDown += new MouseEventHandler(pictureBox_MouseDown);
pic.MouseMove += new MouseEventHandler(pictureBox_MouseMove);
pic.MouseUp += new MouseEventHandler(pictureBox_MouseUp);
pnl_Picture.Controls.Add(pic);
pictureList[j + i * ImgNumbers] = pic;
pointList[j + i * ImgNumbers] = new Point(j * SideLength, i * SideLength);
}
}
}
private void btn_sta_Click(object sender, EventArgs e)
{
Random r = new Random();
int i = r.Next(99);
originalpicpath = Application.StartupPath.ToString() + "\\timg (" + i.ToString() + ").jpg";
//Application.StartupPath.ToString() + "\\timg (58).jpg"
Flow(originalpicpath, true);
//MessageBox.Show(this.ActiveControl.Name);
lab_result.Text = "";
timer1.Start();
CountTime();
}
public void Flow(string path, bool disorder)
{
InitRandomPictureBox();
Image bm = CutPicture.Resize(path, 600, 600);
CutPicture.BitMapList = new List();
for (int y = 0; y < 600; y += SideLength)
{
for (int x = 0; x < 600; x += SideLength)
{
Bitmap temp = CutPicture.Cut(bm, x, y, SideLength, SideLength);
CutPicture.BitMapList.Add(temp);
}
}
ImportBitMap(disorder);
}
public void ImportBitMap(bool disorder)
{
try
{
int i = 0;
foreach (PictureBox item in pictureList)
{
Bitmap temp = CutPicture.BitMapList[i];
item.Image = temp;
i++;
}
if (disorder)
ResetPictureLocation();
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
}
}
public void ResetPictureLocation()
{
Point[] temp = DisOrderLocation();
int i = 0;
foreach (PictureBox item in pictureList)
{
item.Location = temp[i];
i++;
}
}
public Point[] DisOrderLocation()
{
Point[] tempArray = (Point[])pointList.Clone();
for (int i = tempArray.Length - 1; i > 0; i--)
{
Random rand = new Random();
int p = rand.Next(i);
Point temp = tempArray[p];
tempArray[p] = tempArray[i];
tempArray[i] = temp;
}
return tempArray;
}
public void InitGame()
{
if (!Directory.Exists(Application.StartupPath.ToString() + "\\Picture"))
{
Directory.CreateDirectory(Application.StartupPath.ToString() + "\\Picture");
Properties.Resources.timg__1_.Save(Application.StartupPath.ToString() + "\\timg (1).jpg");
Properties.Resources.timg__2_.Save(Application.StartupPath.ToString() + "\\timg (2).jpg");
Properties.Resources.timg__3_.Save(Application.StartupPath.ToString() + "\\timg (3).jpg");
Properties.Resources.timg__4_.Save(Application.StartupPath.ToString() + "\\timg (4).jpg");
Properties.Resources.timg__5_.Save(Application.StartupPath.ToString() + "\\timg (5).jpg");
Properties.Resources.timg__6_.Save(Application.StartupPath.ToString() + "\\timg (6).jpg");
Properties.Resources.timg__7_.Save(Application.StartupPath.ToString() + "\\timg (7).jpg");
Properties.Resources.timg__8_.Save(Application.StartupPath.ToString() + "\\timg (8).jpg");
Properties.Resources.timg__9_.Save(Application.StartupPath.ToString() + "\\timg (9).jpg");
Properties.Resources.timg__10_.Save(Application.StartupPath.ToString() + "\\timg (10).jpg");
Properties.Resources.timg__11_.Save(Application.StartupPath.ToString() + "\\timg (11).jpg");
Properties.Resources.timg__12_.Save(Application.StartupPath.ToString() + "\\timg (12).jpg");
Properties.Resources.timg__13_.Save(Application.StartupPath.ToString() + "\\timg (13).jpg");
Properties.Resources.timg__14_.Save(Application.StartupPath.ToString() + "\\timg (14).jpg");
Properties.Resources.timg__15_.Save(Application.StartupPath.ToString() + "\\timg (15).jpg");
Properties.Resources.timg__16_.Save(Application.StartupPath.ToString() + "\\timg (16).jpg");
Properties.Resources.timg__17_.Save(Application.StartupPath.ToString() + "\\timg (17).jpg");
Properties.Resources.timg__18_.Save(Application.StartupPath.ToString() + "\\timg (18).jpg");
Properties.Resources.timg__19_.Save(Application.StartupPath.ToString() + "\\timg (19).jpg");
Properties.Resources.timg__20_.Save(Application.StartupPath.ToString() + "\\timg (20).jpg");
Properties.Resources.timg__21_.Save(Application.StartupPath.ToString() + "\\timg (21).jpg");
Properties.Resources.timg__22_.Save(Application.StartupPath.ToString() + "\\timg (22).jpg");
Properties.Resources.timg__23_.Save(Application.StartupPath.ToString() + "\\timg (23).jpg");
Properties.Resources.timg__24_.Save(Application.StartupPath.ToString() + "\\timg (24).jpg");
Properties.Resources.timg__25_.Save(Application.StartupPath.ToString() + "\\timg (25).jpg");
Properties.Resources.timg__26_.Save(Application.StartupPath.ToString() + "\\timg (26).jpg");
Properties.Resources.timg__27_.Save(Application.StartupPath.ToString() + "\\timg (27).jpg");
Properties.Resources.timg__28_.Save(Application.StartupPath.ToString() + "\\timg (28).jpg");
Properties.Resources.timg__29_.Save(Application.StartupPath.ToString() + "\\timg (29).jpg");
Properties.Resources.timg__30_.Save(Application.StartupPath.ToString() + "\\timg (30).jpg");
Properties.Resources.timg__31_.Save(Application.StartupPath.ToString() + "\\timg (31).jpg");
Properties.Resources.timg__32_.Save(Application.StartupPath.ToString() + "\\timg (32).jpg");
Properties.Resources.timg__33_.Save(Application.StartupPath.ToString() + "\\timg (33).jpg");
Properties.Resources.timg__34_.Save(Application.StartupPath.ToString() + "\\timg (34).jpg");
Properties.Resources.timg__35_.Save(Application.StartupPath.ToString() + "\\timg (35).jpg");
Properties.Resources.timg__36_.Save(Application.StartupPath.ToString() + "\\timg (36).jpg");
Properties.Resources.timg__37_.Save(Application.StartupPath.ToString() + "\\timg (37).jpg");
Properties.Resources.timg__38_.Save(Application.StartupPath.ToString() + "\\timg (38).jpg");
Properties.Resources.timg__39_.Save(Application.StartupPath.ToString() + "\\timg (39).jpg");
Properties.Resources.timg__40_.Save(Application.StartupPath.ToString() + "\\timg (40).jpg");
Properties.Resources.timg__41_.Save(Application.StartupPath.ToString() + "\\timg (41).jpg");
Properties.Resources.timg__42_.Save(Application.StartupPath.ToString() + "\\timg (42).jpg");
Properties.Resources.timg__43_.Save(Application.StartupPath.ToString() + "\\timg (43).jpg");
Properties.Resources.timg__44_.Save(Application.StartupPath.ToString() + "\\timg (44).jpg");
Properties.Resources.timg__45_.Save(Application.StartupPath.ToString() + "\\timg (45).jpg");
Properties.Resources.timg__46_.Save(Application.StartupPath.ToString() + "\\timg (46).jpg");
Properties.Resources.timg__47_.Save(Application.StartupPath.ToString() + "\\timg (47).jpg");
Properties.Resources.timg__48_.Save(Application.StartupPath.ToString() + "\\timg (48).jpg");
Properties.Resources.timg__49_.Save(Application.StartupPath.ToString() + "\\timg (49).jpg");
Properties.Resources.timg__50_.Save(Application.StartupPath.ToString() + "\\timg (50).jpg");
Properties.Resources.timg__51_.Save(Application.StartupPath.ToString() + "\\timg (51).jpg");
Properties.Resources.timg__52_.Save(Application.StartupPath.ToString() + "\\timg (52).jpg");
Properties.Resources.timg__53_.Save(Application.StartupPath.ToString() + "\\timg (53).jpg");
Properties.Resources.timg__54_.Save(Application.StartupPath.ToString() + "\\timg (54).jpg");
Properties.Resources.timg__55_.Save(Application.StartupPath.ToString() + "\\timg (55).jpg");
Properties.Resources.timg__56_.Save(Application.StartupPath.ToString() + "\\timg (56).jpg");
Properties.Resources.timg__57_.Save(Application.StartupPath.ToString() + "\\timg (57).jpg");
Properties.Resources.timg__58_.Save(Application.StartupPath.ToString() + "\\timg (58).jpg");
Properties.Resources.timg__59_.Save(Application.StartupPath.ToString() + "\\timg (59).jpg");
Properties.Resources.timg__60_.Save(Application.StartupPath.ToString() + "\\timg (60).jpg");
Properties.Resources.timg__61_.Save(Application.StartupPath.ToString() + "\\timg (61).jpg");
Properties.Resources.timg__62_.Save(Application.StartupPath.ToString() + "\\timg (62).jpg");
Properties.Resources.timg__63_.Save(Application.StartupPath.ToString() + "\\timg (63).jpg");
Properties.Resources.timg__64_.Save(Application.StartupPath.ToString() + "\\timg (64).jpg");
Properties.Resources.timg__65_.Save(Application.StartupPath.ToString() + "\\timg (65).jpg");
Properties.Resources.timg__66_.Save(Application.StartupPath.ToString() + "\\timg (66).jpg");
Properties.Resources.timg__67_.Save(Application.StartupPath.ToString() + "\\timg (67).jpg");
Properties.Resources.timg__68_.Save(Application.StartupPath.ToString() + "\\timg (68).jpg");
Properties.Resources.timg__69_.Save(Application.StartupPath.ToString() + "\\timg (69).jpg");
Properties.Resources.timg__70_.Save(Application.StartupPath.ToString() + "\\timg (70).jpg");
Properties.Resources.timg__71_.Save(Application.StartupPath.ToString() + "\\timg (71).jpg");
Properties.Resources.timg__72_.Save(Application.StartupPath.ToString() + "\\timg (72).jpg");
Properties.Resources.timg__73_.Save(Application.StartupPath.ToString() + "\\timg (73).jpg");
Properties.Resources.timg__74_.Save(Application.StartupPath.ToString() + "\\timg (74).jpg");
Properties.Resources.timg__75_.Save(Application.StartupPath.ToString() + "\\timg (75).jpg");
Properties.Resources.timg__76_.Save(Application.StartupPath.ToString() + "\\timg (76).jpg");
Properties.Resources.timg__77_.Save(Application.StartupPath.ToString() + "\\timg (77).jpg");
Properties.Resources.timg__78_.Save(Application.StartupPath.ToString() + "\\timg (78).jpg");
Properties.Resources.timg__79_.Save(Application.StartupPath.ToString() + "\\timg (79).jpg");
Properties.Resources.timg__80_.Save(Application.StartupPath.ToString() + "\\timg (80).jpg");
Properties.Resources.timg__81_.Save(Application.StartupPath.ToString() + "\\timg (81).jpg");
Properties.Resources.timg__82_.Save(Application.StartupPath.ToString() + "\\timg (82).jpg");
Properties.Resources.timg__83_.Save(Application.StartupPath.ToString() + "\\timg (83).jpg");
Properties.Resources.timg__84_.Save(Application.StartupPath.ToString() + "\\timg (84).jpg");
Properties.Resources.timg__85_.Save(Application.StartupPath.ToString() + "\\timg (85).jpg");
Properties.Resources.timg__86_.Save(Application.StartupPath.ToString() + "\\timg (86).jpg");
Properties.Resources.timg__87_.Save(Application.StartupPath.ToString() + "\\timg (87).jpg");
Properties.Resources.timg__88_.Save(Application.StartupPath.ToString() + "\\timg (88).jpg");
Properties.Resources.timg__89_.Save(Application.StartupPath.ToString() + "\\timg (89).jpg");
Properties.Resources.timg__90_.Save(Application.StartupPath.ToString() + "\\timg (90).jpg");
Properties.Resources.timg__91_.Save(Application.StartupPath.ToString() + "\\timg (91).jpg");
Properties.Resources.timg__92_.Save(Application.StartupPath.ToString() + "\\timg (92).jpg");
Properties.Resources.timg__93_.Save(Application.StartupPath.ToString() + "\\timg (93).jpg");
Properties.Resources.timg__94_.Save(Application.StartupPath.ToString() + "\\timg (94).jpg");
Properties.Resources.timg__95_.Save(Application.StartupPath.ToString() + "\\timg (95).jpg");
Properties.Resources.timg__96_.Save(Application.StartupPath.ToString() + "\\timg (96).jpg");
Properties.Resources.timg__97_.Save(Application.StartupPath.ToString() + "\\timg (97).jpg");
Properties.Resources.timg__98_.Save(Application.StartupPath.ToString() + "\\timg (98).jpg");
Properties.Resources.timg__99_.Save(Application.StartupPath.ToString() + "\\timg (99).jpg");
}
Random r = new Random();
int i = r.Next(99);
originalpicpath = Application.StartupPath.ToString() + "\\timg (" + i.ToString() + ").jpg";
Flow(originalpicpath, true);
}
public PictureBox GetPictureBoxByLocation(int x, int y)
{
PictureBox pic = null;
foreach (PictureBox item in pictureList)
{
if (x > item.Location.X && y > item.Location.Y && item.Location.X + SideLength > x && item.Location.Y + SideLength > y)
{
pic = item;
}
}
return pic;
}
public PictureBox GetPictureBoxByHashCode(string hascode)
{
PictureBox pic = null;
foreach (PictureBox item in pictureList)
{
if (hascode == item.GetHashCode().ToString())
{
pic = item;
}
}
return pic;
}
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
oldLocation = new Point(e.X, e.Y);
currentPictureBox = GetPictureBoxByHashCode(sender.GetHashCode().ToString());
MoseDown(currentPictureBox, sender, e);
}
public void MoseDown(PictureBox pic, object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
oldLocation = e.Location;
rect = pic.Bounds;
}
}
private void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isDrag = true;
rect.Location = getPointToForm(new Point(e.Location.X - oldLocation.X, e.Location.Y - oldLocation.Y));
this.Refresh();
}
}
private void reset()
{
mouseDownPoint = Point.Empty;
rect = Rectangle.Empty;
isDrag = false;
}
private Point getPointToForm(Point p)
{
return this.PointToClient(pnl_Picture.PointToScreen(p));
}
private void pictureBox_MouseUp(object sender, MouseEventArgs e)
{
oldLocation = new Point(currentPictureBox.Location.X, currentPictureBox.Location.Y);
if (oldLocation.X + e.X > 600 || oldLocation.Y + e.Y > 600 || oldLocation.X + e.X < 0 || oldLocation.Y + e.Y < 0)
{
return;
}
haveToPictureBox = GetPictureBoxByLocation(oldLocation.X + e.X, oldLocation.Y + e.Y);
newLocation = new Point(haveToPictureBox.Location.X, haveToPictureBox.Location.Y);
haveToPictureBox.Location = oldLocation;
PictureMouseUp(currentPictureBox, sender, e);
if (Judge())
{
lab_result.Text = "成功!";
}
}
public void PictureMouseUp(PictureBox pic, object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (isDrag)
{
isDrag = false;
pic.Location = newLocation;
this.Refresh();
}
reset();
}
}
public bool Judge()
{
bool result = true;
int i = 0;
foreach (PictureBox item in pictureList)
{
if (item.Location != pointList[i])
{
result = true;
}
i++;
}
return result;
}
public Form_Main()
{
InitializeComponent();
InitGame();
}
private void pnl_Picture_Paint(object sender, PaintEventArgs e)
{
}
private void splitContainer1_Panel1_Paint(object sender, PaintEventArgs e)
{
}
private void Form_Main_Load(object sender, EventArgs e)
{
}
private void btn_import_Click(object sender, EventArgs e)
{
OpenFileDialog new_picture = new OpenFileDialog();
if (new_picture.ShowDialog() == DialogResult.OK)
{
lab_result.Text = " ";
originalpicpath = new_picture.FileName;
CutPicture.PicturePath = new_picture.FileName;
Flow(CutPicture.PicturePath, true);
CountTime();
}
}
private void btn_Changepic_Click(object sender, EventArgs e)
{
Random r = new Random();
int i = r.Next(99);
originalpicpath = Application.StartupPath.ToString() + "\\timg (" + i.ToString() + ").jpg";
//Application.StartupPath.ToString() + "\\timg (58).jpg"
Flow(originalpicpath, true);
CountTime();
}
private void btn_Reset_Click(object sender, EventArgs e)
{
Flow(originalpicpath, true);
CountTime();
}
private void btn_Originalpic_Click(object sender, EventArgs e)
{
Form_Original original = new Form_Original();
original.picpath = originalpicpath;
original.ShowDialog();
}
private void splitContainer1_Panel2_Paint(object sender, PaintEventArgs e)
{
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
}
private void numericUpDown1_ValueChanged_1(object sender, EventArgs e)
{
}
private void lab_result_Click(object sender, EventArgs e)
{
}
public void CountTime()
{
lab_time.Text = "0";
timer1.Start();
}
//private void btn_sta_Click_1(object sender, EventArgs e)
//{
//
// lab_result.Text = "";
//timer1.Start();
//}
private void timer1_Tick(object sender, EventArgs e)
{
// CountTime();
second++;
lab_time.Text = second.ToString();
if (second == 30)
{
timer1.Stop();
lab_result.Text = "失败!";
MessageBox.Show("You are losed!");
}
}
private void lab_time_Click(object sender, EventArgs e)
{
}
private void pnl_Picture_Paint_1(object sender, PaintEventArgs e)
{
}
}
}
具体的C#文件压缩包如下链接所示:
https://download.csdn.net/download/qq_41509200/11584088