VS,C#--拼图小游戏

来源:互联网 发布:soc管理平台 知乎 编辑:程序博客网 时间:2024/05/17 09:07

中午闲来无聊,正好在些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


2 0