
using System;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using YYTetris.Piece;

using System.Windows.Threading;

using System.Collections.Generic;

using System.ComponentModel;

namespace YYTetris

{

public class UIControl : INotifyPropertyChanged

{

/// <summary>

/// 俄罗斯方块容器

/// </summary>

public Block[,] Container { get; set; }

/// <summary>

/// 下一个形状的容器(4×4)

/// </summary>

public Block[,] NextContainer { get; set; }

/// <summary>

/// 游戏状态(Ready, Play, Pause, Over)

/// </summary>

public GameStatus GameStatus { get; set; }

private int _rows = 20; // 行数(Y 方向)

private int _columns = 10; // 列数(X 方向)

private int _positionX = 3; // 形状所属的 4×4 容器的 X 坐标

private int _positionY = 0; // 形状所属的 4×4 容器的 Y 坐标

private List<PieceBase> _pieces; // 形状集合

private PieceBase _currentPiece; // 当前形状

private PieceBase _nextPiece; // 下一个形状

private int _initSpeed = 400; // 初始速率(毫秒)

private int _levelSpeed = 50; // 每增加一个级别所需增加的速率(毫秒)

private DispatcherTimer _timer;

/// <summary>

/// 构造函数

/// </summary>

public UIControl()

{

// 初始化形状集合,共七种形状

_pieces = new List<PieceBase>() { new I(), new L(), new L2(), new N(), new N2(), new O(), new T() };

// 初始化方块容器(用 Block 对象填满整个容器)

Container = new Block[_rows, _columns];

for ( int i = 0; i < _rows; i++)

{

for ( int j = 0; j < _columns; j++)

{

var block = new Block();

block.Top = i * block.rectangle.ActualHeight;

block.Left = j * block.rectangle.ActualWidth;

block.Color = null;

Container[i, j] = block;

}

}

// 初始化下一个形状的容器(用 Block 对象将其填满)

NextContainer = new Block[4, 4];

for ( int i = 0; i < 4; i++)

{

for ( int j = 0; j < 4; j++)

{

var block = new Block();

block.Top = i * block.rectangle.ActualHeight;

block.Left = j * block.rectangle.ActualWidth;

block.Color = null;

NextContainer[i, j] = block;

}

}

// 创建一个新的形状

CreatePiece();

// 呈现当前创建出的形状

AddPiece(0, 0);

// Timer 用于定时向下移动形状

_timer = new DispatcherTimer();

_timer.Interval = TimeSpan.FromMilliseconds(_initSpeed);

_timer.Tick += new EventHandler(_timer_Tick);

GameStatus = GameStatus.Ready;

}

/// <summary>

/// 开始游戏(启动计时器)

/// </summary>

public void Play()

{

GameStatus = GameStatus.Play;

_timer.Start();

}

/// <summary>

/// 暂停游戏(停止计时器)

/// </summary>

public void Pause()

{

GameStatus = GameStatus.Pause;

_timer.Stop();

}

/// <summary>

/// 创建一个新的形状

/// </summary>

private void CreatePiece()

{

// 逻辑移到 下坠后 的逻辑内

for ( int x = 0; x < _columns; x++)

{

if (Container[0, x].Color != null)

{

OnGameOver( null);

break;

}

}

// 计算 当前形状 和 下一个形状

Random random = new Random();

_currentPiece = _nextPiece == null ? _pieces[random.Next(0, 7)] : _nextPiece;

_nextPiece = _pieces[random.Next(0, 7)];

// 形状所属的 4×4 容器的 X 坐标和 Y 坐标

_positionX = 3;

_positionY = 0;

// 设置“下一个形状的容器”的 UI

SetNextContainerUI();

}

private void _timer_Tick( object sender, EventArgs e)

{

MoveToDown();

}

/// <summary>

/// 向左移动

/// </summary>

public void MoveToLeft()

{

if (GameStatus != GameStatus.Play) return;

if (!IsBoundary(_currentPiece.Matrix, -1, 0))

{

RemovePiece();

AddPiece(-1, 0);

}

}

/// <summary>

/// 向右移动

/// </summary>

public void MoveToRight()

{

if (GameStatus != GameStatus.Play) return;

if (!IsBoundary(_currentPiece.Matrix, 1, 0))

{

RemovePiece();

AddPiece(1, 0);

}

}

/// <summary>

/// 向下移动

/// </summary>

public void MoveToDown()

{

if (GameStatus != GameStatus.Play) return;

if (!IsBoundary(_currentPiece.Matrix, 0, 1))

{

RemovePiece();

AddPiece(0, 1);

}

else

{

// 如果触及底边了,则消除可消的行并且创建新的形状

RemoveRow();

CreatePiece();

// 每落下一个形状加 1 分

Score++;

}

}