Ejemplo n.º 1
0
        public void OnCollision(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap)
        {
            var tailPos = previousMap.Snake.Find(x => x == snake).Cordinates.Last();

            snake.Cordinates.Add(tailPos);
            snake.Cordinates.RemoveAt(0);
        }
Ejemplo n.º 2
0
 protected override void OnStepsWithoutFoodDid(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap, GameLogicBase gl)
 {
     snake.Cordinates.RemoveAt(snake.Cordinates.Count - 1);
     if (snake.Cordinates.Count < 3)
     {
         snake.IsAlive = false;
     }
 }
Ejemplo n.º 3
0
 private void ShowSnakesTail(PlayingMapAttributes.Snake snake)
 {
     if (snake.Cordinates[snake.Cordinates.Count - 1].X == snake.Cordinates[snake.Cordinates.Count - 2].X + 1)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[snake.Cordinates.Count - 1].X, snake.Cordinates[snake.Cordinates.Count - 1].Y),
             SnakeBody[(int)BodyPart.TailLeft]);
     }
     else if (snake.Cordinates[snake.Cordinates.Count - 1].X == snake.Cordinates[snake.Cordinates.Count - 2].X - 1)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[snake.Cordinates.Count - 1].X, snake.Cordinates[snake.Cordinates.Count - 1].Y),
             SnakeBody[(int)BodyPart.TailRight]);
     }
     else if (snake.Cordinates[snake.Cordinates.Count - 1].Y == snake.Cordinates[snake.Cordinates.Count - 2].Y + 1)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[snake.Cordinates.Count - 1].X, snake.Cordinates[snake.Cordinates.Count - 1].Y),
             SnakeBody[(int)BodyPart.TailUp]);
     }
     else if (snake.Cordinates[snake.Cordinates.Count - 1].Y == snake.Cordinates[snake.Cordinates.Count - 2].Y - 1)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[snake.Cordinates.Count - 1].X, snake.Cordinates[snake.Cordinates.Count - 1].Y),
             SnakeBody[(int)BodyPart.TailDown]);
     }
     else if (snake.Cordinates[snake.Cordinates.Count - 1].X > snake.Cordinates[snake.Cordinates.Count - 2].X)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[snake.Cordinates.Count - 1].X, snake.Cordinates[snake.Cordinates.Count - 1].Y),
             SnakeBody[(int)BodyPart.TailRight]);
     }
     else if (snake.Cordinates[snake.Cordinates.Count - 1].X < snake.Cordinates[snake.Cordinates.Count - 2].X)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[snake.Cordinates.Count - 1].X, snake.Cordinates[snake.Cordinates.Count - 1].Y),
             SnakeBody[(int)BodyPart.TailLeft]);
     }
     else if (snake.Cordinates[snake.Cordinates.Count - 1].Y < snake.Cordinates[snake.Cordinates.Count - 2].Y)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[snake.Cordinates.Count - 1].X, snake.Cordinates[snake.Cordinates.Count - 1].Y),
             SnakeBody[(int)BodyPart.TailUp]);
     }
     else if (snake.Cordinates[snake.Cordinates.Count - 1].Y > snake.Cordinates[snake.Cordinates.Count - 2].Y)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[snake.Cordinates.Count - 1].X, snake.Cordinates[snake.Cordinates.Count - 1].Y),
             SnakeBody[(int)BodyPart.TailDown]);
     }
 }
