public MoveInfo(int id, float valueUsed, Direction dir, SnakeInfo info = null) { this.id = id; this.valueUsed = valueUsed; this.dir = dir; this.snakeInfo = info; }
static public void CalculateSnakes( IReadOnlyDictionary <BoardElement, ImmutableHashSet <PointInfo> > boardElementToInfosIndex, IReadOnlyDictionary <Point, PointInfo> locationToPointInfoIndex, IReadOnlyList <ISnakeInfo> previousTickSnakeInfos, IReadOnlyDictionary <Point, PointInfo> previousTickLocationToPointInfoIndex, Dictionary <Point, ISnakeInfo> locationToSnakeInfoIndex, out IReadOnlyDictionary <Point, ISnakeInfo> snakeHeadToSnakeInfoIndex) { var snakeInfos = new List <SnakeInfo>(); SnakeInfo playerSnake = CalculatePlayerSnake( locationToPointInfoIndex, boardElementToInfosIndex, previousTickSnakeInfos, previousTickLocationToPointInfoIndex ); snakeInfos.Add(playerSnake); CalculateEnemySnakes( boardElementToInfosIndex, locationToPointInfoIndex, previousTickSnakeInfos, previousTickLocationToPointInfoIndex, snakeInfos ); snakeHeadToSnakeInfoIndex = snakeInfos.ToDictionary(x => x.Head, x => (ISnakeInfo)x); foreach (SnakeInfo snakeInfo in snakeInfos) { foreach (Point bodyPoint in snakeInfo.BodyPoints) { locationToSnakeInfoIndex[bodyPoint] = snakeInfo; } } }
public void UpdateFromMapUpdatePacket(MapUpdatePacket mapUpdatePacket) { for (int i = 0; i < mapUpdatePacket.snakes.Count; i++) { SnakeInfo sInfo = mapUpdatePacket.snakes[i]; if (sInfo.dead) { snakes[i].dead = true; continue; } else if (sInfo.buffs.Contains("frozen")) { ; //do nothing } else { snakes[i].lastGrow = sInfo.lenDiff; snakes[i].MoveTo(sInfo.newPosition); } if (sInfo.buffs.Contains("invincible")) { snakes[i].invincible = 1; } else { snakes[i].invincible = 0; } if (sInfo.buffs.Contains("reversed")) { snakes[i].Reverse(); } } foreach (PowerupInfo pInfo in mapUpdatePacket.powerupsMinus) { foreach (Powerup p in powerups) { if (p.position == pInfo.position) { powerups.Remove(p); break; } } } foreach (PowerupInfo pInfo in mapUpdatePacket.powerupsPlus) { powerups.Add(new Powerup(pInfo.position, pInfo.type)); } }
public MapUpdatePacket CreateMapUpdatePacket() { List <SnakeInfo> snakeInfos = new List <SnakeInfo>(); foreach (Snake s in snakes) { List <string> buffs = new List <string>(); if (s.invincible > 0) { buffs.Add("invincible"); } if (s.frozen) { buffs.Add("frozen"); } if (s.reversed) { buffs.Add("reversed"); } SnakeInfo snakeInfo = new SnakeInfo(s.position, s.lastGrow, buffs, s.dead); snakeInfos.Add(snakeInfo); } List <PowerupInfo> powerupsPlus = new List <PowerupInfo>(); foreach (Powerup p in addedPowerups) { powerupsPlus.Add(new PowerupInfo(p.position, p.type)); } addedPowerups = new List <Powerup>(); List <PowerupInfo> powerupsMinus = new List <PowerupInfo>(); foreach (Powerup p in removedPowerups) { powerupsMinus.Add(new PowerupInfo(p.position, p.type)); } removedPowerups = new List <Powerup>(); return(new MapUpdatePacket(snakeInfos, powerupsPlus, powerupsMinus)); }
private void Awake() { info = new SnakeInfo { maxLength = 5, bodyWidth = 0.6f, maxValue = 1, halfViewAngle = 0.75f * 3.1416f, eyeQuality = 15, denseLayerSize = 0, cullingDistance = 5, scuamaPatern = new SnakeInfo.ScuamaPatern { giroid0 = (0.3f, 1.5f), giroid1 = (0.5f, 1.0f), giroid2 = (1.2f, 0.9f), backgroundColor = new Vector4(0.1f, 0.4f, 0.1f, 0), color1 = new Vector4(0.8f, 0.8f, 0.1f, 0), color2 = new Vector4(0.8f, 0.1f, 0.1f, 0), } }; moveInfo.snakeInfo = info; }
static private SnakeInfo CalculatePlayerSnake( IReadOnlyDictionary <Point, PointInfo> locationToPointInfoIndex, IReadOnlyDictionary <BoardElement, ImmutableHashSet <PointInfo> > boardElementToInfosIndex, IReadOnlyList <ISnakeInfo> previousTickSnakeInfos, IReadOnlyDictionary <Point, PointInfo> previousTickLocationToPointInfoIndex) { SnakeInfo playerSnake = default; ImmutableHashSet <PointInfo> playerHeads = GetPlayerHeads(boardElementToInfosIndex); PointInfo head = playerHeads?.Single(); if (head != default) { playerSnake = new SnakeInfo { FoundHead = true, FuryTicksLeft = head.BoardElement == BoardElement.HeadEvil ? -1 : 0, IsActive = head.BoardElement != BoardElement.HeadSleep && head.BoardElement != BoardElement.HeadDead, IsPlayerSnake = true }; playerSnake.AddHead(head.Location); } else { ImmutableHashSet <PointInfo> playerTails = GetPlayerTails(boardElementToInfosIndex); PointInfo tail = playerTails?.SingleOrDefault(); if (tail != default) { playerSnake = new SnakeInfo { FoundTail = true, FuryTicksLeft = -2, IsActive = tail.BoardElement != BoardElement.TailInactive, IsPlayerSnake = true }; playerSnake.AddTail(tail.Location); } } if (playerSnake == default) { playerSnake = new SnakeInfo { FoundHead = false, FoundTail = false, IsPlayerSnake = true, FuryTicksLeft = -2, // Неактивного тела не бывает. IsActive = true }; playerSnake.AddTail(GetPlayerBodyPart(boardElementToInfosIndex).First().Location); } bool foundNext = true; while (foundNext) { foundNext = false; if (playerSnake.FoundHead) { PointInfo currentTail = locationToPointInfoIndex[playerSnake.Tail]; if (TryGetNextPlayerPoint(playerSnake, currentTail, out PointInfo newTail, searchForBody: true)) { playerSnake.AddTail(newTail.Location); foundNext = true; } else if (TryGetNextPlayerPoint(playerSnake, currentTail, out newTail, searchForTail: true)) { playerSnake.AddTail(newTail.Location); playerSnake.FoundTail = true; // Если найдены хвост и голова, значит найдено всё тело. } }