扫雷 思路 与源代码 二

扫雷步骤2:

首先第一步:随机埋雷, 定义一个随机埋雷的对象,循环,取得一个整数范围的数量(0- 格子的数)如果这个格子有地雷为真,那么循环+1
第二步:计算每个格子周边的格子的数量 用循环所有格子,其次在用一个cell类型的数组,并在周围格子的占内存中查找来存放当前方格周边所有的方格 并用int unm来记录 (传一个对象给我,然后统计当前的地雷)如果在周围格子中发现了地雷,记录下来并将值传给cell数组
第三步:定义一个周边格子的的数组类将当前格子传给它。 先计算左右、上下、四个角,并返回一个值,到第二步。
第四步:定义打开格子的三种情况:一是有雷,二是空的,三,将格子周边的地雷数显示到这个格子上。

 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public class MineField
{


private int width;

public int Width //宽度
{
get { return width; }
set { width = value; }
}

private int height;

public int Height //高度
{
get { return height; }
set { height = value; }
}

private Cell[] cells; //根据用户的选择来初始化多个少个格子

public Cell[] Cells
{
get { return cells; }
set { cells = value; }
}

private int minecout;

public int Minecout //地雷数
{
get { return minecout; }
set { minecout = value; }
}

private int linecout;

public int Linecout //一行的格子数
{
get { return linecout; }
set { linecout = value; }
}


public MineField() { }
public MineField(int width, int height, int linecout, int minecout) //构造雷区的方法
{

this.width = width;
this.height = height;
this.linecout = linecout;
this.minecout = minecout;
this.Init();
}
//初始化雷区的方法
public void Init()
{

cells = new Cell[linecout * linecout]; //按照每边的数量创建所有的格子
for (int i = 0; i < linecout * linecout; i++)
{

cells[i] = new Cell();
cells[i].Click += MineField_Click;


}

this.Layyout();
//随即埋雷
Random r=new Random(); //定义一个随机类型
for (int i = 0; i < minecout; )
{


int index = r.Next(0, linecout * linecout); //随机取得一个整数 范围是0-21
if (!cells[index].HasMine)
{
cells[index].HasMine = true;
i++;
}



}

//填写每个方格周边的数量
for (int i = 0; i < linecout * linecout; i++)
{
//分别计算当前格子的地雷数量

//定义一个cell类型的数组用来存放当前方格周边计算周边所有的方格
int num = 0;
Cell[] arroundCells = this.GetAroundCells(cells[i],ref num);
//给我一个格子 运行getaroumn方法中将左右、上下 四个角 的格子算出 并返回给这个方法运行
int count = 0;
for (int j = 0; j < num; j++)
{

if (arroundCells[j].HasMine) //统计所有方格的地雷
{

count++;
}

}

//将定义好的赋值到当前方格的aroundMineCount属性中
cells[i].AroundMineCount = count;

}

}

void MineField_Click(object sender, EventArgs e)
{
Cell cell = (Cell)sender;
if (cell.HasMine)
{

cell.Open();
this.OpenAllCells();
MessageBox.Show("你踩雷了");


}
else if (cell.AroundMineCount != 0)
{

cell.Open();

}
else
{
cell.Open();
int num = 0;
Cell[] aroundCells = this.GetAroundCells(cell,ref num);
for (int i = 0; i < num; i++)
{

aroundCells[i].Open();

}

}


}


//获取某个周边的方格
public Cell[] GetAroundCells(Cell currentCell, ref int num) //给我一个格子我给你所有的格子
{
int cellWidth = this.width / linecout;
int cellHeight = this.height / linecout;
Cell[] aroundCells = new Cell[8];

for (int i = 0; i < linecout * linecout; i++)
{
if (cells[i].Top == currentCell.Top && Math.Abs(cells[i].Left - currentCell.Left) == cellWidth)
{
aroundCells[num++] = cells[i]; //左右
}
if (cells[i].Left == currentCell.Left && Math.Abs(cells[i].Top - currentCell.Top) == cellHeight)
{
aroundCells[num++] = cells[i]; //上下
}
if (Math.Abs(cells[i].Top - currentCell.Top) == cellHeight && Math.Abs(cells[i].Left - currentCell.Left) == cellWidth)
{
aroundCells[num++] = cells[i]; //四个角
}

}
return aroundCells;
}
public void Layyout()
{

int cellWidth = this.width / Linecout;
int cellHeihth = this.height / Linecout;
int k = 0;
int left, top;
left = 0;
top = 0;
for (int i = 0; i < linecout; i++)
{
left = 0;
for (int j = 0; j < linecout; j++)
{
cells[k].Width = cellWidth;
cells[k].Height = cellHeihth;
cells[k].Left = left;
cells[k].Top = top;
left += cellWidth;
k++;

}
top += cellHeihth;
}



}
//翻开所有的方格
public void OpenAllCells()
{

for (int i = 0; i < linecout*linecout; i++)
{

cells[i].Open();

}


}

}
}

//格子的状态

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
using WindowsFormsApplication1.Properties;

namespace WindowsFormsApplication1
{

public class Cell:Button
{
//是否存在地雷
private bool hasMine;

public bool HasMine
{
get { return hasMine; }
set { hasMine = value; }
}
//格子四周地雷数
private int aroundMineCount;

public int AroundMineCount
{
get { return aroundMineCount; }
set { aroundMineCount = value; }
}

private Cellstate state;

public Cellstate State
{ //格子的状态
get { return state; }
set { state = value; }
}


public enum Cellstate
{
//枚举类型 四种状态 翻开,关闭,标记、还原
Open,
Closed,
Mark,
Reset


}
public Cell()
{
this.state = Cellstate.Closed; //初始化翻开的时候是关闭的
this.BackgroundImageLayout = ImageLayout.Stretch;

}

public void Open() //打开时的状态
{

if (this.hasMine)
{
this.BackgroundImage=Resources.MarkedWrong;

}
else if (this.aroundMineCount == 0)
{

this.BackColor = Color.Green;


}
else
{

switch (aroundMineCount)
{


case 1: this.BackgroundImage = Resources._1; break;
case 2: this.BackgroundImage = Resources._2; break;
case 3: this.BackgroundImage = Resources._3; break;
case 4: this.BackgroundImage = Resources._4; break;
case 5: this.BackgroundImage = Resources._5; break;
case 6: this.BackgroundImage = Resources._6; break;
case 7: this.BackgroundImage = Resources._7; break;
case 8: this.BackgroundImage = Resources._8; break;

}

}
this.Enabled = false;
}

public void Mark()
{
//标记

}

public void Reset()
{

//重置恢复到关闭的状态
}

}
}

posted @ 2016-01-11 10:25  西瓜冰镇老板  阅读(558)  评论(0编辑  收藏  举报