/// <summary> /// Executa o jogo se comunicando com o par remoto /// </summary> private void Jogar() { StreamWriter writer = new StreamWriter(cliente.GetStream()); writer.AutoFlush = true; TirosDados = new ListaDeTiros(); TirosRecebidos = new ListaDeTiros(); StreamReader reader = new StreamReader(cliente.GetStream()); try { while (Conectado) { // Envia um tiro Tiro tiroDado = EsperarTiro(); writer.writeLine("Tiro " + tiroDado.X + "," + tiroDado.Y); // Recebe um tiro do cliente remoto string r; string line; line = reader.ReadLine(); int x = Convert.ToInt32(line.Substring(5, line.IndexOf(',') - 5)); int y = Convert.ToInt32(line.Substring(line.IndexOf(',') + 1)); Tiro recebido = new Tiro(x, y); // Avisa que recebeu o tiro para o cliente local TirosRecebidos.Add(recebido, recebido.Aplicar(Tabuleiro)); OnTiroRecebido(recebido); // Envia o resultado do tiro recebido writer.WriteLine(((uint)recebido.Aplicar(Tabuleiro)).ToString()); // Recebe o resultado do seu tiro line = reader.ReadLine(); // Avisa o cliente do resultado do tiro ResultadoDeTiro resultado = ResultadoDeTiro.Errou; resultado = (ResultadoDeTiro)Convert.ToUInt32(line); TirosDados.Add(tiroDado, resultado); OnResultadoDeTiro(tiroDado, resultado); waitHandle.Reset(); } } catch (Exception e) { Debugger.Log(0, "error", e.Message + Environment.NewLine); OnClienteDesconectado((cliente.Client.RemoteEndPoint as IPEndPoint).Address); } }
/// <summary> /// Executa o jogo se comunicando com o par remoto /// </summary> private void Jogar() { StreamWriter writer = new StreamWriter(cliente.GetStream()); writer.AutoFlush = true; StreamReader reader = new StreamReader(cliente.GetStream()); try { while (Conectado) { Debugger.Log(0, "msg", "Sua vez" + Environment.NewLine); OnDarTiro(); waitHandle.WaitOne(TIMEOUT_TIRO); if (_tiro == null) { _tiro = new Tiro(rnd.Next(Tabuleiro.NumeroDeColunas), rnd.Next(Tabuleiro.NumeroDeLinhas)); } writer.WriteLine("Tiro " + _tiro.X + "," + _tiro.Y); Debugger.Log(0, "msg", "Tiro " + _tiro.X + "," + _tiro.Y + Environment.NewLine); string r = reader.ReadLine(); Tiro recebido = null; if (r.StartsWith("Tiro ")) { int x = Convert.ToInt32(r.Substring(5, r.IndexOf(',') - 5)); int y = Convert.ToInt32(r.Substring(r.IndexOf(',') + 1)); Debugger.Log(0, "msg", "I '" + r + "'" + Environment.NewLine); recebido = new Tiro(x, y); ResultadoDeTiro resultado = recebido.Aplicar(Tabuleiro); TirosRecebidos.Add(recebido, resultado); Task.Run(() => OnTiroRecebido(recebido)); lock (writer) writer.WriteLine(((uint)resultado).ToString()); } while (!char.IsNumber(r[0])) { r = reader.ReadLine(); } ResultadoDeTiro result = (ResultadoDeTiro)Convert.ToUInt32(r); TirosDados.Add(_tiro, result); Task.Run(() => OnResultadoDeTiro(_tiro, result)); _tiro = null; if (recebido == null) { string line; line = reader.ReadLine(); Debugger.Log(0, "msg", "I '" + line + "'" + Environment.NewLine); if (line.StartsWith("Tiro ")) { int x = Convert.ToInt32(line.Substring(5, line.IndexOf(',') - 5)); int y = Convert.ToInt32(line.Substring(line.IndexOf(',') + 1)); recebido = new Tiro(x, y); ResultadoDeTiro resultado = recebido.Aplicar(Tabuleiro); TirosRecebidos.Add(recebido, resultado); Task.Run(() => OnTiroRecebido(recebido)); lock (writer) writer.WriteLine(((uint)resultado).ToString()); } } waitHandle.Reset(); } } catch (Exception e) { Debugger.Log(0, "error", e.Message + Environment.NewLine); OnClienteDesconectado((cliente.Client.RemoteEndPoint as IPEndPoint).Address); } }