首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# winform 连连看游戏 超详细教程(适合新手和进阶者),该如何处理

2013-01-25 
C# winform 连连看游戏 超详细教程(适合新手和进阶者)由于不能贴外链图片我会直接贴上源代码对于菜鸟级新

C# winform 连连看游戏 超详细教程(适合新手和进阶者)
    由于不能贴外链图片我会直接贴上源代码对于菜鸟级新手可以访问我的QQ空间或者微博学习图文并茂的教程(http://user.qzone.qq.com/5747226/infocenter#!app=2&pos=1333162482),如果是有一定C#基础的进阶者可以直接看代码和代码后的注释。如果你是超级菜鸟新手的话你一定会有和我一样的经历与感受。那就是无从入手。市面上的所有的所谓学习宝典与大全其实根本不适合菜鸟举个亲身例子,当我想了解什么是类的概念,翻开大全得到的只是一句简单的名词解释。“类:相同对象的集合”试问什么是对象?什么样的东西又是他娘的集合呢?如果你知道C#的对象和集合概念了你还会不知道什么是类吗?所以说对于菜鸟来说最重要的不是去学习什么类呀什么是封装啊。先从一个十几行、几十行的小程序开始。添加一些控件,玩玩控件的单机事件。写一个银行存储利息计算器,接触学习一下变量的声明和值类型之间的转换。由浅入深的学习。什么样的书是好书,从一个很小的软件开始 穿插一些语法基础知识点 加以详细解释 逻辑指导 图文并茂的展示软件开发的全过程 一个一个开发实例 最后开发一个综合中大型应用程序。这样的书才是好书,但是这样一本书的编写却是很不容易的,而国内就我当时开始学习C#时候这样的书找遍书城只有一本。《C#程序设计-windows项目开发》清华大学出版社的。读完了此书我才有所入门C#winform开发。于是自己萌生了独立写一些小程序的想法并开始网上搜索技术难题,于是找到了这个csdn论坛
,前些年我在csdn上发过很多求教的帖子,比如上海浮生记,水果机开发等。
    好了废话打住,如果你现在和我当时一样状态的话我很愿意分享我的经历给大家和大家一起学习交流下面是源代码的实现


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;//ArrayList 命名空间
using System.Threading;

namespace 连连看
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       
        private Bitmap 图集;//各种图案的图片集合
        
        private int 边长 = 50;//各种图案方块的边长
        
        private int 尺寸 = 10;//布局大小,行数与列数
        
        private bool 已选 = false;//布尔值是否已经选中状态
        
        private int x1, y1, x2, y2;//被选中两个图的坐标
        
        public Point z1, z2;//折点坐标
        
        private int 行 = 10, 列 = 10;//行列间距
        
        private int[] 地图 = new int[12 * 12];//一维数组一百个字节的内存容量
        
        public sbyte 刷新 = new sbyte();
        
        private int 已消除 = 25;//用来给以消除的方块赋值-1来记录以消除的方块为哪些

        public int a1, a2, b1, b2;//用来消除电脑查找留下的白框 存放临时两点坐标

        public sbyte 是否胜利 = 0;//用来储存成功消除队数 日后用来判断是否获胜

        public enum 连线方式 { 直连, 一折, 二折 };//枚举三种连线方式
        连线方式 啥方式呀=new 连线方式();//实例化一个lxfs

        private void 连连看_Load(object sender, EventArgs e)


        {
            
            初始化游戏();
            this.CenterToScreen();
        }
       
        private void 初始化游戏()//游戏虚拟地图初始化方法
        {
            刷新 = 3;
            this.pictureBox1.Cursor = Cursors.Hand;
            this.pictureBox1.Height = 边长 * (行 + 2);
            //设置图片框控件初始高度 由于图形矩阵为10*10 加之上下间隙
            //间隙算边长所以上下一共算两个间隙单位 
            
            this.pictureBox1.Width = 边长 * (列 + 2);

            this.Height = this.pictureBox1.Height +
                (this.Height - this.ClientRectangle.Height) +
                this.menuStrip1.Height;
            /*这里this就是“连连看.Form1”也就是设置窗体的高度 窗体的高度
              是根据图片框的高度来定的 所以由图片框高度 加上标题栏和菜单栏
              的高度 得出的窗体高度*/
            
            this.Width = this.pictureBox1.Width +
                (this.Width - this.ClientRectangle.Width);
            //窗体宽度基本就是图框宽度了
            抽象排列();
            生成界面();
        }

        private void 抽象排列()
        {
            Random 随机 = new Random();//声明一个随即对象 r
            ArrayList 动态数组 = new ArrayList();//声明一个动态数组
            for (int i = 0; i < (行 * 列) / 4; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    动态数组.Add(i);//动态数组添加4组0到24共计100个ID
                }


            }
            for (int i = 0; i < (行 * 列); i++)
            {
                int nIndex = 随机.Next() % 动态数组.Count;
                地图[i] = (int)动态数组[nIndex];
                动态数组.RemoveAt(nIndex);
                //至此 数组“地图[i] 内字符以 4组 0~24 不规则随机排列”
                //listView1.Items.Add(nIndex.ToString());
            }
        }
        
        private void 生成界面()//用被截图排矩阵形成初始化图像
        {
            Graphics g = 界面();
            for (int i = 0; i < 100; i++)//最基本的for循环不解释了
            {
              
                g.DrawImage(截图(地图[i]), 边长 * (i % 尺寸) + 
                    边长, 边长*(i / 尺寸) + 边长, 边长, 边长);
                //画出10乘10的方图矩阵
                /*由于数组地图[i]已完成4组 0~24 不规则随机排列,故而以“i”
                 作为下标来完成截图可以保证所截相同图的ID一致*/
                //Graphics g = this.pictureBox1.CreateGraphics();
                Pen p = new Pen(Color.Black, 3);
                Rectangle a = new Rectangle((i % 尺寸) * 边长 + 边长, (i / 尺寸) * 边长 + 边长, 边长 - 3, 边长 - 3);
                g.DrawRectangle(p, a);
            }
        }

        private Graphics 界面()
        //此方法以pictureBox控件的背景作为GDI绘图的画板。方法返回一个Graphics类型
        {
            if(pictureBox1.Image == null)
            {
                Bitmap bmp = new Bitmap(pictureBox1.Width,pictureBox1.Height);


                pictureBox1.Image = bmp;
            }
            Graphics g = Graphics.FromImage(pictureBox1.Image);
            return g;
        }    
       
        private Bitmap 截图(int 标号)//截图方法
        {
            //string 图片路径 = 连连看.Properties.Resources.tp;
            //图集 = (Bitmap)Image.FromFile(Application.StartupPath + @"\Image\tp.jpg");
            //图片实例化并且指定图片集合的路径

            图集 = 连连看.Properties.Resources.tp;
            //这里图集是 Bitmap类型 而资源库里的图片也是此类型可以直接引用
            
            Bitmap 被截图 = new Bitmap(边长,边长);
            //从Bitmap类库中 申明一个 被截图对象 实例化 边长为50
            
            Graphics 图片 = Graphics.FromImage(被截图);
            //GDI绘图 用的是所截图 也就是先前申明的 被截图
            
          
            Rectangle a = new Rectangle(0,0,边长,边长);
            //矩形对象 x,y位置 宽高 四个参数
            
            Rectangle b = new Rectangle(标号 * 64, 0, 64, 64);
            /*这里用“标号”来控制所截图的不同,比如当标号=2的时候
             这里的截图开始的点就变成78了 就变成第二张图了
             前两个也是位置坐标参数 后两个是像素 大小 分别是宽与高
             */
            
            图片.DrawImage(图集,a,b,GraphicsUnit.Pixel);
            /*截图方法 图集自然就是要截图的图源 
             a  指定所绘制图像的位置和大小,将图像进行缩放以适合该矩形。
             b  图集对象中要绘制的部分。最后 指定参数所用的度量单位。
             总的来说 次方法就把图片一块一块截下来 指定边长为长度的正方形
             */
            return 被截图;
            //方法返回值为bitmap类型 所以返回“被截图”便于之后作为bitmap类


            //用于其他方法的参数中
        }
        
        private bool Y直连(int y1, int y2, int x)
        {
            if (y1 > y2)//判断y坐标大小
            {
                int a = y1;
                y1 = y2;
                y2 = a;
                //如果y1小于y2的则两点换位,用一个a来做中介传递参数,应该都看得懂吧
            }
            //当第一点的y坐标大于第二点y坐标时,第一点在第二点之下
            //循环就要用“i = y1 - 1; i > y2; i--”来完成,为了程序的代码可以重复调用
            //所以给两点坐标换位来达到第一点y轴坐标永远小于第二点y轴坐标
            //这样一来 “i = y1 + 1; i < y2; i++”只要写一次便可以多次调用,
            //写代码就简单了 一劳永逸啊。
            for (int i = y1 + 1; i < y2; i++)//这里的代码和x直连方法一样,只是方向不同而已
            {
                if(i==y2)
                {
                    break;
                }
                if(地图[i*10+x]!=已消除)
                {
                    return false;
                }
            }
            return true;
        }
        
        private bool X直连(int x1, int x2,int y)
        {
            if (x1 > x2)
            {
                int n = x1;
                x1 = x2;
                x2 = n;
            }


            //x轴方法 三个参数 分别是 第一、二两点的x轴坐标和一个y轴坐标,
            //因为y轴相同所以y无所谓那个点
            for (int i = x1 + 1; i < x2; i++)
            {
                //这里循环从第一点的后边一个点开始知道第二点的左边一点
                if (i == x2)//如果两点紧挨着则直接跳出循环
                {
                    break;
                }
                if (地图[y * 10 + i] != 已消除)
                //这里用“-1”给数组赋值来记录方块以消除
                //判断数组是否有-1的值也就是说方块是否消
                //除如果没有消除也就无法连通
                {
                    return false;//则返回,返回“假”值
                }
            }
            return true;//不满足以上条件的话则返回“真”值
        }

       


