中午闲来无聊,正好在些winfrom小案例,于是想用VS、C#写点东西,由于能力有限,当然的写个简单点的啦,于是花了半个个小时写了这个拼图游戏小程序,希望对初学winfrom和C#的朋友有所帮助。程序运行效果如下:
1)首先按上图添加控件;
2)下面是程序的主要代码:功能如注释所示:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace JD_Game_TZ
{
public partial class FrmMain : Form
{
//图片原图块
private int FirstBlock;
//布局大小
private int GameSize;
//图片宽度
private int MAP_WIDTH = 300;
//图片列表
public PictureBox[] PicBlock;
//存放图片序号的数组
private int[] Position;
//图片新图块
private int SecondBlock;
//原图像
private Bitmap Source;
//所选择的文件名
private string filename;
//是否交换
private bool flag;
public FrmMain()
{
InitializeComponent();
}
#region 窗体事件
//窗体加载时
private void FrmMain_Load(object sender, EventArgs e)
{
//设置默认图像路径
filename = Application.StartupPath + "\\image.bmp";
//将图片放置到pictureBox1里
pictureBox1.Image = Image.FromFile(filename);
//不交换
flag = false;
//设置图片大小
MAP_WIDTH = 300;
//设置位图区域
Source = new Bitmap(MAP_WIDTH, MAP_WIDTH);
SavBmp();
}
//打开文件对话框选择图片
private void btnImage_Click(object sender, EventArgs e)
{
打开对话框
//openFileDialog1.ShowDialog();
判断字符串是否为空字符串
//if (!string.IsNullOrEmpty(openFileDialog1.FileName))
//{
// //获取图片全路径
// filename = openFileDialog1.FileName;
// //将图片赋给pictureBox1
// pictureBox1.Image = Image.FromFile(filename);
// //指定大小保存位图
// SavBmp();
//}
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//获取图片全路径
filename = openFileDialog1.FileName;
//将图片赋给pictureBox1
pictureBox1.Image = Image.FromFile(filename);
//指定大小保存位图
SavBmp();
}
}
//开始按钮
private void btnBegin_Click(object sender, EventArgs e)
{
//卸载上次的图片块
init(GameSize);
//重新加载图片块
int i = 0;
//获取小图片的边距
int BWidth = 0;
BWidth = MAP_WIDTH / GameSize;
//遍历布局
for (i = 0; i <= GameSize * GameSize - 1; i++)
{
//创建PictureBox
PicBlock[i] = new PictureBox();
//PictureBox添加到控件
Controls.Add(PicBlock[i]);
//左边距
PicBlock[i].Left = 250 + BWidth * (i % GameSize);
//上边距
PicBlock[i].Top = BWidth * (i / GameSize) + 70;
//宽度
PicBlock[i].Width = BWidth;
//高度
PicBlock[i].Height = BWidth;
//命名
PicBlock[i].Name = "PicBlock" + i.ToString();
//小图序号
PicBlock[i].Tag = i;
//设置小图图片
PicBlock[i].Image = createImage(Position[i]);
//设置小图片的边框
PicBlock[i].BorderStyle = BorderStyle.Fixed3D;
PicBlock[i].BringToFront();
(PicBlock[i]).Click += swap;
}
}
//下拉框选择分割数
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//获取分割数
GameSize = (int)Math.Sqrt(Convert.ToInt16(comboBox1.Text));
//分割图片
init(GameSize);
}
#endregion
//按指定大小保存所选图片到Source位图
private void SavBmp()
{
Graphics g;
//在位图区域生成Graphics对象
g = Graphics.FromImage(Source);
//在位图区域绘制图片
g.DrawImage(Image.FromFile(filename), 0, 0, MAP_WIDTH, MAP_WIDTH);
}
#region 分割方法
//打散图片
private void init(int n)
{
//创建随机对象
Random rdm = new Random();
//创建动态数组对象去装图片
ArrayList al = new ArrayList();
//定义临时变量存储产生的随机数
int t = 0;
t=0;
//分割数
while (al.Count < n * n)
{
//产生随机图片小块的编号
t = rdm.Next(0, n * n);
//判断随机小块序号是否存在动态数组里
if ((!al.Contains(t)))
{
al.Add(t);
}
}
//清除已有图片框控件数组中的控件
if (PicBlock != null)
{
//遍历图片列表内容
for (int i = 0; i < PicBlock.Length; i++)
{
//图片列表不为空
if (PicBlock[i] != null)
{
//图片列表释放所有资源
PicBlock[i].Dispose();
}
}
}
//创建PictureBox
PicBlock = new PictureBox[n * n];
//图片序号的数组
Position = new int[n * n];
//遍历图片序号数组
for(t = 0; t <=al.Count-1; t++)
{
//获取小图片的序号
Position[t] = Convert.ToInt16(al[t]);
}
}
//分割图片
public Bitmap createImage(int n)
{
int W = 0;
//获取小图的大小
W = MAP_WIDTH / GameSize;
//设置小图片的位图区域
Bitmap bit = new Bitmap(W, W);
//创建小图片区域的绘制工具
Graphics g = Graphics.FromImage(bit);
// 矩形
Rectangle a = new Rectangle(0, 0, W, W);
//截图
Rectangle b = new Rectangle((n % GameSize) * W, n / GameSize * W, W, W);
//绘图
g.DrawImage(Source, a, b, GraphicsUnit.Pixel);
return bit;
}
#endregion
#region 交换事件
//交换方法
private void swap(object sender, EventArgs e)
{
//这里处理公共事件,根据单击交换数组元素
PictureBox bClick = (PictureBox)sender;
//定义临时变量接受点击小图的序号
int i = 0;
Image temp;
//将被点击的控件赋给bClick变量
if (flag == false)
{
//交换
flag = true;
//获取第一次点击图片的序号
FirstBlock = Convert.ToInt16(bClick.Tag);
}
else//交换
{
Text = "";
//获取第二次点击图片的序号
SecondBlock = Convert.ToInt16(bClick.Tag);
//获取交换的序号图片
temp = PicBlock[SecondBlock].Image;
//交换点击的图片
PicBlock[SecondBlock].Image = PicBlock[FirstBlock].Image;
PicBlock[FirstBlock].Image = temp;
//停止交换
flag = false;
//临时变量存储交换的图片序号
i = Position[SecondBlock];
//交换图片序号
Position[SecondBlock] = Position[FirstBlock];
Position[FirstBlock] = i;
foreach (int s in Position)//遍历图片序号数组
{
//存储图片的序号拼接
Text = Text + Position[s].ToString();
}
if (CheckWin())//过关
{
MessageBox.Show("厉害完成了", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
//判断是否成功
private bool CheckWin()
{
int t = 0;
//遍历图片序号数组
for (t = 0; t <=Position.Length-1; t++)
{
//图片序号批对上
if (Position[t] != t)
{
//返回
return false;
}
}
return true;
}
#endregion
}
}
以上是程序的主要代码;
主要的代码就这些吧,怎么添加响应函数就不用说了吧,嘿嘿
这是资源的下载地址:
图片拼图游戏- 下载频道 - CSDN.NET
http://download.csdn.net/my/uploads