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