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

📄 form2.cs

📁 这是我的第一个,里面有好多个游戏,要是不对给我留言,
💻 CS
字号:
//迷宫类相关
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
namespace MazeDemo{ /// <summary> /// 迷宫类 /// </summary> 
	public class CMaze {  bool[,] mg;  //地图格子  
		Stack stack; //堆栈  
		Point in_p;  //入口点  
		Point out_p; //出口点  
		Point start_p; //绘制迷时候的起始点 
		Size boxsize; //每个格子的大小  
		int step_count; //共走多少步
  public CMaze()  {  
	  stack=new Stack();   
	  this.start_p=new Point(0,0);  
	  this.boxsize=new Size(50,50); 
	  step_count=0;  
  }
  public CMaze(bool[,] _mg):this()  
  {   this.mg=_mg;  }
  public CMaze(bool[,] _mg,Point _in,Point _out):this() 
  {   this.mg=_mg;   
	  this.in_p=_in;  
	  this.out_p=_out;  
	  Stack way=this.Test(this.in_p,_in);  
	  stack.Push(new CCoor(this.in_p,way));  
	  this.step_count++;  }
  /// <summary>  /// 绘制迷宫时窗口的起始坐标  /// </summary>   /// 
 public Point StartPoint  {  
 set{this.start_p=value;}   
	 get{return this.start_p;} 
 }
  /// <summary>  /// 当前迷宫共走多少步  /// </summary> ///
   public int StepCount  {   get{return this.step_count;}  }
  /// <summary>  /// 迷宫格子大小  /// </summary>   ///
  public Size BoxSize  {   set{this.boxsize=value;}   get{return this.boxsize;}  }
  /// <summary>  /// 堆栈数据个数  /// </summary>  ///
   public int StackCount  {   get{return this.stack.Count;}  }
  /// <summary>  /// 绘制迷宫  /// </summary>  /// <param name="g"></param>   ///
  public void DrawBox(Graphics g)  
  {  
	  for(int i=0;i<mg.GetLength(0);i++)  
	  {   
		  for(int j=0;j<mg.GetLength(1);j++)   
		  {     
			  Point pp=new Point((j*BoxSize.Width)+StartPoint.X,(i*BoxSize.Height)+StartPoint.Y); //位置    
			  SolidBrush brush;    
			  Rectangle rect=new Rectangle(pp,BoxSize);
              if(mg[i,j])     
				  brush=new SolidBrush(Color.Green);     
			  else      
				  brush=new SolidBrush(Color.Red);     
			  g.FillRectangle(brush,rect);   
		  }   
	  } 
  }
  /// <summary>  /// 绘制所走线路  /// </summary>  /// <param name="g"></param> /// 
   public void DrawPath(Graphics g) 
   {   
	   IEnumerator myEnumerator = stack.GetEnumerator();   
	   while ( myEnumerator.MoveNext() )   
	   {    
		   CCoor c=new CCoor();    
		   c=(CCoor)myEnumerator.Current;    
		   Point pp=new Point((c.CurrentPoint.Y*BoxSize.Width)+StartPoint.X,(c.CurrentPoint.X*BoxSize.Height)+StartPoint.Y);    
		   SolidBrush brush=new SolidBrush(Color.Blue);    
		   Rectangle rect=new Rectangle(pp,BoxSize);    
		   g.FillRectangle(brush,rect);  
	   }  
   }
  /// <summary>  /// 绘制当前位置的可行路径  /// </summary>  /// <param name="g"></param>  /// 
  /// 
  public void DrawNextPath(Graphics g)  
  {  
	  CCoor c=(CCoor)this.stack.Peek();   
	  Stack s=c.WayPath;   
	  IEnumerator myEnumerator=s.GetEnumerator();  
	  while(myEnumerator.MoveNext())  
	  {    
		  Point p=(Point)myEnumerator.Current;   
		  Point pp=new Point((p.Y*BoxSize.Width)+StartPoint.X,(p.X*BoxSize.Height)+StartPoint.Y);   
		  SolidBrush brush=new SolidBrush(Color.Yellow);    
		  Rectangle rect=new Rectangle(pp,BoxSize);    
		  g.FillRectangle(brush,rect);   
	  } 
  }
  /// <summary>  /// 判断迷宫是否走完  /// </summary>  /// <returns></returns>   ///  
public bool IsEnd() 
{  
	CCoor coor=(CCoor)this.stack.Peek(); //当前位置信息   
	if( coor.CurrentPoint.X==this.out_p.X && coor.CurrentPoint.Y==this.out_p.Y )    
		return true;  
	else    
		return false; 
}
  /// <summary>  /// 走一迷宫中的一个格子  /// </summary>  /// <returns>数字状态</returns>  ///
   public int Step()  
   {   
	   CCoor coor=(CCoor)this.stack.Peek(); //当前位置信息   //是否到达出口   
	   if(!(coor.CurrentPoint.X==this.out_p.X&&coor.CurrentPoint.Y==this.out_p.Y))   
	   {    
		   Stack ss=coor.WayPath;   
		   if(ss.Count==0)    
		   {    
			   this.stack.Pop();  
			   return 0;   
		   }    
		   Point p=(Point)ss.Pop(); //当前位置可继续移动的下一个位置    
		   if(p.X==this.out_p.X&&p.Y==this.out_p.Y)    
		   {     
			   this.stack.Push(new CCoor(p,new Stack()));   
			   return 0;   
		   }    
		   Stack st=this.Test(p,coor.CurrentPoint); //得到下一个可移动位置的所有可移动位置    
		   if(st.Count==0)    
		   {    
			   return 0;   
		   }   
		   CCoor newcoor=new CCoor(p,st); //建立新的位置信息   
		   this.stack.Push(newcoor); //压入堆栈    
		   this.step_count++; //所走步骤加1   
		   return 0;   }   
	   else    
		   return 1; 
   }
  /// <summary>  /// 走迷宫  /// </summary>   ///
  public void Run()  {  
	  while(this.Step()!=1); 
  }
  /// <summary>  /// 回复到迷宫起点  /// </summary> /// 
   public void Reset()  
   {   
	   this.stack.Clear();  
	   Stack way=this.Test(this.in_p,this.in_p);  
	   stack.Push(new CCoor(this.in_p,way));  
	   this.step_count=1;  
   }
  /// <summary>  /// 探测可行路线  /// 探测顺序 右->前->左->后  ///       左  ///       |  ///   后--+-->前  ///       |  ///       右  /// </summary>  /// <param name="p">从当前点查询四周是否有可行路线</param>  /// <param name="perv_p">先前的路线</param>  /// <returns>可行路线堆栈</returns>   ///
  public Stack Test(Point p,Point perv_p)  {   
	  Stack stack_way=new Stack(); //该点可行位置堆栈  
	  int x,y;
   //后  
	  x=p.X;   
	  y=p.Y-1;   
	  this.Signpost(x,y,stack_way,perv_p);
   //左   
	  x=p.X-1;  
	  y=p.Y;   
	  this.Signpost(x,y,stack_way,perv_p);
   //前   
	  x=p.X;   
	  y=p.Y+1;   
	  this.Signpost(x,y,stack_way,perv_p);
   //右  
	  x=p.X+1;  
	  y=p.Y;   
	  this.Signpost(x,y,stack_way,perv_p);
	  return stack_way; 
  }
  /// <summary>  /// 判断该方向是否可行,可行则将信息压入堆栈,只在Test()函数中调用  /// </summary>  /// <param name="x">x坐标</param>  /// <param name="y">y坐标</param>  /// <param name="s">堆栈</param>  /// <param name="perv_p">来时候的方向</param>    /// 
private void Signpost(int x,int y,Stack s,Point perv_p)  
{  
	if(  (x>=0 && x<this.mg.GetLength(0)) && (y>=0 && y<this.mg.GetLength(1)) )   
	{    if(this.mg[x,y]&&!(x==perv_p.X&&y==perv_p.Y))    
			 s.Push(new Point(x,y));   
	}  
}
  /// <summary>  /// 迷宫简图  /// </summary>  /// <returns>字符地图</returns> /// 
   public override string ToString()  
   {  
	   string str="";   
	   for(int i=0;i<mg.GetLength(0);i++)  
														  
	   {    
		   for(int j=0;j<mg.GetLength(1);j++)   
			{     if(this.mg[i,j])      
					  str+="□";     
				  else      
					  str+="■";   
		   }   
		   str+="\n";  
	   }  
	   return str;  
   }
	
	}
 /// <summary> /// 当前坐标信息,和可走方向坐标 /// </summary>  ///
 public class CCoor {  
	 private Point curr_p; //当前坐标  
	 private Stack way;  //可走方向坐标
  public CCoor()  {   //...  
  }
  public CCoor(Point p,Stack w) 
  {  
	  curr_p=p;   way=w; 
  }
  public Point CurrentPoint  {   get{return this.curr_p;}   set{this.curr_p=value;}  }
  public Stack WayPath  {   set{this.way=value;}   get{return this.way;}  } }}

⌨️ 快捷键说明

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