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

📄 gatetris.cs

📁 game tetris :), this file is a little too big but it s run well, besides, it also has file descripti
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;


namespace GATetrisControl
{    
	[Designer(typeof(TetrisGridContainerDesigner))]
	public sealed class GATetris : UserControl
	{
		#region Constructor

		public GATetris()
		{
			InitializeComponent();

			SetStyle(ControlStyles.AllPaintingInWmPaint, true);
			SetStyle(ControlStyles.DoubleBuffer, true);
			SetStyle(ControlStyles.UserPaint, true);

			grid = new TetrisGrid();			
			grid.Parent = gridPanel;
			grid.Dock = DockStyle.Fill;

			grid.NewFigure += new EventHandler(UpdateScore);
			grid.UpdateNextFigure += new EventHandler(UpdateNextFigure);
			grid.GameStart += new EventHandler(NewGame);
			grid.GameEnd += new EventHandler(EndGame);
			grid.GamePaused += new EventHandler(PauseGame);

			int sc = grid.score;
			score.Text = sc.ToString();

			InitContextMenu();
		}

		#endregion

		#region Public Methods

		public void ShowOptions()
		{
			if(grid.gameStarted)
				return;
			Options o = new Options(this);
			if(o.ShowDialog() == DialogResult.OK)
			{
				grid.settings = o.settings;
				grid.settings.ApplySettings();
			}
		}

		public void ShowAbout()
		{
			About a = new About();
			a.ShowDialog();
		}

		public void ShowBestPlayers(Player select)
		{
			//create the form and populate the listview
			BestPlayers players = new BestPlayers();
			GetBestPlayers().PopulateListView(players.players, select);
			players.ShowDialog();
		}

        public void RefreshScore()
        {
            int sc = grid.score;
            int lin = grid.lines;
            byte lev = grid.level;
            score.Text = sc.ToString();
            lines.Text = lin.ToString();
            level.Text = "LEVEL " + lev.ToString();
        }

		#endregion

		#region Helper Methods

		Player AddToBestPlayers(BestPlayersCollection coll)
		{
			Player added = null;

			//create a player from the current score and lines
			Player current = new Player();
			current.score = grid.score;
			current.lines = grid.lines;

            //sort the collection
			coll.Sort();

			for(int i = coll.Count - 1; i >= 0; i--)
			{
				Player p = coll[i];
				//check if the current player has better results
				if(current.CompareTo(p) == 1)
				{
					EnterName en = new EnterName();
					en.ShowDialog();
					current.name = en.name.Text;

					//remove the first(lowest) player
					coll.RemoveAt(0);

					//add the current player
					coll.Add(current);

                    //sort the collection again
					coll.Sort();

					added = current;
					break;
				}
			}

			return added;
		}

		BestPlayersCollection GetBestPlayers()
		{
			//try to get an existing collection
			BestPlayersCollection coll = BestPlayersCollection.Restore("Top10.dat");
			if(coll == null)
			{
				//create default collection and add 10 players
				coll = new BestPlayersCollection();
			}

			return coll;
		}
		#endregion

		#region Init methods

		internal void UpdateSize()
		{
			grid.UpdateSize();
			gridPanel.Width = grid.Width+2;
			gridPanel.Height = grid.Height+2;
			controlPanel.Width = 190;
			preview.Height = grid.settings.squareWidth*6;
			preview.Width = grid.settings.squareWidth*6;
			paused.Location = new Point(8,preview.Bottom);			
			Width = gridPanel.Width + controlPanel.Width + 4;
			Height = gridPanel.Height;

			Refresh();
		}

		void InitContextMenu()
		{
			ContextMenu menu = new ContextMenu();

			MenuItem mi;
			EventHandler eh = new EventHandler(ContextMenuClicked);

			mi = new MenuItem("&New Game", eh, Shortcut.F2);
			menu.MenuItems.Add(mi);

			mi = new MenuItem("&End Game", eh, Shortcut.F3);
			menu.MenuItems.Add(mi);

			mi = new MenuItem("&Pause", eh);
			menu.MenuItems.Add(mi);

			mi = new MenuItem("-");
			menu.MenuItems.Add(mi);

			mi = new MenuItem("&Settings...", eh, Shortcut.CtrlO);
			menu.MenuItems.Add(mi);

			mi = new MenuItem("-");
			menu.MenuItems.Add(mi);

			mi = new MenuItem("&About...", eh);
			menu.MenuItems.Add(mi);

			mi = new MenuItem("&Hall Of Fame", eh);
			menu.MenuItems.Add(mi);

			ContextMenu = menu;
		}

		#endregion

		#region Overriden methods

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

		protected override void OnPaint(PaintEventArgs e)
		{
			e.Graphics.DrawRectangle(SystemPens.ControlDarkDark,0,0,Width-1,Height-1);
		}

		protected override void OnResize(EventArgs e)
		{
			Width = gridPanel.Width + controlPanel.Width + 4;
			Height = gridPanel.Height + 4;

			if(Parent != null)
				Parent.ClientSize = new Size(Width, Height);

			base.OnResize(e);
		}

		protected override void OnLoad(EventArgs e)
		{
			if(!DesignMode)
			{
				grid.settings = Settings.Restore();
				if(grid.settings == null)
					grid.settings = new Settings();

				grid.settings.container = this;
				UpdateSize();
			}

			base.OnLoad (e);
		}

		#endregion

		#region Drawing methods

		void DrawPreview(Figure figure, Graphics g)
		{
			figure.DrawPreview(g);
		}

		#endregion

		#region Event handlers

		void ContextMenuClicked(object sender, EventArgs e)
		{
			MenuItem mi = sender as MenuItem;
			switch(mi.Text)
			{
				case "&New Game":
					grid.InitNewGame();
					break;
				case "&End Game":
					grid.InitGameOver();
					break;
				case "&Settings...":
					ShowOptions();
					break;
				case "&About...":
					ShowAbout();
					break;
				case "&Hall Of Fame":
					ShowBestPlayers(null);
					break;
				case "&Pause":
					grid.OnPause();
					break;

⌨️ 快捷键说明

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