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

📄 tetrisgrid.cs

📁 game tetris :), this file is a little too big but it s run well, besides, it also has file descripti
💻 CS
📖 第 1 页 / 共 2 页
字号:
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {                    
                    bwriter.Close();
                    file.Close();                    
                }
            }
        }

        public void SaveTetrisGrid(BinaryWriter bwriter)
        {
            bwriter.Write(settings.Columns);
            bwriter.Write(settings.Rows);
            int squaresCount = squares.Length;
            bwriter.Write(squaresCount);
            for (int i = 0; i < squaresCount; i++)
            {
                /*bwriter.Write(squares[i].MyColor.ToString());*/
                bwriter.Write(squares[i].Filled);
            }
            int invalidRectsCount = invalidRects.Count;
            bwriter.Write(invalidRectsCount);
            for (int i = 0; i < invalidRectsCount; i++)
            {
                SingleSquare square = (SingleSquare)invalidRects[i];
                /*bwriter.Write(square.MyColor.ToString());*/
                bwriter.Write(square.Filled);
            }
            bwriter.Write(currentFigure.Range);
            int angle = currentFigure.GetAngle();
            bwriter.Write(angle);
            bwriter.Write(currentFigure.XPosition);
            bwriter.Write(currentFigure.YPosition);
            bwriter.Write(newFigure);           
            bwriter.Write(nextFig);
            bwriter.Write(gameOver);
            bwriter.Write(gameStarted);
            bwriter.Write(score);
            bwriter.Write(lines);
            bwriter.Write(level);
            bwriter.Write(timer.Interval);
            bwriter.Flush();
        }
        
        public void InitGameLoad()
        {
            OpenFileDialog openFileDiaglog = new OpenFileDialog();
            openFileDiaglog.Filter = "Tetris Files | *.gat";
            openFileDiaglog.CheckFileExists = true;
            if (openFileDiaglog.ShowDialog() == DialogResult.OK)
            {
                string path = openFileDiaglog.FileName;
                FileStream file = File.Open(path, FileMode.Open, FileAccess.Read);
                BinaryReader breader = new BinaryReader(file);
                try
                {
                    LoadTetrisGrid(breader);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    breader.Close();
                    file.Close();
                    Refresh();
                }
            }            
        }

        public void InitCurrentFigure(int range)
        {
            switch (range)
            {
                case 0:
                    currentFigure = new Square(this);
                    break;
                case 1:
                    currentFigure = new Line(this);
                    break;
                case 2:
                    currentFigure = new Triangle(this);
                    break;
                case 3:
                    currentFigure = new LThunder(this);
                    break;
                case 4:
                    currentFigure = new RThunder(this);
                    break;
                case 5:
                    currentFigure = new RightT(this);
                    break;
                case 6:
                    currentFigure = new LeftT(this);
                    break;
            }
        }

        public void LoadTetrisGrid(BinaryReader breader)
        {
            settings.Columns = breader.ReadInt32();
            settings.Rows = breader.ReadInt32();
            settings.SetResize();
            settings.ApplySettings();
            int squaresCount = breader.ReadInt32();
            for (int i = 0; i < squaresCount; i++)
            {
                /*squares[i].MyColor = Color.FromName(breader.ReadString());*/
                squares[i].MyColor = settings.squareColor;
                squares[i].Filled = breader.ReadBoolean();
            }
            int invalidRectsCount = breader.ReadInt32();
            for (int i = 0; i < invalidRectsCount; i++)
            {
                SingleSquare square = new SingleSquare(this);
                /*square.MyColor = Color.FromName(breader.ReadString());*/
                square.MyColor = settings.squareColor;
                square.Filled = breader.ReadBoolean();
                invalidRects.Add(square);
            }
            int range = breader.ReadInt32();
            InitCurrentFigure(range);           
            int angle = breader.ReadInt32();
            currentFigure.SetAngle(angle);
            currentFigure.XPosition = breader.ReadInt32();
            currentFigure.YPosition = breader.ReadInt32();
            newFigure = breader.ReadBoolean();
            nextFig = breader.ReadByte();
            gameOver = breader.ReadBoolean();
            gameStarted = breader.ReadBoolean();
            score = breader.ReadInt32();
            lines = breader.ReadInt32();
            level = breader.ReadByte();
            timer.Interval = breader.ReadInt32();
        }

		#endregion

		#region Helper methods

		public bool OnPause()
		{
			if(!gameStarted)
				return false;
			if(timer.Enabled)
			{
				timer.Stop();
			}
			else
			{
				timer.Start();
			}
			if(GamePaused != null)
				GamePaused(this, new EventArgs());

			return true;
		}

		internal void UpdateLevel()
		{
			switch(level)
			{
				case 1:
					if(lines >= 20)
						level++;
					break;
				case 2:
					if(lines >= 40)
						level++;
					break;
				case 3:
					if(lines >= 60)
						level++;
					break;
				case 4:
					if(lines >= 80)
						level++;
					break;
				case 5:
					if(lines >= 100)
						level++;
					break;
				case 6:
					if(lines >= 120)
						level++;
					break;
				case 7:
					if(lines >= 140)
						level++;
					break;
				case 8:
					if(lines >= 160)
						level++;
					break;
				case 9:
					if(lines >= 180)
						level++;
					break;
				case 10:
					if(lines >= 200)
						level++;
					break;
				case 11:
					if(lines >= 220)
						level++;
					break;
				default:
					return;
			}

			UpdateInterval();
		}

		internal void UpdateInterval()
		{
			switch(level)
			{
				case 1:
					timer.Interval = 1000;
					break;
				case 2:
					timer.Interval = 900;
					break;
				case 3:
					timer.Interval = 800;
					break;
				case 4:
					timer.Interval = 700;
					break;
				case 5:
					timer.Interval = 600;
					break;
				case 6:
					timer.Interval = 500;
					break;
				case 7:
					timer.Interval = 400;
					break;
				case 8:
					timer.Interval = 300;
					break;
				case 9:
					timer.Interval = 200;
					break;
				case 10:
					timer.Interval = 100;
					break;
				case 11:
					timer.Interval = 80;
					break;
				case 12:
					timer.Interval = 60;
					break;
			}
		}

		internal void UpdateSize()
		{
			if(settings != null)
			{
				Width = settings.columns * settings.squareWidth;
				Height = settings.rows * settings.squareWidth;
				InitRectangles();
			}
		}

		bool GetLine(int y)
		{
			if( y < 0 || y > settings.rows - 1)
				return false;
			bool flag = squares[y * settings.columns].filled;
			if(!flag)
				return false;
			for(int i = y * settings.columns + 1; i < y * settings.columns + settings.columns; i++)
			{
				if(!squares[i].filled)
					return false;
			}
			return true;
		}

		void ClearLine(int y)
		{
			if(y < 0 || y > settings.rows-1)
				return;
			for(int i = y * settings.columns; i < y * settings.columns + settings.columns; i++)
			{
                invalidRects.Add(squares[i]);
				squares[i].filled = false;
			}
		}

		void ScrollLine(int y)
		{
			for(int i = y * settings.columns + settings.columns - 1; i >= 0; i--)
			{
				if(squares[i].filled)
				{
					invalidRects.Add(squares[i]);
					squares[i].filled = false;
					squares[i + settings.columns].filled = true;
				}
			}
		}

		internal void SmartRefresh()
		{
			Rectangle r = new Rectangle();
			int counter = 0;

			//create a rectangle object that is union of all the invalid rects
			foreach(SingleSquare sq in invalidRects)
			{
				if(counter == 0)
					r = sq.rect;
				else
					r = Rectangle.Union(r, sq.rect);
				counter++;
			}
			//Invalidate this rectangle
			Invalidate(r);
			//Clear the invalid rects array
			invalidRects.Clear();
		}

		#endregion
		
		#region Fields

        internal Settings settings;
        internal SingleSquare[] squares;
        internal Figure currentFigure;
        internal bool newFigure;
        internal ArrayList invalidRects;
        internal Timer timer;
        internal byte nextFig;
        internal bool gameOver;
        internal bool gameStarted;
        internal int score;
        internal int lines;
        internal byte level;

		#endregion
	}
}

⌨️ 快捷键说明

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