Ejemplo n.º 4
0
 private void ShowSnakesHead(PlayingMapAttributes.Snake snake)
 {
     if (snake.Cordinates[0].X == snake.Cordinates[1].X + 1)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[0].X, snake.Cordinates[0].Y),
             SnakeBody[(int)BodyPart.HeadLeft]);
     }
     else if (snake.Cordinates[0].X == snake.Cordinates[1].X - 1)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[0].X, snake.Cordinates[0].Y),
             SnakeBody[(int)BodyPart.HeadRight]);
     }
     else if (snake.Cordinates[0].Y == snake.Cordinates[1].Y + 1)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[0].X, snake.Cordinates[0].Y),
             SnakeBody[(int)BodyPart.HeadUp]);
     }
     else if (snake.Cordinates[0].Y == snake.Cordinates[1].Y - 1)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[0].X, snake.Cordinates[0].Y),
             SnakeBody[(int)BodyPart.HeadDown]);
     }
     else if (snake.Cordinates[0].X > snake.Cordinates[1].X)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[0].X, snake.Cordinates[0].Y),
             SnakeBody[(int)BodyPart.HeadRight]);
     }
     else if (snake.Cordinates[0].X < snake.Cordinates[1].X)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[0].X, snake.Cordinates[0].Y),
             SnakeBody[(int)BodyPart.HeadLeft]);
     }
     else if (snake.Cordinates[0].Y < snake.Cordinates[1].Y)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[0].X, snake.Cordinates[0].Y),
             SnakeBody[(int)BodyPart.HeadUp]);
     }
     else if (snake.Cordinates[0].Y > snake.Cordinates[1].Y)
     {
         SnakesTileMap.SetTile(
             ConvertMapCoorToTileCoor(snake.Cordinates[0].X, snake.Cordinates[0].Y),
             SnakeBody[(int)BodyPart.HeadDown]);
     }
 }
Ejemplo n.º 5
0
        public override void OnAchievedLength(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap, GameLogicBase gl)
        {
            snake.SnakeB.Statistics.Length = snake.Cordinates.Count();
            List <Cordinates> cordinates = new List <Cordinates>();
            var count = snake.Cordinates.Count;

            for (int i = count - 1; i >= Length / 2; i--)
            {
                cordinates.Add(new Cordinates(snake.Cordinates[i]));
                snake.Cordinates.RemoveAt(i);
            }
            string name     = Names[new Random().Next(0, Names.Count)];
            var    newSnake = gl.AddSnake(name, cordinates);

            newSnake.Statistics.Length = newSnake.SnakeBody.Count;
            Snakes.Add(new PlayingMapAttributes.Snake(newSnake));
        }
Ejemplo n.º 6
0
 public static bool CollisionWithSnakes(PlayingMapAttributes.Snake s, PlayingMap map)
 {
     foreach (var snake in map.Snake)
     {
         for (int i = 0; i < snake.Cordinates.Count; i++)
         {
             if (!(snake == s && i == 0))
             {
                 if (snake.Cordinates[i] == s.SnakeB.Head)
                 {
                     return(true);
                 }
             }
         }
     }
     return(false);
 }
        public void OnStepDid(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap, GameLogicBase gl)
        {
            if (!DidStepsWithoutFoodById.ContainsKey(snake.SnakeB.ID))
            {
                DidStepsWithoutFoodById.Add(snake.SnakeB.ID, 0);
            }

            if (snake.FoundFoodAfterStep)
            {
                DidStepsWithoutFoodById[snake.SnakeB.ID] = 0;
            }
            else
            {
                DidStepsWithoutFoodById[snake.SnakeB.ID]++;
            }

            if (DidStepsWithoutFoodById[snake.SnakeB.ID] == StepsWithoutFood)
            {
                DidStepsWithoutFoodById[snake.SnakeB.ID] = 0;
                OnStepsWithoutFoodDid(snake, currentMap, previousMap, gl);
            }
        }
Ejemplo n.º 8
0
 public static bool CollisionWithBarrier(PlayingMapAttributes.Snake s, PlayingMap map)
 {
     foreach (var barrier in map.Barriers)
     {
         if (barrier == s.SnakeB.Head)
         {
             return(true);
         }
     }
     foreach (var snake in map.Snake)
     {
         if (!snake.IsAlive)
         {
             foreach (var coord in snake.Cordinates)
             {
                 if (coord == s.SnakeB.Head)
                 {
                     return(true);
                 }
             }
         }
     }
     return(false);
 }
Ejemplo n.º 9
0
 public override void OnAchievedLength(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap, GameLogicBase gl)
 {
 }
Ejemplo n.º 10
0
 public void OnCollision(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap)
 {
     snake.Cordinates.RemoveAt(0);
     snake.IsAlive = false;
 }
