欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » ASP.Net » 正文

热门阅读

趣味编程:C#扫雷代码

创建时间:2011年06月12日 23:39  阅读次数:(5145)
分享到:
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;
}
}
}
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 31+37=? 的结果(结果是:68)
结  果: