⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 minesarea.cs

📁 C#实现的扫雷游戏,可以做为C#编程的例子学习
💻 CS
字号:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace MinesWeeper
{

	public class MinesArea : System.Windows.Forms.UserControl,IMineDisplay
	{
		bool isMouseLeftDown = false;

		bool isFailed = false;

		private IMineEngine mineEngine;

		private IDrawSetting drawSetting;


		private System.ComponentModel.Container components = null;

		public MinesArea()
		{
			drawSetting = new DefaultDrawSetting();
			InitializeComponent();
		}

		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if(components != null)
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region InitializeComponent 

		private void InitializeComponent()
		{
			components = new System.ComponentModel.Container();
		}
		#endregion

		protected override void OnPaint(PaintEventArgs e)
		{
			base.OnPaint (e);
			if(null != MineEngine && null != MineEngine.MinesRank)
			{
				for(int i=0;i<MineEngine.X;i++)
				{
					for(int j=0;j<MineEngine.Y;j++)
					{
						if(isFailed)
						{
							DrawMineWhenFailed(e.Graphics,i,j,MineEngine.MinesRank[i,j]);
						}
						else
						{
							DrawMine(e.Graphics,i,j,MineEngine.MinesRank[i,j]);
						}
					}
				}
			}
		}


		protected override void OnMouseDown(MouseEventArgs e)
		{
			base.OnMouseDown (e);
			doMouseDown(MineEngine,e);

		}

		
		protected override void OnMouseUp(MouseEventArgs e)
		{
			base.OnMouseUp (e);
			doMouseUp(MineEngine,e);
		}

		
		void doMouseDown(IMineEngine memento,MouseEventArgs e)
		{
			if(null == memento)
				return;
			switch(e.Button)
			{
				case MouseButtons.Right:
					memento.Flag(e.X/drawSetting.Width,e.Y/drawSetting.Width);
					break;
				case MouseButtons.Left:
					isMouseLeftDown = true;
					break;
				default:
					return;
			}
			
		}

		
		void doMouseUp(IMineEngine memento,MouseEventArgs e)
		{
			if(null == memento)
				return;
			switch(e.Button)
			{
				case MouseButtons.Right:
					if(isMouseLeftDown)
					{
						memento.Clear(e.X/drawSetting.Width,e.Y/drawSetting.Width);
					}
					break;
				case MouseButtons.Left:
					isMouseLeftDown = false;
					memento.Open(e.X/drawSetting.Width,e.Y/drawSetting.Width);
					break;
				default:
					return;
			}
		}


		void DrawMine(Graphics g,int x,int y,byte val)
		{
			Border3DStyle style = DrawSetting.GetBorderStyle(MineUtils.IsOpened(val));
			ControlPaint.DrawBorder3D(g,x*drawSetting.Width,y*drawSetting.Width,drawSetting.Width-1,drawSetting.Width-1,style);
			PointF pointF = new PointF(x*drawSetting.Width+3,y*drawSetting.Width+3);
			String display = getDrawString(val);
			drawSetting.DisplayBrush.Color = drawSetting.GetColorByString(display);
			g.DrawString(display,drawSetting.DisplayFont,drawSetting.DisplayBrush,pointF);
		}


		void DrawMineWhenFailed(Graphics g,int x,int y,byte val)
		{
			Border3DStyle style = Border3DStyle.SunkenInner;
			ControlPaint.DrawBorder3D(g,x*drawSetting.Width,y*drawSetting.Width,drawSetting.Width-1,drawSetting.Width-1,style);
			PointF pointF = new PointF(x*drawSetting.Width+3,y*drawSetting.Width+3);
			String display = getDrawStringIgnoreStatus(val);
			drawSetting.DisplayBrush.Color = drawSetting.GetColorByString(display);
			g.DrawString(display,drawSetting.DisplayFont,drawSetting.DisplayBrush,pointF);
		}

		
		String getDrawStringIgnoreStatus(byte mine)
		{
			int inside = MineUtils.getInside(mine);
			if(inside == 0)
				return String.Empty;
			return (inside == MineUtils.mineVal) ? drawSetting.MineDisplay : inside.ToString();
		}


		String getDrawString(byte mine)
		{
			if(MineUtils.IsOpened(mine))
			{
				return getDrawStringIgnoreStatus(mine);
			}
			
			return MineUtils.getFlgString(mine);
		}


		void OnMementoWorked(object sender, WorkEventArgs arg)
		{
			if(null == arg)
				return;
			switch(arg.Works)
			{
				case WorkType.Refresh:
					this.Refresh();
					break;
				case WorkType.Start:
					isFailed = false;
					Width = drawSetting.Width * MineEngine.X;
					Height = drawSetting.Width * MineEngine.Y;
					this.Refresh();
					break;
				case WorkType.Faile:
					isFailed = true;
					this.Refresh();
					break;
				case WorkType.Done:
					MessageBox.Show("You are successful in:"+arg.UseTimes);
					break;
				default:
					return;
			}
		}


		public IMineEngine MineEngine
		{
			get{ return mineEngine; }
			set
			{ 
				mineEngine = value; 
				if(null != value)
				{
					mineEngine.Worked += new WorkEventHandler(OnMementoWorked);
				}
			}
		}


		public IDrawSetting DrawSetting
		{
			get
			{
				return drawSetting;
			}
			set
			{
				drawSetting = value;
			}
		}

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -