📄 gatetris.cs
字号:
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 + -