110,536
社区成员
发帖
与我相关
我的任务
分享
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;//不满足以上条件的话则返回“真”值
}