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); }
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; } }
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]); } }
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]); } }
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)); }
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); } }
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); }
public override void OnAchievedLength(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap, GameLogicBase gl) { }
public void OnCollision(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap) { snake.Cordinates.RemoveAt(0); snake.IsAlive = false; }
/// <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); }
/// <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); }
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);
public void OnCollision(PlayingMapAttributes.Snake snake, PlayingMap currentMap, PlayingMap previousMap) { }