/// <summary> /// Verifica o ganhador do jogo, caso este esteja encerrado. /// </summary> /// <param name="resp1">resposta do servidor contendo o estado do jogo.</param> private void verificarStatus(RespostaDoServidor resp1) { if (resp1.jogoEncerrado) { if (resp1.vencedor == jogador) { lblStatus.Text = "Você Venceu!"; } else if (resp1.vencedor == -1) { lblStatus.Text = "Empate!"; } else { if (jogadorAtual == tiposDeJogadores.Observador) { lblStatus.Text = "Fim de Jogo!"; } else { lblStatus.Text = "Você perdeu."; } } timer1.Enabled = false; btnBot.Enabled = false; lerTabuleiro(); } }
/// <summary> /// Envia a mensagem XML passada como parâmetro para o servidor atual e retorna a resposta do servidor. /// Este método cria uma nova thread para o envio da mensagem e aguarda a resposta em uma variável compartilhada. /// A mensagem é enviada utilizando-se o protocolo UDP. /// </summary> /// <param name="mensagem">mensagem XML de requisição que será enviado ao servidor.</param> private void lerTabuleiro() { String mensagem = formPai.enviandoMensagem("<REQUEST><RT>game board</RT><GID>" + jogo + "</GID></REQUEST>"); Regex exp = new Regex(@"<GAME CURRENT BOARD>(.+)</GAME CURRENT BOARD>", RegexOptions.IgnoreCase); Regex exp2 = new Regex(@"<(.)>", RegexOptions.IgnoreCase); RespostaDoServidor resp1 = new RespostaDoServidor(mensagem); //int[] tabuleiro = new int[9]; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int id = i * 3 + j; int valor = 0; if (resp1.tabuleiro[i, j] == "-") { valor = -1; tabLabel[id].Text = "O"; } else if (resp1.tabuleiro[i, j] == "+") { valor = +1; tabLabel[id].Text = "X"; } tabuleiro[id] = valor; } } String resposta = formPai.enviandoMensagem(MensagensDeRequisicao.estadoDoJogo(jogo, jogador)); RespostaDoServidor resp = new RespostaDoServidor(resposta); if (!resp.jogoEncerrado) { if (resp.turnoDoJogadorAtual) { lblStatus.Text = "seu turno"; if (botAtivado && !botJogou) { jogarAutomaticamente(); } timer1.Enabled = true; } else if (resp.turnoDoAdversario) { if (jogadorAtual != tiposDeJogadores.Observador) { lblStatus.Text = "turno do adversário"; } timer1.Enabled = true; } botJogou = false; } }
/// <summary> /// Requisita a lista de jogos da velha abertos no servidor e atualiza /// o DataGridView dgvJogos com essa lista. /// </summary> private void btnConsultar_Click(object sender, EventArgs e) { btnConsultarJogos.Enabled = false; String resposta = enviandoMensagem(MensagensDeRequisicao.listarJogos("tictactoe")); DataTable dtJogos = new DataTable(); dtJogos.Columns.Add(new DataColumn("idDoJogo", Type.GetType("System.String"))); dtJogos.Columns.Add(new DataColumn("tipo", Type.GetType("System.String"))); dtJogos.Columns.Add(new DataColumn("status", Type.GetType("System.String"))); if (resposta != null) { RespostaDoServidor resp = new RespostaDoServidor(resposta); DescricaoDeJogo[] jogos = resp.Jogos; if (jogos != null) { for (int i = 0; i < jogos.Length; i++) { DataRow novaLinha = dtJogos.NewRow(); novaLinha["idDoJogo"] = jogos[i].identificadorDoJogo; String tipo = "Jogo da Velha"; novaLinha["tipo"] = tipo; String status = "Jogo em andamento."; if (jogos[i].jogoEncerrado) { status = "Encerrado."; } if (jogos[i].jogoEncerrado) { status = "Encerrado."; } else { if (jogos[i].esperandoJogadores) { status = "Aguardando jogadores."; } } novaLinha["status"] = status; dtJogos.Rows.Add(novaLinha); } } } dgvJogos.DataSource = dtJogos; btnConsultarJogos.Enabled = true; }
/// <summary> /// Solicita ao servidor a criação de um novo jogo da velha. /// Ao entrar no jogo, um novo formulário do tipo JogoDaVelha /// é criado para que o usuário interaja com este novo jogo. /// </summary> private void btnCriarEEntrar_Click(object sender, EventArgs e) { String resposta = enviandoMensagem(MensagensDeRequisicao.novoJogo("tictactoe")); if (resposta == null) { return; } btnConsultar_Click(sender, e); RespostaDoServidor resp = new RespostaDoServidor(resposta); if (resp.respostaAfirmativa) { int idJogador = -1; int idJogo = -1; idJogador = int.Parse(txtJogador.Text); idJogo = resp.identificadorDoJogo; JogoDaVelha f = new JogoDaVelha(idJogo, idJogador, this); f.Show(); } }
/// <summary> /// Método acionado pelo Tick do Timer timer1. /// Envia mensagem ao servidor para verificar se há mudanças no jogo e /// atualiza o formulário com os dados da resposta do servidor. /// </summary> private void timer1_Tick(object sender, EventArgs e) { String resposta = formPai.enviandoMensagem(MensagensDeRequisicao.estadoDoJogo(jogo, jogador)); RespostaDoServidor resp1 = new RespostaDoServidor(resposta); if (resp1.jogoEncerrado) { verificarStatus(resp1); } else if (resp1.turnoDoJogadorAtual) { lblStatus.Text = "seu turno"; if (botAtivado) { jogarAutomaticamente(); } else { timer1.Enabled = false; } lerTabuleiro(); verificarStatus(resp1); } }
public JogoDaVelha(int jogoId, int jogadorId, Inicio pai) { jogador = jogadorId; jogo = jogoId; formPai = pai; InitializeComponent(); tabLabel[0] = lbl0; tabLabel[1] = lbl1; tabLabel[2] = lbl2; tabLabel[3] = lbl3; tabLabel[4] = lbl4; tabLabel[5] = lbl5; tabLabel[6] = lbl6; tabLabel[7] = lbl7; tabLabel[8] = lbl8; String resposta = formPai.enviandoMensagem(MensagensDeRequisicao.entrarEmUmJogo(jogoId, jogadorId)); RespostaDoServidor resp1 = new RespostaDoServidor(resposta); if (resp1.aguardandoJogadores) { jogadorAtual = tiposDeJogadores.Jogador1; lblJogadorAtual.Text = "Jogador1: X"; lblStatus.Text = "aguardando jogador2 O"; timer1.Enabled = true; } else { String resposta2 = formPai.enviandoMensagem(MensagensDeRequisicao.estouNesteJogo(jogoId, jogadorId)); if (resposta2 == null) { this.Close(); return; } RespostaDoServidor resp2 = new RespostaDoServidor(resposta2); if (resp2.respostaAfirmativa) { if (resp2.indiceDoJogador == 1) { jogadorAtual = tiposDeJogadores.Jogador1; lblJogadorAtual.Text = "Jogador1: X"; } else { jogadorAtual = tiposDeJogadores.Jogador2; lblJogadorAtual.Text = "Jogador2: O"; } } else { jogadorAtual = tiposDeJogadores.Observador; lblJogadorAtual.Text = "Observando Jogo."; btnBot.Enabled = false; timer1.Enabled = true; timer1.Interval = 5000; } } if (resp1.jogoEncerrado) { verificarStatus(resp1); } lerTabuleiro(); }