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

📄 cell.cs

📁 迷宫游戏源码
💻 CS
字号:
using System;
using System.Drawing;

namespace MazeSolution
{
	/// <summary>
	/// Summary description for Cell.
	/// </summary>
	public class Cell
	{
		public enum CellState
		{
			FREE = 0,
			WALLA = 1,
			WALLB = 2,
			WALLC = 3,
			WALLD = 4,
			WALLE = 5,
			WALLF = 6,
			WALLG = 7,
			WALLH = 8,
			WALLI = 9,
			WALLJ = 10,
			WALLK = 11,
			WALLL = 12,
			WALLM = 13,
			WALLN = 14,
			WALLO = 15,
			WALLP = 16
		}

		public const int PADDING = 5;
		public static int kCellSize = 5;
		public int[] Walls  = new int[4]{1, 1, 1, 1};
		public CellState cellState = CellState.FREE;
		public int Row;
		public int Column;
		private long Seed = DateTime.Now.Ticks;
		public static Random TheRandom;
		
		
		public Cell()
		{
			TheRandom = new Random((int)Seed);
		}

		public bool HasAllWalls()
		{
			for (int i = 0; i < 4; i++)
			{
				 if (Walls[i] == 0)
					 return false;
			}

			return true;
		}

		public void KnockDownWall(int theWall)
		{
			Walls[theWall] = 0;
		}

		public void KnockDownWall(Cell theCell)
		{
			// find adjacent wall
			int theWallToKnockDown = FindAdjacentWall(theCell);
			Walls[theWallToKnockDown] = 0;
			int oppositeWall = (theWallToKnockDown + 2) % 4;
			theCell.Walls[oppositeWall] = 0;
		}


		public int FindAdjacentWall(Cell theCell)
		{
			if (theCell.Row == Row) 
			{
				if (theCell.Column < Column)
					return 0;
				else
					return 2;
			}
			else // columns are the same
			{
				if (theCell.Row < Row)
					return 1;
				else
					return 3;
			}
		}

		public int GetRandomWall()
		{
			int nextWall = TheRandom.Next(0, 3);
			while ( (Walls[nextWall] == 0)  
			||		((Row == 0) && (nextWall == 0)) ||
					((Row == Maze.kDimension - 1) && (nextWall == 2)) ||
					((Column == 0) && (nextWall == 1)) ||
					((Column == Maze.kDimension - 1) && (nextWall == 3)) 
				   )
			{
				nextWall = TheRandom.Next(0, 3);
			}

			return nextWall;
		}

		public void Draw(Graphics g)
		{
			Pen fillPen = null;
			Brush fillBrush = null;

			// Each wall type is drawn in a different color.
			switch( cellState )
			{
				case CellState.WALLA:
					fillPen = new Pen( Color.BlueViolet );
					fillBrush = Brushes.BlueViolet;
					break;
				case CellState.WALLB:
					fillPen = new Pen( Color.DarkViolet );
					fillBrush = Brushes.DarkViolet;
					break;
				case CellState.WALLC:
					fillPen = new Pen( Color.SlateBlue );
					fillBrush = Brushes.SlateBlue;
					break;
				case CellState.WALLD:
					fillPen = new Pen( Color.MediumPurple );
					fillBrush = Brushes.MediumPurple;
					break;
				case CellState.WALLE:
					fillPen = new Pen( Color.Green );
					fillBrush = Brushes.Green;
					break;
				case CellState.WALLF:
					fillPen = new Pen( Color.DarkGreen );
					fillBrush = Brushes.DarkGreen;
					break;
				case CellState.WALLG:
					fillPen = new Pen( Color.MidnightBlue );
					fillBrush = Brushes.MidnightBlue;
					break;
				case CellState.WALLH:
					fillPen = new Pen( Color.Indigo );
					fillBrush = Brushes.Indigo;
					break;
				case CellState.WALLI:
					fillPen = new Pen( Color.Navy );
					fillBrush = Brushes.Navy;
					break;
				case CellState.WALLJ:
					fillPen = new Pen( Color.RoyalBlue );
					fillBrush = Brushes.RoyalBlue;
					break;
				case CellState.WALLK:
					fillPen = new Pen( Color.SlateGray );
					fillBrush = Brushes.SlateGray;
					break;
				case CellState.WALLL:
					fillPen = new Pen( Color.DarkOliveGreen );
					fillBrush = Brushes.DarkOliveGreen;
					break;
				case CellState.WALLM:
					fillPen = new Pen( Color.DarkSlateBlue );
					fillBrush = Brushes.DarkSlateBlue;
					break;
				case CellState.WALLN:
					fillPen = new Pen( Color.DodgerBlue );
					fillBrush = Brushes.DodgerBlue;
					break;
				case CellState.WALLO:
					fillPen = new Pen( Color.ForestGreen );
					fillBrush = Brushes.ForestGreen;
					break;
				case CellState.WALLP:
					fillPen = new Pen( Color.SkyBlue );
					fillBrush = Brushes.SkyBlue;
					break;
			}

			// First fill in all cells that are not free...
			if ( (int)cellState > (int)CellState.FREE )
			{
				g.FillRectangle(fillBrush, Row*kCellSize + PADDING + 1, Column*kCellSize + PADDING + 1, kCellSize - 1, kCellSize - 1);

				if (Walls[0] == 0)
					g.DrawLine(fillPen, Row*kCellSize + PADDING, Column*kCellSize + PADDING, (Row+1) * kCellSize   + PADDING, Column*kCellSize +  + PADDING);
				if (Walls[1] == 0)
					g.DrawLine(fillPen, Row*kCellSize  + PADDING, Column*kCellSize + PADDING, Row*kCellSize + PADDING, (Column+1)*kCellSize + PADDING);
				if (Walls[2] == 0)
					g.DrawLine(fillPen, Row*kCellSize + PADDING, (Column+1)*kCellSize + PADDING, (Row+1)*kCellSize + PADDING, (Column+1)*kCellSize + PADDING);
				if (Walls[3] == 0)
					g.DrawLine(fillPen, (Row+1)*kCellSize + PADDING , Column*kCellSize + PADDING, (Row+1)*kCellSize + PADDING, (Column+1)*kCellSize + PADDING);
			}

			// Then draw the cell walls.
			if (Walls[0] == 1)
				g.DrawLine(Pens.Blue, Row*kCellSize + PADDING, Column*kCellSize + PADDING, (Row+1) * kCellSize   + PADDING, Column*kCellSize +  + PADDING);

			if (Walls[1] == 1)
				g.DrawLine(Pens.Blue, Row*kCellSize  + PADDING, Column*kCellSize + PADDING, Row*kCellSize + PADDING, (Column+1)*kCellSize + PADDING);

			if (Walls[2] == 1)
				g.DrawLine(Pens.Blue, Row*kCellSize + PADDING, (Column+1)*kCellSize + PADDING, (Row+1)*kCellSize + PADDING, (Column+1)*kCellSize + PADDING);

			if (Walls[3] == 1)
				g.DrawLine(Pens.Blue,(Row+1)*kCellSize + PADDING , Column*kCellSize + PADDING, (Row+1)*kCellSize + PADDING, (Column+1)*kCellSize + PADDING);
		}
	}
}

⌨️ 快捷键说明

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