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++;
}
}