示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <summary>
        /// Espera o usuário dar um tiro com um timeout e retorna o tiro dado ou um tiro
        /// aleatório caso o timeout expire
        /// </summary>
        private Tiro EsperarTiro()
        {
            OnDarTiro();
            waitHandle.WaitOne(TIMEOUT_TIRO);

            if (_tiro == null)
            {
                _tiro = new Tiro(rnd.Next(Tabuleiro.NumeroDeColunas), rnd.Next(Tabuleiro.NumeroDeLinhas));
            }

            return(_tiro);
        }
示例#3
0
        /// <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);
            }
        }
示例#4
0
        /// <summary>
        /// Envia um tiro para o cliente
        /// </summary>
        /// <param name="x">Posição X do tiro</param>
        /// <param name="y">Posição Y do tiro</param>
        public void DarTiro(int x, int y)
        {
            _tiro = new Tiro(x, y);

            waitHandle.Set();
        }