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); } }
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)); } }
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); }