diff --git a/bead1.sln b/bead1.sln index 5f2f1af..c6ed21b 100644 --- a/bead1.sln +++ b/bead1.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "persistance", "persistance\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "model", "model\model.csproj", "{41FA02D6-4257-46E6-BAF0-1D975169C05E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tests", "tests\tests.csproj", "{05D087EA-57EA-4A01-82B5-C36C7242EF80}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -24,5 +26,9 @@ Global {41FA02D6-4257-46E6-BAF0-1D975169C05E}.Debug|Any CPU.Build.0 = Debug|Any CPU {41FA02D6-4257-46E6-BAF0-1D975169C05E}.Release|Any CPU.ActiveCfg = Release|Any CPU {41FA02D6-4257-46E6-BAF0-1D975169C05E}.Release|Any CPU.Build.0 = Release|Any CPU + {05D087EA-57EA-4A01-82B5-C36C7242EF80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05D087EA-57EA-4A01-82B5-C36C7242EF80}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05D087EA-57EA-4A01-82B5-C36C7242EF80}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05D087EA-57EA-4A01-82B5-C36C7242EF80}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/model/SnakeLevel.cs b/model/SnakeLevel.cs index fd4938b..79e190c 100644 --- a/model/SnakeLevel.cs +++ b/model/SnakeLevel.cs @@ -10,7 +10,8 @@ public class SnakeLevel{ Obstacle, Egg, Snake, - SnakeHead + SnakeHead, + OutOfBounds } public enum SnakeDirection{ @@ -20,16 +21,23 @@ public class SnakeLevel{ Right } + public enum GameState{ + Running, + Dead + } + private readonly List _obstacles; public ReadOnlyCollection Obstacles => _obstacles.AsReadOnly(); public Point SnakeHead {get; private set;} private readonly List _snake; // Head is not in snake + // Last is closest to the head public ReadOnlyCollection Snake => _snake.AsReadOnly(); public int SnakeLength => Snake.Count + 1; private readonly List _eggs; public ReadOnlyCollection Eggs => _eggs.AsReadOnly(); public SnakeDirection SnakeHeadDirection {get; private set;} + public GameState State {get; private set;} public SnakeLevel(int size, IEnumerable obstacles, int snake_start_length){ this.Size = size; @@ -55,9 +63,48 @@ public class SnakeLevel{ return LevelBlock.Snake; }else if(_eggs.Contains(p)){ return LevelBlock.Egg; + }else if(p.X < 0 || p.Y < 0 || p.X>=Size || p.Y >= Size){ + return LevelBlock.OutOfBounds; } return LevelBlock.Empty; } } + + public void Tick(){ + Point new_snake_head = (0,0); + switch(SnakeHeadDirection){ + case SnakeDirection.Up: + new_snake_head = (SnakeHead.X, SnakeHead.Y - 1); + break; + case SnakeDirection.Down: + new_snake_head = (SnakeHead.X, SnakeHead.Y + 1); + break; + case SnakeDirection.Left: + new_snake_head = (SnakeHead.X - 1, SnakeHead.Y); + break; + case SnakeDirection.Right: + new_snake_head = (SnakeHead.X + 1, SnakeHead.Y); + break; + } + + if(this[new_snake_head] is LevelBlock.Obstacle or LevelBlock.Snake or LevelBlock.OutOfBounds){ + State = GameState.Dead; + return; + } + + var first = Snake[0]; + + for(int i=_snake.Count-1; i>0; i--){ + _snake[i-1] = _snake[i]; + } + _snake[^1] = SnakeHead; + + if(this[new_snake_head] is LevelBlock.Egg){ + _snake.Insert(0, first); + _eggs.Remove(new_snake_head); + } + + SnakeHead = new_snake_head; + } } \ No newline at end of file