/// <summary> /// Удар по врагу. /// </summary> private static void ReceiveCallbackMyShot(IAsyncResult ar) { try { StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceive(ar); state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead)); if (state.sb.Length > 1) { response = state.sb.ToString(); } response = response.Remove(response.LastIndexOf(JsonStructInfo.EndOfMessage)); JObject jObject = null; Answer.AnswerTypes type = Answer.AnswerTypes.ShotOfTheEnemy; SeaBattleClassLibrary.DataProvider.ShotResult.ShotResultType result = SeaBattleClassLibrary.DataProvider.ShotResult.ShotResultType.Miss; Ship ship = null; try { jObject = JObject.Parse(response); } catch (JsonReaderException e) { Console.WriteLine(e); } type = Answer.JsonTypeToEnum((string)jObject[JsonStructInfo.Type]); result = SeaBattleClassLibrary.DataProvider.ShotResult.JsonTypeToEnum((string)jObject[JsonStructInfo.Result]); ship = result == SeaBattleClassLibrary.DataProvider.ShotResult.ShotResultType.Kill ? Serializer <Ship> .Deserialize((string)jObject[JsonStructInfo.AdditionalContent]) : null; Location location = Serializer <Location> .Deserialize((string)jObject[JsonStructInfo.Content]); Game.ShotResult shotResult = Game.ShotResult.Miss; if (result != SeaBattleClassLibrary.DataProvider.ShotResult.ShotResultType.Miss) { shotResult = result == SeaBattleClassLibrary.DataProvider.ShotResult.ShotResultType.Damage ? Game.ShotResult.Damage : Game.ShotResult.Kill; } EnemyGameField.Shot(location, shotResult, ship); pingDone.Reset(); } catch (Exception e) { Console.WriteLine(e.ToString()); } }
/// <summary> /// Возвращает сообщение об ожидании второго игрока. /// </summary> public static string AwaitSecondPlayer() { Answer.AnswerTypes type = Answer.AnswerTypes.No; string typeStr = Answer.EnumTypeToString(type); JObject jObject = new JObject(); jObject.Add(JsonStructInfo.Type, typeStr); jObject.Add(JsonStructInfo.Result, ""); return(jObject.ToString() + JsonStructInfo.EndOfMessage); }
/// <summary> /// Удар по мне. /// </summary> private static void ReceiveCallbackEnemyShot(IAsyncResult ar) { try { StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; int bytesRead = client.EndReceive(ar); state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead)); if (state.sb.Length > 1) { response = state.sb.ToString(); } response = response.Remove(response.LastIndexOf(JsonStructInfo.EndOfMessage)); JObject jObject = null; Answer.AnswerTypes type = Answer.AnswerTypes.ShotOfTheEnemy; try { jObject = JObject.Parse(response); } catch (JsonReaderException e) { Console.WriteLine(e); } type = Answer.JsonTypeToEnum((string)jObject[JsonStructInfo.Type]); Location location = Serializer <Location> .Deserialize((string)jObject[JsonStructInfo.Result]); MyGameField.Shot(location); pingDone.Reset(); } catch (Exception e) { Console.WriteLine(e.ToString()); } }
/// <summary> /// Выбор игры /// </summary> private async void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) { ElementEnabled(true); IPEndPoint remoteEP = Model.IPEndPoint; var a = e.AddedItems.ToList(); string s = ((e.AddedItems.ToList()[0] as StackPanel).Children[0] as TextBlock).Text; string gameName = s.Substring(6, s.IndexOf('\n') - 6); Socket socket = null; await Task.Run(() => { pingDone.Reset(); // Create a TCP/IP socket. Socket client = new Socket(remoteEP.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); StateObject state = new StateObject(); state.workSocket = client; state.obj = gameName; socket = client; // Connect to the remote endpoint. client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback1), state); pingDone.WaitOne(); }); Model.PlayerSocket = socket; Answer.AnswerTypes dataType = GetAnswerType(response); if (dataType == Answer.AnswerTypes.Ok) { MainPage.MainFrame?.Navigate(typeof(BeginPage), Model); } ElementEnabled(false); }
private void WaitOtherPlayer(Socket socket) { response = response.Remove(response.LastIndexOf(JsonStructInfo.EndOfMessage)); Answer.AnswerTypes dataType = GetAnswerType(response); StateObject so = new StateObject(); so.workSocket = socket; if (dataType == Answer.AnswerTypes.GameReady) { Answer.AnswerTypes result = Answer.JsonTypeToEnum(GetJsonRequestResult(response)); Player.CanShot = result == Answer.AnswerTypes.Yes ? true : false; MainPage.MainFrame?.Navigate(typeof(GamePage), Player); return; } else { pingDone.Reset(); Receive(so); pingDone.WaitOne(); WaitOtherPlayer(socket); return; } }