Пример #1
0
        private void ResponseWrapper()
        {
            string response = tcpClient.LastResponse;

            if (response == "requesting move")
            {
                tcpClient.SendRequest(snakeUser.SendNextDireciton());
            }
            else if (response == "game over")
            {
                state = "postgame";
                string winner = map.getWinner();
                if (winner == "none")
                {
                    postgameMessage = "Everyone lost";
                }
                else if (winner == "multiple")
                {
                    postgameMessage = "server fail";
                }
                else
                {
                    postgameMessage = String.Format("{0} won!", winner);
                }
                tcpClient.Disconnect();
            }
            else
            {
                MapUpdatePacket mapUpdatePacket = new MapUpdatePacket(tcpClient.LastResponse);
                map.UpdateFromMapUpdatePacket(mapUpdatePacket);
            }
        }
Пример #2
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));
     }
 }
Пример #3
0
        static async Task RunGameLoop(CancellationToken cancellationToken)
        {
            PrepareGame();
            Thread.Sleep(beforeStartMs);
            Console.WriteLine("Game starting...");
            Console.WriteLine();

            int aliveCount = map.snakes.Count;
            int winner     = -1;

            while (aliveCount > 1)
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();

                Thread.Sleep(tickMs);
                List <Task <string> > tasks = new List <Task <string> >();
                Console.WriteLine("requesting move from all users");
                Console.WriteLine(users.Count);
                foreach (User u in users)
                {
                    u.SendData(Encoding.ASCII.GetBytes("requesting move"));
                    tasks.Add(Task.Run(() => u.ReceiveResponse()));
                }

                var results = await Task.WhenAll(tasks);

                if (cancellationToken.IsCancellationRequested)
                {
                    SendAll("game over");
                    CloseAllUserSockets();
                }
                cancellationToken.ThrowIfCancellationRequested();

                foreach (var item in results)
                {
                    Snake  snake     = map.snakes[Convert.ToInt32(item.Split(' ')[0])];
                    string direction = item.Split(' ')[1];
                    snake.nextDir = direction;
                }

                map.AutoUpdate();
                MapUpdatePacket mapUpdatePacket = map.CreateMapUpdatePacket();
                Console.WriteLine("sending updated map to all users");
                SendAll(mapUpdatePacket.serialized);

                Console.WriteLine(mapUpdatePacket.serialized);

                aliveCount = 0;
                foreach (Snake s in map.snakes)
                {
                    if (!s.dead)
                    {
                        aliveCount++;
                    }
                }

                watch.Stop();
                Console.WriteLine(String.Format("tick duration: {0}", watch.Elapsed));
                Console.WriteLine();
            }

            string message = "Game over!\n";

            foreach (Snake s in map.snakes)
            {
                if (!s.dead)
                {
                    winner = s._id;
                }
            }

            if (winner == -1)
            {
                message += "No winner :(\n";
            }
            else
            {
                message += "Snake number " + winner.ToString() + " is the winner!";
            }
            SendAll("game over");

            CloseAllUserSockets();

            message += "\nWaiting for players...";

            state = "lobby";
            Console.WriteLine(message);
        }