C# winform 连连看游戏 超详细教程(适合新手和进阶者)

zmidl 2012-05-05 11:59:15
加精
由于不能贴外链图片我会直接贴上源代码对于菜鸟级新手可以访问我的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;//不满足以上条件的话则返回“真”值
}


...全文
30464 292 打赏 收藏 转发到动态 举报
写回复
用AI写文章
292 条回复
切换为时间正序
请发表友善的回复…
发表回复
RayBreslin 2015-01-22
  • 打赏
  • 举报
回复
精彩,学习了!!
西了 2015-01-12
  • 打赏
  • 举报
回复
如果玩游戏时限制时间,应该如何弄?请教
Super_over 2014-12-10
  • 打赏
  • 举报
回复
最近在学,看看
BUGTeam 2014-06-23
  • 打赏
  • 举报
回复
楼主可以加个qq937365374指导一下吗。不胜感激
w704932496 2014-05-27
  • 打赏
  • 举报
回复
- -!卤煮说的太对了,,我现在就是个超级菜鸟。。那些教科书讲的实在是太笼统,真心对于新手来说帮助不是非常明显。现在看了两本书了但是面对一个小程序从构思到完成真的是完全无从下手,都不知道到底该怎么去做,卤煮你说的那些十几行几十行的小程序,是在哪找的呀。。我也想多找一些来练练。。求告知,感激不尽
survey999 2014-05-21
  • 打赏
  • 举报
回复
好牛啊………………
csharpSun 2014-05-05
  • 打赏
  • 举报
回复
菜鸟来学习了,能打包发源码到我空间么,415128149@qq.com
零字符 2014-03-18
  • 打赏
  • 举报
回复
收藏一个备用
joyhen 2014-03-13
  • 打赏
  • 举报
回复
虽中文看着有些别扭,但是楼主乐于分享,代码功力深厚啊,支持
Rstar颜 2014-03-12
  • 打赏
  • 举报
回复
谁说必须要用 英文命名了 搞笑。。楼主说了用中文名只是为了直观点。 难道你用个英文名 就是高手了 ?
liqiexingxing 2014-02-28
  • 打赏
  • 举报
回复
挺牛的。。。。。。一定学习
这里是左手 2014-02-21
  • 打赏
  • 举报
回复
LZ 你买的那本书是第几版啊? 我也想去买来看看
小童 2013-12-27
  • 打赏
  • 举报
回复
中文看起来还是很别扭。
850030278 2013-12-26
  • 打赏
  • 举报
回复
值得借鉴 可以学到不少东西
u011022940 2013-11-19
  • 打赏
  • 举报
回复
以前用C++的 现在项目要用C# 进来学习!
  • 打赏
  • 举报
回复
能分享源码吗?
蛋蛋的痛 2013-11-06
  • 打赏
  • 举报
回复
膜拜楼主,牛逼哄哄
wyhjq 2013-10-04
  • 打赏
  • 举报
回复
受教受教
踏浪雪 2013-10-02
  • 打赏
  • 举报
回复
标记了,超级大菜鸟,和楼主说的情况一样,现在好好潜水,好好学习
xiaoshi657 2013-09-12
  • 打赏
  • 举报
回复
收藏了,好东西
加载更多回复(220)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