扫雷程序
using System;
using System.Drawing;
using System.Windows.Forms; namespace WindowsFormsApplication1 {
public partial class Frm1 : Form {
#region 变量
public int qishu;
public static int ls=20, hs=11; public int lgs = 30; //列~行。数数
public int bl=0; //是否重新布雷 public int time ;
public int[,] bulei = new int[ls, hs]; //bulei变的变数0代表无雷~1-8代表雷的~个数9
代表雷
public int ceshi = 0;
public int[,] click = new int[ls, hs]; //10表示要除是变变的 清既11表示右变一次~12表
示右变次 两16表示以除变了清
public int sum = 0;
public int timerEnable = 0; //游变所变的变 状0是游变中 #endregion
public Frm1;,
{
InitializeComponent;,~
}
///
/// 变变雷的 和可的旗个数插数
///
public void Qishu;,
{
if ;qishu <= lgs,
{
gamesource.Text = "00" + ;lgs - qishu,。ToString;,~ }
else
{
gamesource.Text = "00" + ;lgs - qishu,。ToString;,~ }
}
///
/// 方格画
///
/// <变例变象>
/// <要变的位置画>
/// <要变的位置画>
/// <变使用的变色画>
public void Dline;Graphics dline,int mx1,int my1,Pen mypen, {
dline.DrawLine;mypen , mx1, my1, mx1 + 20, my1,~ dline.DrawLine;mypen, mx1, my1, mx1, my1 + 20,~ dline.DrawLine;new Pen;Color.Black,~ mx1 + 20, my1, mx1 + 20, my1 +
20,~
dline.DrawLine;new Pen;Color.Black,~ mx1, my1 + 20, mx1 + 20, my1 +
20,~
}
///
/// 看是否可以向周变移变
///
/// <移变的基本X坐变>
/// <移变的基本Y坐变>
public void Panjie;int x,int y,
{
Pl;x, y,~
if ;y - 1 >= 0, {
Pl;x,y-1,~
if ;x - 1 >= 0, {
Pl;x-1,y-1,~ }
if ;x + 1
{
Pl;x + 1, y - 1,~ }
}
if ;y + 1 < hs, {
Pl;x,y+1,~
if ;x - 1 >= 0, {
Pl;x - 1, y + 1,~ }
if ;x + 1 < ls, {
Pl;x + 1, y +1,~ }
}
if ;x - 1 >= 0, {
Pl;x - 1 ,y,~ }
if ;x + 1 < ls, {
Pl;x + 1,y,~
}
}
///
/// 判是否要除断清清
///
/// <要判的基本断X坐变>
/// <要判的基本断Y坐变>
public void Pl;int x, int y,
{
if ;bulei[x, y] == 0 && click[x, y] != 10 && click[x, y] != 11 && click[x, y] !
= 16,
{
click[x, y] = 10; Panjie;x,y,~
}
if ;bulei[x, y] > 0 && bulei[x, y] < 9 && click[x, y] != 10 && click[x, y] !=
11 && click[x, y] != 16,
{
click[x, y] = 10; }
}
///
/// 初始化变~布雷~判周变的雷数断数
///
public void Blpl;, {
sum = ls * hs; qishu = 0;
int mx,my;
//初始化变 数9表示雷数
int mx1,my1;
int sum1=0;
for ;mx = 0; mx < ls; mx++, {
for ;my = 0; my
{
bulei[mx, my] = 0;
click[mx, my] = 0;
}
}
while;sum1
//定雷的和雷德位置决个数
{
sum1= 0;
Random r = new Random;;int,DateTime.Now.Ticks,~
mx = r.Next;ls-1,~
my = r.Next;hs-1,~
bulei[mx,my] = 9;
for ;mx1 = 0; mx1 < ls; mx1++, {
for ;my1 = 0; my1 < hs; my1++, {
sum1 += bulei[mx1, my1]; }
}
}
//判周变雷的断个数
for ;mx = 0; mx < ls; mx++, {
for ;my = 0; my < hs; my++, {
if ;bulei[mx,my] != 9, {
if ;mx - 1 >= 0,
{
if ;bulei[mx - 1, my] == 9, {
bulei[mx, my]++;
}
if ;my - 1 >= 0 && bulei[mx - 1, my - 1] == 9,
{
bulei[mx, my]++;
}
if ; my + 1 < hs && bulei[mx - 1, my + 1] == 9,
{
bulei[mx , my]++;
}
}
if ;mx +1
{
if ;bulei[mx + 1, my] == 9, {
bulei[mx, my]++;
}
if ;my- 1 >= 0 && bulei[mx+ 1, my - 1] == 9,
{
bulei[mx, my]++;
}
if ;my + 1 < hs && bulei[mx + 1, my + 1] == 9,
{
bulei[mx, my]++;
}
}
if;my-1>=0 && bulei[mx,my-1]==9, {
bulei[mx, my]++;
}
if ;my +1
{
bulei[mx, my]++;
}
}
}
}
}
///
/// 右变的重变
///
/// >
public void Rdraw;Graphics dline,
{
string text;
int mx,my;
int mx1, my1;
for ;mx = 0;mx < ls; mx++, {
for ;my = 0; my < hs; my++, {
mx1 = mx * 2 + mx * 20 + 4; my1 = my * 2 + my * 20 + 4; if ; click[mx, my] == 11, {
//第一次右变旗画
dline.DrawLine;new Pen;Color.White,~ mx1, my1, mx1 + 20, my1 + 20,~ dline.DrawLine;new Pen;Color.White,~ mx1, my1, mx1, my1 + 20,~ dline.DrawLine;new Pen;Color.Black,~ mx1 + 20, my1, mx1 + 20, my1 + 20,~
dline.DrawLine;new Pen;Color.Black,~ mx1, my1 + 20, mx1 + 20, my1 + 20,~
dline.FillRectangle;new SolidBrush;Color.FromArgb;224, 224, 224,,~ mx1 + 1, my1 + 1, 18, 18,~
text = "P";
dline.DrawString;text, new Font;"宋体", 15,~ new SolidBrush;Color.Red,~
mx1 + 2, my1 + 2,~
}
if ; click[mx, my] == 12,
{
//第二次右变变变画号
dline.DrawLine;new Pen;Color.White,~ mx1, my1, mx1 + 20, my1 + 20,~ dline.DrawLine;new Pen;Color.White,~ mx1, my1, mx1, my1 + 20,~ dline.DrawLine;new Pen;Color.Black,~ mx1 + 20, my1, mx1 + 20, my1 + 20,~
dline.DrawLine;new Pen;Color.Black,~ mx1, my1 + 20, mx1 + 20, my1 + 20,~
dline.FillRectangle;new SolidBrush;Color.FromArgb;224, 224, 224,,~ mx1 + 1, my1 + 1, 18, 18,~
text = "?";
dline.DrawString;text, new Font;"宋体", 15,~ new SolidBrush;Color.Black,~ mx1 + 2, my1 + 2,~
}
if ;click[mx, my] == 13,
{
//第三次右变 恢变原变
click[mx, my] = 2;
dline.DrawLine;new Pen;Color.White,~ mx1, my1, mx1 + 20, my1 + 20,~
dline.DrawLine;new Pen;Color.White,~ mx1, my1, mx1, my1 + 20,~ dline.DrawLine;new Pen;Color.Black,~ mx1 + 20, my1, mx1 + 20, my1 +
20,~
dline.DrawLine;new Pen;Color.Black,~ mx1, my1 + 20, mx1 + 20, my1 +
20,~
dline.FillRectangle;new SolidBrush;Color.FromArgb;224, 224, 224,,~ mx1 +
1, my1 + 1, 18, 18,~
}
}
}
}
///
/// 初始化幕 ;包变所有的,屏
///
public void Startscr;,
{
Graphics dline = labdraw.CreateGraphics;,~ time = 0;
Blpl;,~
timer1.Enabled = false;
Color c = Color.FromArgb;224, 224, 224,~
labdraw.CreateGraphics;,。Clear;c,~
Drawscreen;dline,~
timerEnable = 0;
labtime.Text = ;"000",~
}
///
/// 界面画
///
/// >
public void Drawscreen;Graphics dline, {
sum = 0; //得到楚的格子没清数
int mx, my;
int mx1 = 0, my1 = 0; //得到要变的坐变画
string text;
for ;mx = 0; mx < ls; mx++,
{
for ;my = 0; my < hs; my++,
{
//变地位置 画mx~my分变是幕屏x~y变
mx1 = mx * 2 + mx * 20 + 4;
my1 = my * 2 + my * 20 + 4;
if ;click[mx, my] != 10 && click[mx, my] != 12 && click[mx, my] != 16 &&
click[mx, my] != 15,
{
//下面用于立形矩形~画体
sum++;
Pen mypen = new Pen;Color.Gray,~ Dline;dline, mx1, my1, mypen,~ dline.FillRectangle;new SolidBrush;Color.FromArgb;224, 224, 224,,~ mx1 +
1, my1 + 1, 18, 18,~
}
if ;;click[mx, my] == 10 || click[mx, my] == 16,,
{
click[mx, my] = 16; //除的格子清
//提示周变的雷数
if ;bulei[mx, my] <= 8 && bulei[mx, my] > 0,
{
text = bulei[mx, my].ToString;,~
dline.DrawString;text, new Font;"宋体", 15,~ new SolidBrush;Color.Black,~
mx1 + 2, my1 + 2,~
}
//变示雷
if ;;bulei[mx, my] == 9 || bulei[mx, my] == 100,, {
text = "*";
dline.DrawString;text, new Font;"宋体", 15,~ new SolidBrush;Color.Black,~
mx1 + 2, my1 + 2,~
if ;bulei[mx, my] == 100,
{
//被变变的雷上上叉画号
dline.DrawLine;new Pen;Color.Red,~ mx1, my1, mx1 + 20, my1 + 20,~
dline.DrawLine;new Pen;Color.Red,~ mx1, my1 + 20, mx1 + 20, my1,~
}
}
}
}
//用于旗 和变画号
Rdraw;dline,~
}
}
///
/// 变雷变的算法当
///
/// >
/// >
public void Panlei;int x, int y, {
if ;bulei[x, y] != 0,
{
if ;bulei[x, y] == 9, {
timer1.Enabled = false; //使变变器停止
timerEnable = 1; //使游变出游变束变状
bulei[x, y] = 100;
int i, j;
for ;i = 0; i < ls; i++, {
for ;j = 0; j < hs; j++, {
if ;bulei[i, j] == 9 || bulei[i, j] ==100,
{
click[i, j] = 10; //变示所有的雷 }
}
}
}
if ;bulei[x, y] > 0 && bulei[x, y] < 9,
{
click[x, y] = 10;
}
}
else
{
Panjie;x, y,~
}
}
///
/// 回到游变变始的界面
///
///
///
private void btnreplay_Click;object sender, EventArgs e,
{
//初始化一切 包括布雷 ,界面~ click变数
Startscr;,~
}
///
/// 变算游变所用的变变
///
///
///
private void timer1_Tick;object sender, EventArgs e,
{
time++;
if ;time <= 99,
{
if ;time < 10,
{
labtime.Text = ;"00" + time.ToString;,,~
}
else
{
labtime.Text = ;"0" + time.ToString;,,~
}
}
else
{
if ;time < 99,
{
labtime.Text = ;time.ToString;,,~
}
else
{
timer1.Enabled = false;
MessageBox.Show;"RIME OVER ",~
time = 0;
timerEnable = 1; }
}
}
///
/// 在变的游变变初始化界面启
///
///
///
private void labdraw_Paint;object sender, PaintEventArgs e,
{
Graphics dline = e.Graphics;
if ;bl == 0,
{
Blpl;,~
Drawscreen;dline,~ }
else
{
Drawscreen;dline,~ }
}
///
/// //变变变变的事件触
///
///
///
private void labdraw_MouseClick;object sender, MouseEventArgs e,
{
bl = 10;
int i=0, j=0;
if ;timerEnable == 0, //判游变是否变于变束变断状
{
timer1.Enabled = true; Graphics dline = labdraw.CreateGraphics;,~ //将LAB1建立成变形变象
int mx = 0, my = 0; int mx2 = 0, my2 = 0; int mx3 = 0, my3 = 0; //判鼠变所点位置断
mx2 = e.X;
my2 = e.Y;
for ;i = 0; i < ls; i++, {
for ;j = 0; j < hs; j++, {
mx = 4 + i * 2 + i * 20; my = 4 + j * 2 + j * 20; //到变变位置代表的变找数
if ;mx < mx2 && mx + 20+4 > mx2 && my < my2 && my2 < my + 20+4 ,
{
mx3 = i;
my3 = j;
break;
}
}
if ;j < 9,
{
break;
}
}
//判是左变变是右变断
if ;e.Button == MouseButtons.Right && click[mx3, my3] != 10 && mx3 >= 0
&& my3 >= 0 && click[mx3, my3] != 16,
{
//第2次右变
if ;click[mx3, my3] == 11 && click[mx3, my3] != 10,
{
click[mx3, my3] = 12;
--qishu;
}
else
{
//第1次右变
if ;click[mx3, my3] != 12 && click[mx3, my3] != 10,
{
if ;qishu
{
click[mx3, my3] = 11;
qishu++;
}
}
if ;click[mx3, my3] == 12 && click[mx3, my3] != 10,
{
click[mx3, my3] = 13;
}
}
//右变的变变事件
Rdraw;dline,~
Qishu;,~
}
else
{
//左变
if ;click[mx3, my3] != 11 && click[mx3, my3] != 16,
{
click[mx3, my3] = 15;
Color c = Color.FromArgb;224, 224, 224,~
// 用背景变色清屏
labdraw.CreateGraphics;,。Clear;c,~ Panlei ;mx3, my3,~
Drawscreen;dline,~
}
if ;bulei[mx3, my3] == 100, {
MessageBox.Show;"GAME OVER",~ timer1.Enabled = false; timerEnable = 1;
}
}
if ;sum == lgs,
{
MessageBox.Show;"GAME WIN",~ timer1.Enabled = false; timerEnable = 1;
}
}
}
private void Frm1_Load;object sender, EventArgs e,
{
Qishu;,~ //变出雷的个数
// this.Height = hs * 22 + 20; // this.Width = ls * 22 + 8; }
}
}