diff --git a/App.xaml b/App.xaml index 5ac26ee..fd080c9 100644 --- a/App.xaml +++ b/App.xaml @@ -1,9 +1,8 @@  - + \ No newline at end of file diff --git a/App.xaml.cs b/App.xaml.cs index 3213dd3..e0d82d7 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -1,15 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Data; -using System.Linq; -using System.Threading.Tasks; -using System.Windows; +using System.Windows; -namespace Tetris { - /// - /// Interaction logic for App.xaml - /// - public partial class App : Application { - } -} +namespace Tetris; + +/// +/// Interaction logic for App.xaml +/// +public partial class App : Application +{ +} \ No newline at end of file diff --git a/AssemblyInfo.cs b/AssemblyInfo.cs index b9d746b..4a05c7d 100644 --- a/AssemblyInfo.cs +++ b/AssemblyInfo.cs @@ -7,4 +7,4 @@ using System.Windows; ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located //(used if a resource is not found in the page, // app, or any theme specific resource dictionaries) -)] +)] \ No newline at end of file diff --git a/Models/Game.cs b/Models/Game.cs index a72d73c..e236529 100644 --- a/Models/Game.cs +++ b/Models/Game.cs @@ -1,37 +1,43 @@ -using System; -using System.ComponentModel; +using System.ComponentModel; namespace Tetris.Models; -public class Party : INotifyPropertyChanged { - public event PropertyChangedEventHandler PropertyChanged; +public class Party : INotifyPropertyChanged +{ + private int _score; - private String _userName; + private string _userName; - public String UserName { + public Party(string userName) + { + _userName = userName; + } + + public string UserName + { get => _userName; - set { + set + { _userName = value; OnPropertyChanged("UserName"); } } - private int _score = 0; - - public int Score { + public int Score + { get => _score; - set { + set + { _score = value; OnPropertyChanged("Score"); } } - public Party(String userName) { - _userName = userName; - } + public event PropertyChangedEventHandler PropertyChanged; - protected virtual void OnPropertyChanged(string propertyName) { + protected virtual void OnPropertyChanged(string propertyName) + { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } -} +} \ No newline at end of file diff --git a/Models/Grid.cs b/Models/Grid.cs index b98cb0c..1e1504f 100644 --- a/Models/Grid.cs +++ b/Models/Grid.cs @@ -1,44 +1,49 @@ -using System; -using System.Drawing; -using Color = System.Drawing.Color; +using System.Drawing; -namespace Tetris.Models; +namespace Tetris.Models; -public class Grid { - private Color[,] _grid; +public class Grid +{ + private readonly Color[,] _grid; - public Point MinGrid => new Point(0,0); - public Point MaxGrid => new Point(_grid.GetLength(0)-1, _grid.GetLength(1)-1); - - public Grid(Color[,] grid) { + public Grid(Color[,] grid) + { _grid = grid; } - public bool CanGo(Tetrominoe tetrominoe, Point point) { - bool[,] shape = tetrominoe.Shape; + public Point MinGrid => new(0, 0); + public Point MaxGrid => new(_grid.GetLength(0) - 1, _grid.GetLength(1) - 1); + + public bool CanGo(Tetrominoe tetrominoe, Point point) + { + var shape = tetrominoe.Shape; if (point.X < MinGrid.X || point.Y < MinGrid.Y) return false; - - else if ((point.X + tetrominoe.Shape.GetLength(0)) > MaxGrid.X || (point.Y + tetrominoe.Shape.GetLength(1)) > MaxGrid.Y) + + if (point.X + tetrominoe.Shape.GetLength(0) > MaxGrid.X || point.Y + tetrominoe.Shape.GetLength(1) > MaxGrid.Y) return false; - + for (uint x = 0; x < shape.GetLength(0); x++) - for (uint y = 0; y < shape.GetLength(1); y++) { - Point s = point + new Size((int) x, (int) y); - if (shape[x, y] && _grid[s.X, s.Y] != Color.Empty) - return false; - } - + for (uint y = 0; y < shape.GetLength(1); y++) + { + var s = point + new Size((int)x, (int)y); + if (shape[x, y] && _grid[s.X, s.Y] != Color.Empty) + return false; + } + return true; } - public override string ToString() { - String s = ""; - for (uint y = 0; y < _grid.GetLength(1); y++) { + public override string ToString() + { + var s = ""; + for (uint y = 0; y < _grid.GetLength(1); y++) + { for (uint x = 0; x < _grid.GetLength(0); x++) - s += _grid[x,y].Name + "\t"; + s += _grid[x, y].Name + "\t"; s += "\n"; } + return s; } -} +} \ No newline at end of file diff --git a/Models/Tetrominoe.cs b/Models/Tetrominoe.cs index b793280..5d6227b 100644 --- a/Models/Tetrominoe.cs +++ b/Models/Tetrominoe.cs @@ -1,65 +1,22 @@ -using System; -using System.ComponentModel; +using System.ComponentModel; using System.Drawing; -namespace Tetris.Models; - -public class Tetrominoe { - public event PropertyChangedEventHandler PropertyChanged; - - private Grid _grid; - - private bool[,] _shape; - public bool[,] Shape { - get { - bool[,] shape = (bool[,]) _shape.Clone(); - for (int i = 0; i < _orientation; i++) - shape = _rotateLeft(shape); - return shape; - } - } - - private Point _coordinates; - public Point Coordinates { - get => _coordinates; - set { - if (! _grid.CanGo(this, value)) - return; - _coordinates = value; - OnPropertyChanged("Coordinates"); - } - } - - private short _orientation = 0; - public short Orientation { - get => _orientation; - set { - if (value > 3) - value = 0; - else if (value < 0) - value = 3; - - short oldOrientation = _orientation; - _orientation = value; - - Point newCoords = _coordinates; - //ToDo edit position ? - //ToDo move position when hot a wall - - if (!_grid.CanGo(this, newCoords)) { - _orientation = oldOrientation; - } else { - OnPropertyChanged("Orientation"); - } - } - } +namespace Tetris.Models; +public class Tetrominoe +{ private Color _color; - public Color Color { - get; - } - public Tetrominoe(Grid grid, bool[,] shape, Point coordinates, short orientation, Color color) { + private Point _coordinates; + + private readonly Grid _grid; + + private short _orientation; + + private readonly bool[,] _shape; + + public Tetrominoe(Grid grid, bool[,] shape, Point coordinates, short orientation, Color color) + { _grid = grid; _shape = shape; _coordinates = coordinates; @@ -70,44 +27,104 @@ public class Tetrominoe { // ToDO: ascpect technique test } - private bool[,] _rotateLeft(bool[,] shape) { - bool[,] rotatedArr = new bool[shape.GetLength(1), shape.GetLength(0)]; - - for (int i=shape.GetLength(0)-1;i>=0;--i) - for (int j=0;j _coordinates; + set + { + if (!_grid.CanGo(this, value)) + return; + _coordinates = value; + OnPropertyChanged("Coordinates"); + } + } + + public short Orientation + { + get => _orientation; + set + { + if (value > 3) + value = 0; + else if (value < 0) + value = 3; + + var oldOrientation = _orientation; + _orientation = value; + + var newCoords = _coordinates; + //ToDo edit position ? + //ToDo move position when hot a wall + + if (!_grid.CanGo(this, newCoords)) + _orientation = oldOrientation; + else + OnPropertyChanged("Orientation"); + } + } + + public Color Color { get; } + + public event PropertyChangedEventHandler PropertyChanged; + + private bool[,] _rotateLeft(bool[,] shape) + { + var rotatedArr = new bool[shape.GetLength(1), shape.GetLength(0)]; + + for (var i = shape.GetLength(0) - 1; i >= 0; --i) + for (var j = 0; j < shape.GetLength(1); ++j) + rotatedArr[j, shape.GetLength(0) - 1 - i] = shape[i, j]; return rotatedArr; } - - public void RotateLeft() { + + public void RotateLeft() + { Orientation -= 1; } - public void RotateRight() { + public void RotateRight() + { Orientation += 1; } - public void GoRight() { + public void GoRight() + { Coordinates += new Size(1, 0); } - public void GoLeft() { + public void GoLeft() + { Coordinates -= new Size(1, 0); } - public void GoDown() { + public void GoDown() + { Coordinates += new Size(0, 1); } - - protected virtual void OnPropertyChanged(string propertyName) { + + protected virtual void OnPropertyChanged(string propertyName) + { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } - public override string ToString() { - String s = ""; - for (uint y = 0; y < Shape.GetLength(1); y++) { + public override string ToString() + { + var s = ""; + for (uint y = 0; y < Shape.GetLength(1); y++) + { for (uint x = 0; x < Shape.GetLength(0); x++) if (Shape[x, y]) s += "x"; @@ -115,6 +132,7 @@ public class Tetrominoe { s += " "; s += "\n"; } + return s; } -} +} \ No newline at end of file diff --git a/Resources/icon.ico b/Resources/icon.ico new file mode 100644 index 0000000..1aaab21 Binary files /dev/null and b/Resources/icon.ico differ diff --git a/Resources/tetris.png b/Resources/tetris.png new file mode 100644 index 0000000..3fb9254 Binary files /dev/null and b/Resources/tetris.png differ diff --git a/Tetris.csproj b/Tetris.csproj index d9bfab2..c70bc94 100644 --- a/Tetris.csproj +++ b/Tetris.csproj @@ -5,6 +5,14 @@ enable true net6.0-windows + Resources\icon.ico + + + + Always + + + diff --git a/Views/GameWindow.xaml b/Views/GameWindow.xaml new file mode 100644 index 0000000..66e917f --- /dev/null +++ b/Views/GameWindow.xaml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/Views/GameWindow.xaml.cs b/Views/GameWindow.xaml.cs new file mode 100644 index 0000000..236afea --- /dev/null +++ b/Views/GameWindow.xaml.cs @@ -0,0 +1,17 @@ +using System.Runtime.InteropServices; +using System.Windows; + +namespace Tetris.Views; + +public partial class GameWindow : Window +{ + public GameWindow() + { + AttachConsole(-1); + InitializeComponent(); + // new GameManager((int)Width, (int)Height, ImageControl); + } + + [DllImport("kernel32.dll")] + private static extern bool AttachConsole(int dwProcessId); +} \ No newline at end of file diff --git a/Views/MainWindow.xaml b/Views/MainWindow.xaml index 805184a..8993ed9 100644 --- a/Views/MainWindow.xaml +++ b/Views/MainWindow.xaml @@ -3,12 +3,14 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:local="clr-namespace:Tetris" xmlns:viewsModels="clr-namespace:Tetris.ViewsModels" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewsModels:ViewModel, IsDesignTimeCreatable=True}" Title="MainWindow" Height="450" Width="800"> - + +