[解决办法]
不错不错不错不错
[解决办法]
不错,支持原创!C# winform 连连看游戏 超详细教程(适合新手和进阶者),该如何处理
[解决办法]
不错,不错,多谢分享
[解决办法]
支持原创,建议加精。
[解决办法]
这语言这么强大,支持中文变量和函数,见识了。。。
[解决办法]
受教受教
[解决办法]
支持...
[解决办法]
支持原则,MARK

[解决办法]
额 竟然是中文编程 囧rz 你是不是学易语言滴 以前...
话说 这个程序代码倒是不错 学习了
[解决办法]
最好将 项目打包 直接发到csdn的资源中 供大家学习 谢谢交流
[解决办法]
实在是拿不出闲工夫啊。看不了这类东西。我即使是出机试题,也是从实际项目中找出来的小题目。
[解决办法]
看上去挺不错
[解决办法]
很强大啊,佩服
[解决办法]
牛人~~~~
------解决方案--------------------


这个好哈……
[解决办法]
牛叉,牛呜。
[解决办法]
Bitmap 截图 里的 第一句和第二句都是注释?不小心打错了吧?
[解决办法]
收藏了,也学习了。太好了

[解决办法]
果断收藏了。。不错不错;
[解决办法]

引用:
这语言这么强大,支持中文变量和函数,见识了。。。


都201X了,不支持中文变量和函数的也太落伍了吧


引用:
额 竟然是中文编程 囧rz 你是不是学易语言滴 以前...
话说 这个程序代码倒是不错 学习了

只是使用中文变量和函数,又不是关键字使用中文,一般不算中文编程

热点排行