Exemplo n.º 1
0
 public MoveInfo(int id, float valueUsed, Direction dir, SnakeInfo info = null)
 {
     this.id        = id;
     this.valueUsed = valueUsed;
     this.dir       = dir;
     this.snakeInfo = info;
 }
Exemplo n.º 2
0
            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;
                    }
                }
            }
Exemplo n.º 3
0
 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));
     }
 }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
            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;
                            // Если найдены хвост и голова, значит найдено всё тело.
                        }
                    }