Ejemplo n.º 11
0
        /// <summary>
        /// Метот считывает все следующие шаги змеек.
        /// Производит логические операции
        /// Method reads all next steps of snakes and make logic operations
        /// </summary>
        /// <returns>Возвращает карту с новым положением объектов</returns>
        /// Returns map with new location of objects
        public override PlayingMap GetNextPlayingMap()
        {
            PlayingMap tempMap = new PlayingMap(Map);

            Map.Snake.Clear();
            // Считываем следующие направления
            //Reads next directions
            foreach (var snake in SnakesForLogic.Snakes)
            {
                // Если змейка мертва у нее ничего не просим
                //In case of snake's dead dont ask for anything
                if (!snake.IsAlive)
                {
                    if (LeftDeadSnakeBody)
                    {
                        Map.Snake.Add(new PlayingMapAttributes.Snake(snake.SnakeName, snake.SnakeBody, snake, snake.Statistics));
                    }
                    continue;
                }

                SnakeAttribute.SnakePathway snakePathway = snake.GetNextPathway(tempMap);
                snake.Statistics.Steps++;
                SnakeAttribute.Cordinates snakeHead = snake.Head;
                // Если змейка после шага погибает, мы ее не передвигаем
                //In case a snake dies after making a step, we don't move it
                switch (snakePathway)
                {
                case SnakeAttribute.SnakePathway.Up:
                    snakeHead.Y = (snakeHead.Y - 1 != -1) ? --snakeHead.Y : Map.sideSize - 1;
                    ReactionToMapsObjectsOnNewPosition(snakeHead, snake, tempMap);
                    break;

                case SnakeAttribute.SnakePathway.Right:
                    snakeHead.X = (snakeHead.X + 1 != Map.sideSize) ? ++snakeHead.X : 0;
                    ReactionToMapsObjectsOnNewPosition(snakeHead, snake, tempMap);
                    break;

                case SnakeAttribute.SnakePathway.Down:
                    snakeHead.Y = (snakeHead.Y + 1 != Map.sideSize) ? ++snakeHead.Y : 0;
                    ReactionToMapsObjectsOnNewPosition(snakeHead, snake, tempMap);
                    break;

                case SnakeAttribute.SnakePathway.Left:
                    snakeHead.X = (snakeHead.X - 1 != -1) ? --snakeHead.X : Map.sideSize - 1;
                    ReactionToMapsObjectsOnNewPosition(snakeHead, snake, tempMap);
                    break;

                default:
                    throw new ArgumentException(nameof(snakePathway), "Unknown pathway");
                }

                // Проверяем жива ли змейка после хода
                //Checking whether snake is alinve
                if (!snake.IsAlive)
                {
                    if (LeftDeadSnakeBody)
                    {
                        Map.Snake.Add(new PlayingMapAttributes.Snake(snake.SnakeName, snake.SnakeBody, snake, snake.Statistics));
                    }
                }
                else
                {
                    Map.Snake.Add(new PlayingMapAttributes.Snake(snake.SnakeName, snake.SnakeBody, snake, snake.Statistics));
                }
            }

            // Окончательная проверка того живы ли змейки
            //Last check of snake's alive state
            foreach (var snake in SnakesForLogic.Snakes)
            {
                PlayingMap tempMapForColisionChecking = new PlayingMap(Map);
                var        snakeForMap = new PlayingMapAttributes.Snake
                                             (snake.SnakeName, new List <SnakeAttribute.Cordinates>(snake.SnakeBody), snake, snake.Statistics);

                // Удаляем голову змейки из карты, чтобы у нее не было коллизии с собой
                //Delete snake's head from the map, so that it doesn't collide with itself
                tempMapForColisionChecking.Snake.RemoveAll(s => snakeForMap == s);
                var head = snakeForMap.Cordinates[0];
                snakeForMap.Cordinates.RemoveAt(0);
                tempMapForColisionChecking.Snake.Add(snakeForMap);

                // Если обнаруживается коллизия укорачиваем змейку с головы
                //If snake collides shortening it starting from head
                if (HasCollisionAfterStep(head, tempMapForColisionChecking, snakeForMap))
                {
                    snakeForMap = new PlayingMapAttributes.Snake(snake.SnakeName, snake.SnakeBody, snake, snake.Statistics);
                    Map.Snake.RemoveAll(s => snakeForMap == s);
                    snakeForMap.Cordinates.RemoveAt(0);
                    Map.Snake.Add(snakeForMap);
                }
            }

            Map.Food = tempMap.Food;
            InsertFood(Map);
            UpdateLengthStatistics();

            return(Map);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Метод используется для окончательной проверки коллизий
        /// после сделанного змейкой шага
        /// Method is used to final determination of collision after snake takes a step
        /// </summary>
        /// <param name="head">Голова змейки/Snake's head</param>
        /// <param name="map">Игровая карта/Game map</param>
        /// <param name="snake">Змейка/Snake</param>
        /// <returns>True если есть коллизия со змейкой или барьером/Returns true is there is collision with snake or obstacle</returns>
        private bool HasCollisionAfterStep(SnakeAttribute.Cordinates head, PlayingMap map, PlayingMapAttributes.Snake snake)
        {
            if (CollisionWithFood(head, map))
            {
                Debug.Log("Error: Unexpected food element");
                Map.Food.FoodCordinates.RemoveAll(c => c == head);
            }

            if (!snake.IsAlive)
            {
                return(false);
            }

            if (CollisionWithSnakes(head, map) || CollisionWithBarriers(head, map))
            {
                return(true);
            }

            return(false);
        }
Ejemplo n.º 13
0
        private void ShowSnakesBody(PlayingMapAttributes.Snake snake)
        {
            for (int i = 1; i < snake.Cordinates.Count - 1; i++)
            {
                var next = snake.Cordinates[i - 1];
                var curr = snake.Cordinates[i];
                var bef  = snake.Cordinates[i + 1];

                var t1 = next - curr;
                var t2 = bef - curr;

                const int min = -1, max = 1;
                /// Выравниваем значения
                while (t1.X < min)
                {
                    t1.X += Map.sideSize;
                }
                while (t1.X > max)
                {
                    t1.X -= Map.sideSize;
                }
                while (t1.Y < min)
                {
                    t1.Y += Map.sideSize;
                }
                while (t1.Y > max)
                {
                    t1.Y -= Map.sideSize;
                }
                while (t2.X < min)
                {
                    t2.X += Map.sideSize;
                }
                while (t2.X > max)
                {
                    t2.X -= Map.sideSize;
                }
                while (t2.Y < min)
                {
                    t2.Y += Map.sideSize;
                }
                while (t2.Y > max)
                {
                    t2.Y -= Map.sideSize;
                }

                if (t1 - t2 == new SnakeAttribute.Cordinates(0, -2) || t1 - t2 == new SnakeAttribute.Cordinates(0, 2))
                {
                    SnakesTileMap.SetTile(ConvertMapCoorToTileCoor(curr.X, curr.Y), SnakeBody[(int)BodyPart.Vertical]);
                    continue;
                }
                if (t1 - t2 == new SnakeAttribute.Cordinates(-2, 0) || t1 - t2 == new SnakeAttribute.Cordinates(2, 0))
                {
                    SnakesTileMap.SetTile(ConvertMapCoorToTileCoor(curr.X, curr.Y), SnakeBody[(int)BodyPart.Horizontal]);
                    continue;
                }

                if (t1 + t2 == new SnakeAttribute.Cordinates(1, 1))
                {
                    SnakesTileMap.SetTile(ConvertMapCoorToTileCoor(curr.X, curr.Y), SnakeBody[(int)BodyPart.DownRight]);
                }
                else if (t1 + t2 == new SnakeAttribute.Cordinates(-1, 1))
                {
                    SnakesTileMap.SetTile(ConvertMapCoorToTileCoor(curr.X, curr.Y), SnakeBody[(int)BodyPart.DownLeft]);
                }
                else if (t1 + t2 == new SnakeAttribute.Cordinates(1, -1))
                {
                    SnakesTileMap.SetTile(ConvertMapCoorToTileCoor(curr.X, curr.Y), SnakeBody[(int)BodyPart.UpRight]);
                }
                else if (t1 + t2 == new SnakeAttribute.Cordinates(-1, -1))
                {
                    SnakesTileMap.SetTile(ConvertMapCoorToTileCoor(curr.X, curr.Y), SnakeBody[(int)BodyPart.UpLeft]);
                }
                else
                {
                    SnakesTileMap.SetTile(ConvertMapCoorToTileCoor(curr.X, curr.Y), SnakeBody[(int)BodyPart.HeadDown]);
                }
            }
        }
 protected abstract void OnStepsWithoutFoodDid(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap, GameLogicBase gl);
Ejemplo n.º 15
0
 public void OnCollision(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap)
 {
     
 }