using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; namespace Tetris.Models; public class Game : INotifyPropertyChanged { private Random _random = new Random(); private string _userName; public string UserName { get => _userName; set { _userName = value; OnPropertyChanged("UserName"); } } private int _score; public int Score { get => _score; set { _score = value; OnPropertyChanged("Score"); } } private Grid _grid; public Grid Grid => _grid; private Tetrominoe? _currentTetrominoe; public Tetrominoe? CurrentTetrominoe => _currentTetrominoe; private Tetrominoe? _nextTetrominoe; public Tetrominoe? NextTetrominoe => _nextTetrominoe; public Game(string userName, Grid grid) { _userName = userName; _grid = grid; _currentTetrominoe = GetNewTetrominoe(); _nextTetrominoe = GetNewTetrominoe(); } public bool HitBottom() { if (_currentTetrominoe == null) return false; return !_grid.CanGo(_currentTetrominoe, _currentTetrominoe.Coordinates + new Size(0, 1)); } public bool HitTop() { if (_currentTetrominoe == null) return false; else if (_grid.CanGo(_currentTetrominoe, _currentTetrominoe.Coordinates + new Size(0, 1))) return false; return _grid.MinGrid.Y == _currentTetrominoe.Coordinates.Y; } public bool LineFull() { return _grid.LineFull(); } public void ClearLine() { _grid.ClearLine(); } public void PrintTetrominoe() { if (_currentTetrominoe == null) return; _grid.PrintTetrominoe(_currentTetrominoe); _currentTetrominoe = _nextTetrominoe; _nextTetrominoe = GetNewTetrominoe(); } public Tetrominoe GetNewTetrominoe() { List tetrominoes = TetrominoeParser.List(); return new Tetrominoe(_grid, tetrominoes[_random.Next(tetrominoes.Count)]); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }