Advertisement
Guest User

Jogo da Velha em Socket - Linux

a guest
Apr 20th, 2018
1,140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.01 KB | None | 0 0
  1. Arquivo #1 -------- cliente.c ---------
  2.  
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>//close
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <arpa/inet.h>
  12. #include <netdb.h>
  13.  
  14. #define PORTA_PADRAO 4343
  15.  
  16. #define INICIO_MATRIZ 1
  17. #define INICIO_TAM_MSG 10
  18. #define INICIO_MSG 12
  19.  
  20.  
  21. //Definindo um tipo boolean;
  22. typedef enum boolean{false, true}bool;
  23.  
  24. //Exibe mensagem de erro e fornece um retorno;
  25. int Erro(char mensagem[], int);
  26.  
  27. //Estabelece Conexao com o Servidor
  28. void IniciaSocket(int *, char ip[]);
  29.  
  30. //Verifica se a coordenada foi recusada;
  31. bool VerificaRecuso(char c);
  32.  
  33. //Verifica se o servidor enviou uma mensagem de fim de jogo;
  34. bool AnalisaFimPacote(char pacote[]);
  35.  
  36. void Desencapsular(char pacote[], char matriz_jogo[], char mensagem_servidor[]);
  37. int ConvertChar (char);
  38. void CharParaInt (char pacote[], int *);
  39. void ImprimirRecebido(char matriz_jogo[], char mensagem_servidor[]);
  40.  
  41. int main(int argc,char *argv[]){
  42. int sock_programa;
  43. char ip[13];
  44.  
  45. strcpy(ip, argv[1]);
  46. printf("IP: %s\n", ip);
  47.  
  48. if(argc<1)
  49. return Erro("Informe o IP do servidor!", -1);
  50.  
  51. IniciaSocket(&sock_programa, ip);
  52. if(sock_programa == -1)
  53. return Erro("Erro: Socket!", -1);
  54.  
  55. int teste_erro;
  56. bool fim = false;
  57. char pacote_envio [100];
  58. char pacote_receber[100];
  59.  
  60. char matriz_jogo[9];
  61. char mensagem_servidor[88];
  62.  
  63. //Primeira mensagem solicitando aguardar
  64. teste_erro = recv(sock_programa,pacote_receber,100,0);
  65. pacote_receber[teste_erro] = '\0';
  66. Desencapsular(pacote_receber, matriz_jogo, mensagem_servidor);
  67. system("clear");
  68. ImprimirRecebido(matriz_jogo, mensagem_servidor);
  69.  
  70. //printf("Servidor: %s\n",pacote_receber);
  71.  
  72. //Segunda mensagem solicitando uma jogada
  73. teste_erro = recv(sock_programa,pacote_receber,100,0);
  74. pacote_receber[teste_erro] = '\0';
  75. Desencapsular(pacote_receber, matriz_jogo, mensagem_servidor);
  76. system("clear");
  77. ImprimirRecebido(matriz_jogo, mensagem_servidor);
  78. //printf("Servidor: %s\n",pacote_receber);
  79.  
  80. do{
  81. do{//Laço para verificar se a coordenada foi recusada;
  82. if(teste_erro!=1 && !fim){
  83. // Envio de uma jogada
  84. fgets(pacote_envio,100,stdin);
  85. pacote_envio[strlen(pacote_envio)-1] = '\0';
  86. teste_erro = send(sock_programa,pacote_envio,strlen(pacote_envio),0);
  87.  
  88. // Recebe pacote contendo a coordenada solicitada alterada,
  89. // para o jogador observar que sua coordenada foi alterada na matriz;
  90. teste_erro = recv(sock_programa,pacote_receber,100,0);
  91. pacote_receber[teste_erro] = '\0';
  92. Desencapsular(pacote_receber, matriz_jogo, mensagem_servidor);
  93. system("clear");
  94. ImprimirRecebido(matriz_jogo, mensagem_servidor);
  95.  
  96. }
  97. if(teste_erro!=-1)
  98. fim = AnalisaFimPacote(pacote_receber);
  99. if(fim)
  100. break;
  101. }while(VerificaRecuso(pacote_receber[0]) && teste_erro!=-1);
  102.  
  103. if(teste_erro!=1 && !fim){
  104. // Recebe o pacote contendo a coordenada alterada por outro jogador;
  105. teste_erro = recv(sock_programa,pacote_receber,100,0);
  106. pacote_receber[teste_erro] = '\0';
  107. Desencapsular(pacote_receber, matriz_jogo, mensagem_servidor);
  108. system("clear");
  109. ImprimirRecebido(matriz_jogo, mensagem_servidor);
  110.  
  111. if(teste_erro!=-1)
  112. fim = AnalisaFimPacote(pacote_receber);
  113. }
  114. if(fim)
  115. break;
  116. }while(teste_erro!=1 && !fim);
  117.  
  118. printf("\n\n");
  119. close(sock_programa);
  120. return 0;
  121. }
  122.  
  123. int Erro(char mensagem[], int returno){
  124. printf("\n%s\n", mensagem);
  125. return returno;
  126. }
  127.  
  128. void IniciaSocket(int *sock_programa, char ip[]){
  129. struct sockaddr_in addr;
  130.  
  131. *sock_programa = socket(AF_INET,SOCK_STREAM,0);
  132.  
  133. if(*sock_programa == -1)
  134. printf("Erro ao criar o socket!\n");
  135.  
  136. addr.sin_family = AF_INET;
  137. addr.sin_port = htons(PORTA_PADRAO);
  138. addr.sin_addr.s_addr = inet_addr(ip);
  139.  
  140. memset(&addr.sin_zero,0,sizeof(addr.sin_zero));
  141.  
  142. printf("Tentando se conectar ao servidor...\n");
  143.  
  144. if(connect(*sock_programa,(struct sockaddr*)&addr,sizeof(addr)) == -1){
  145. printf("Erro ao se conectar!\n");
  146. *sock_programa = -1;
  147. }else{
  148. printf("Conectado! Aguarde resposta do servidor...\n\n");
  149. }
  150. }
  151.  
  152. bool VerificaRecuso(char c){
  153. if(c == 'x')
  154. return true;
  155. else
  156. return false;
  157. }
  158.  
  159. bool AnalisaFimPacote(char pacote[]){
  160. char auxiliar_fim[3];
  161. int i;
  162.  
  163. for(i=0; i<3; i++)
  164. auxiliar_fim[i] = pacote[INICIO_MSG+i];
  165.  
  166. auxiliar_fim[3] = '\0';
  167.  
  168. if(strcmp("FIM", auxiliar_fim) == 0)
  169. return true;
  170. else
  171. return false;
  172. }
  173.  
  174. void Desencapsular(char pacote[], char matriz_jogo[], char mensagem_servidor[]){
  175. int i, cont=0;
  176. int tam = 0;
  177.  
  178. for (i=INICIO_MATRIZ; i<INICIO_MATRIZ+9; i++){
  179. if(pacote[i]=='*')
  180. matriz_jogo[cont] = ' ';
  181. else
  182. matriz_jogo[cont] = pacote[i];
  183. cont++;
  184. }
  185. matriz_jogo[cont] = '\0';
  186.  
  187. CharParaInt(pacote, &tam);
  188.  
  189. cont = 0;
  190. for (i=INICIO_MSG; i<INICIO_MSG+tam; i++){
  191. mensagem_servidor[cont] = pacote[i];
  192. cont++;
  193. }
  194. mensagem_servidor[cont] = '\0';
  195. }
  196.  
  197. void CharParaInt(char pacote[], int *tam){
  198. *tam = 10 * ConvertChar(pacote[INICIO_TAM_MSG]);
  199. *tam = *tam + ConvertChar(pacote[INICIO_TAM_MSG+1]);
  200. }
  201.  
  202. int ConvertChar(char c){
  203. return (c)-48;
  204. }
  205.  
  206. void ImprimirRecebido(char matriz_jogo[], char mensagem_servidor[]){
  207. int tam, i;
  208. printf("\n\n\n\t╔════════════════════════════════════════════════════════╗\n");
  209. printf("\t║ ║\n");
  210. printf("\t║ Jogo da velha em Socket ║\n");
  211. printf("\t║ ║\n");
  212. printf("\t║ ║\n");
  213. printf("\t║ ╔═══╦═══╦═══╗ ║\n");
  214. printf("\t║ ║ %c ║ %c ║ %c ║ ║\n", matriz_jogo[0], matriz_jogo[1], matriz_jogo[2]);
  215. printf("\t║ ╠═══╬═══╬═══╣ ║\n");
  216. printf("\t║ ║ %c ║ %c ║ %c ║ ║\n", matriz_jogo[3], matriz_jogo[4], matriz_jogo[5]);
  217. printf("\t║ ╠═══╬═══╬═══╣ ║\n");
  218. printf("\t║ ║ %c ║ %c ║ %c ║ ║\n", matriz_jogo[6], matriz_jogo[7], matriz_jogo[8]);
  219. printf("\t║ ╚═══╩═══╩═══╝ ║\n");
  220. printf("\t║ ║\n");
  221. printf("\t║ ║\n");
  222. printf("\t║ ║\n");
  223. printf("\t╚════════════════════════════════════════════════════════╝\n");
  224. printf("\t Servidor: %s\n", mensagem_servidor);
  225. printf("\t Coordenada:");
  226. }
  227.  
  228. Arquivo #2 -------- servidor.c ------------
  229.  
  230.  
  231. #include <stdio.h> //Para uso do entrada e saida de dados em alto nivel;
  232. #include <stdlib.h> //Para uso do "system()"
  233. #include <string.h> //Manipulacao de strings em geral: "strcpy()", "strcmp()", "strcat()"
  234. #include <unistd.h> //Para a uso da funcao "close()"
  235. #include <sys/types.h> //Funcoes de temporizacao
  236. #include <sys/socket.h> //Uso e manipulacao de Sockets
  237. #include <netinet/in.h> //Define a estrutura "sockaddr_in"
  238. #include <arpa/inet.h> //Disponibiliza o tipo in_port_t e in_addr_t para uso da <netinet/in.h>
  239. #include <netdb.h>
  240.  
  241.  
  242. #define PORTA_PADRAO 4343
  243.  
  244. //Definindo um tipo boolean;
  245. typedef enum boolean{false, true}bool;
  246.  
  247. int Matriz_Jogo [3][3];
  248. int Coord_Digitadas[9];
  249. int jogada;
  250.  
  251. int Erro(char mensagem[], int returno); //Funcao generica para impressar de mensagem de erro e retorno de inteiro
  252. void StatusJogo(int, int, int, int); //Imprime no tela, do servidor o status do jogo: matriz, jogada, realizador da jogada;
  253.  
  254. /*Funcoes para estabelecimento de conexao */
  255. bool IniciaSocketServidor(int *); // Cria o Socket do Servidor, vincula e ouve uma porta[funções: bind() e listen];
  256. bool IniciaSocketClientes(int *, int *, int *); // Aceita os clientes[funcao: accept()];
  257.  
  258. /*Funcoes para formatacao do pacote enviado*/
  259. void Encapsular (char *, int); // Gera um pacote para ser enviado
  260. void EncapsularMatriz(char pacote[]); // Encapsula matriz no jogo, funcao chamada por "Encapsular()"
  261. void IntParaChar (int, char char_gerado[]); // Converte um inteiro > 9 em um char, ex. int n = 129102 -> char m[7] ={"129102"};
  262. int CharParaInt (char); // Converte um char em um inteiro;
  263. char GetCaracter (int); // Obtem um caractere a partir da tabela ASCII, ex. int n = 48 -> char m = '1';
  264.  
  265. /* Função principal que trata de intercalar os clientes realizar uma jogada, reenvia o pacote solicitando uma nova jogada quando
  266. invalida e determina o vencedor */
  267. void JogadaClientes(int *, int *, int *, int *, int *);
  268. void ImprimeMatriz(void);
  269.  
  270. /*Funções para manipulacao da matriz do jogo*/
  271. bool ValidaCoordenada (int coordenada); // Verifica se a coordenada solicitada esta entre 1 e 9 e tambem se nao ja foi digitada anteriormente
  272. bool VerifCoordJaDigitada (int aux); // Usada para verificar se a coordenada ja foi digitada
  273. int VerificaFimMatriz (int jogadas); // Verifica se ja se tem um ganhador ou ocorreu um empate
  274. int SomaCoordenadas (int x, int y, int z); // Na matriz eh preenchido com valores 1 e -1 dependendo do jogador, entao essa funcao soma os
  275. //valores para posteriormente verificar se ha a soma eh 3 ou -3, significando que ha um ganhador
  276. bool VerificaSomaCoord (int aux); // Verifica se a soma eh 3 ou -3
  277. void ConverteEmCoordenadaXY(int coord, int *i, int *j); // Como as coordenadas sao solicitada por numeros de 1 a 9, essa funcao converte em coordenadas
  278. //i e j para alterar a matriz do jogo;
  279.  
  280. int main(){
  281. int sock_programa, i, j, cont=0;
  282. int sock_cliente_1, sock_cliente_2;
  283.  
  284. // Função retorna um bool para o inicio do servidor,
  285. // dentro da fucao e realidazo um bind e um listen no
  286. // socket passado por referencia;
  287. if(!IniciaSocketServidor(&sock_programa))
  288. return Erro("Falha ao manipular a variavel sock_programa!", -1);
  289.  
  290.  
  291. // Função retorna um bool para o inicio dos clientes,
  292. // dentro da fucao e realidazo um accept para cada cliente;
  293. if(!IniciaSocketClientes(&sock_programa, &sock_cliente_1, &sock_cliente_2))
  294. return Erro("Falha no accept()", -1);
  295.  
  296.  
  297. int qtd_jogadas = 0;
  298. int verifica_fim = 0;
  299. int teste_erro = 0;
  300. char pacote_envio[100];
  301.  
  302. /*Inicio do Jogo*/
  303. Encapsular(pacote_envio, 0);/*Enviando para ambos aguardar*/
  304. teste_erro = send(sock_cliente_1,pacote_envio,strlen(pacote_envio),0);
  305. teste_erro = send(sock_cliente_2,pacote_envio,strlen(pacote_envio),0);
  306.  
  307. Encapsular(pacote_envio, 5);/*sock_cliente_1 faz a primeira jogada*/
  308. teste_erro = send(sock_cliente_1,pacote_envio,strlen(pacote_envio),0);
  309. do{
  310. // Ouve e realiza a jogada de sock_cliente_1
  311. JogadaClientes(&sock_cliente_1, &sock_cliente_2, &qtd_jogadas, &teste_erro, &verifica_fim);
  312. StatusJogo(1, 2,qtd_jogadas, 0);
  313.  
  314. // Ouve e realiza a jogada de sock_cliente_2
  315. if(!(verifica_fim==9 || verifica_fim==3 || verifica_fim==-3))
  316. JogadaClientes(&sock_cliente_2, &sock_cliente_1, &qtd_jogadas, &teste_erro, &verifica_fim);
  317. StatusJogo(2, 1, qtd_jogadas, 0);
  318.  
  319. //Força a saida While quando ocorre o fim do jogo;
  320. if(verifica_fim==9 || verifica_fim==3 || verifica_fim==-3)
  321. break;
  322. }while(teste_erro!=-1);
  323.  
  324. if(verifica_fim == 9){
  325. StatusJogo(2, 1, qtd_jogadas, 3);
  326. Encapsular(pacote_envio, 4);//Envia mensagem para ambos informando que Deu Velha;
  327. teste_erro = send(sock_cliente_1,pacote_envio,strlen(pacote_envio),0);
  328. teste_erro = send(sock_cliente_2,pacote_envio,strlen(pacote_envio),0);
  329. }else if(verifica_fim == 3){
  330. StatusJogo(2, 1, qtd_jogadas, 2);
  331. Encapsular(pacote_envio, 2);//Envia mensagem ao sock_cliente_2 informando que ele Ganhou
  332. teste_erro = send(sock_cliente_2,pacote_envio,strlen(pacote_envio),0);
  333. Encapsular(pacote_envio, 3);//Envia mensagem ao sock_cliente_1 informando que ele Perdeu
  334. teste_erro = send(sock_cliente_1,pacote_envio,strlen(pacote_envio),0);
  335. }else if(verifica_fim == -3){
  336. StatusJogo(2, 1, qtd_jogadas, 1);
  337. Encapsular(pacote_envio, 2);//Envia mensagem ao sock_cliente_1 informando que ele Ganhou
  338. teste_erro = send(sock_cliente_1,pacote_envio,strlen(pacote_envio),0);
  339. Encapsular(pacote_envio, 3);//Envia mensagem ao sock_cliente_2 informando que ele Perdeu
  340. teste_erro = send(sock_cliente_2,pacote_envio,strlen(pacote_envio),0);
  341. }
  342. system("sleep 2");
  343. close(sock_cliente_1);
  344. close(sock_cliente_2);
  345. close(sock_programa);
  346. return 0;
  347. }
  348.  
  349. int Erro(char mensagem[], int returno){
  350. printf("\n%s\n", mensagem);
  351. return returno;
  352. }
  353.  
  354. void StatusJogo(int origem, int destino, int numero_da_jogada, int status){
  355. printf("\n+-----------------------------------------------+\n");
  356. printf("\n ---STATUS DO JOGO---\n\n");
  357. if(status==0){
  358. printf("\n Realizou Jogada >> sock_cliente_%d", origem);
  359. printf("\n Aguardando >> sock_cliente_%d", origem);
  360. printf("\n Proximo realizar uma Jogada >> sock_cliente_%d", destino);
  361. }else if(status==1){
  362. printf("\n GANHOU O JOGO >> sock_cliente_1");
  363. printf("\n PERDEU O JOGO >> sock_cliente_2");
  364. printf("\n FIM >> FIM DE JOGO");
  365. }else if(status==1){
  366. printf("\n GANHOU O JOGO >> sock_cliente_1");
  367. printf("\n PERDEU O JOGO >> sock_cliente_2");
  368. printf("\n FIM >> FIM DE JOGO");
  369. }else{
  370. printf("\n GANHOU O JOGO >> EMPATE");
  371. printf("\n PERDEU O JOGO >> EMPATE");
  372. printf("\n FIM >> FIM DE JOGO");
  373. }
  374.  
  375. printf("\n Numero da Jogada >> %d\n", numero_da_jogada);
  376. printf(" MATRIZ:\n");
  377. ImprimeMatriz();
  378. printf("\n+-----------------------------------------------+\n");
  379. printf("\n");
  380. }
  381.  
  382. bool IniciaSocketServidor(int *sock_programa){
  383. struct sockaddr_in addr;
  384.  
  385. *sock_programa = socket(AF_INET,SOCK_STREAM,0);
  386. if(*sock_programa == -1){
  387. printf("Erro ao criar o socket!\n");
  388. return false;
  389. }
  390.  
  391. addr.sin_family = AF_INET;
  392. addr.sin_port = htons(PORTA_PADRAO);
  393. addr.sin_addr.s_addr = INADDR_ANY;
  394. memset(&addr.sin_zero,0,sizeof(addr.sin_zero));
  395.  
  396. if(bind(*sock_programa,(struct sockaddr*)&addr,sizeof(addr)) == -1){
  397. printf("Erro na funcao bind()\n");
  398. return false;
  399. }
  400.  
  401. if(listen(*sock_programa,1) == -1){
  402. printf("Erro na funcao listen()\n");
  403. return false;
  404. }
  405.  
  406. return true;
  407. }
  408.  
  409. bool IniciaSocketClientes(int *sock_programa, int *sock_cliente_1, int *sock_cliente_2){
  410.  
  411. printf("Aguardando clientes...\n");
  412. *sock_cliente_1 = accept(*sock_programa,0,0);
  413. printf("sock_cliente_1 - Cliente 1 aceito!\n");
  414.  
  415. *sock_cliente_2 = accept(*sock_programa,0,0);
  416. printf("sock_cliente_2 - Cliente 2 aceito!\n");
  417.  
  418. // Retorna false por nao ter iniciado corretamente;
  419. // Retorna true por iniciar corretamente;
  420. if(*sock_cliente_1 == -1 || *sock_cliente_2 == -1)
  421. return false;
  422. else
  423. return true;
  424. }
  425.  
  426. void Encapsular(char *pacote, int id_mensagem){
  427. int tam = 0; //tamanho da mensagem presente no campo mensagem
  428. char tam_char[4];//tam convertido em caracteres
  429. int i;
  430. char mensagem_servidor[50];
  431.  
  432. // Campo do pacote que e armazenado uma coordenada,
  433. // e por ser o servidor o remetente, nao e necessario
  434. // armazenar qualquer coordenada;
  435. strcpy(pacote, "-");
  436.  
  437. // Campo do pacote onde sera armazenada a matriz do jogo,
  438. // sera colocado um 'X' para o valor inteiro -1(um negativo),
  439. // 'O' para valor o inteiro 1(um positivo) e '*' para o
  440. // valor inteiro 0(zero);
  441. EncapsularMatriz(pacote);
  442.  
  443. switch(id_mensagem){
  444. case 0:
  445. strcpy(mensagem_servidor, "Aguarde sua vez para jogar!");
  446. break;
  447. case 1:
  448. pacote[0] = 'x';
  449. strcpy(mensagem_servidor, "Coordenada Invalida Solicitada!");
  450. break;
  451. case 2:
  452. strcpy(mensagem_servidor, "FIM DE JOGO, VOCE GANHOU!!!");
  453. break;
  454. case 3:
  455. strcpy(mensagem_servidor, "FIM DE JOGO, VOCE PERDEU!!!");
  456. break;
  457. case 4:
  458. strcpy(mensagem_servidor, "FIM DE JOGO,DEU VELHA!!!");
  459. break;
  460. case 5:
  461. strcpy(mensagem_servidor, "Faça uma jogada!");
  462. break;
  463. }
  464. // Após converter o tamanho do campo mensagem do pacote que sera enviada em char
  465. // eh inserido no pacote este char gerado;
  466. tam = strlen(mensagem_servidor);
  467. IntParaChar(tam, tam_char);
  468. strcat(pacote, tam_char);
  469.  
  470. // Inclui no pacote a mensagem do servidor;
  471. strcat(pacote, mensagem_servidor);
  472.  
  473. // Preenche o restante do pacote com '-'
  474. for(i=1+9+tam+1;i<100; i++)
  475. strcat(pacote, "-");
  476.  
  477. pacote[100] = '\0';
  478. }
  479.  
  480. void EncapsularMatriz(char pacote[]){
  481. int i, j;
  482.  
  483. for(i=0; i<3; i++){
  484. for(j=0; j<3; j++){
  485. if(Matriz_Jogo[i][j] == 0)
  486. strcat(pacote, "*");
  487. else if(Matriz_Jogo[i][j] == 1)
  488. strcat(pacote, "O");
  489. else if(Matriz_Jogo[i][j] == -1)
  490. strcat(pacote, "X");
  491. }
  492. }
  493. }
  494.  
  495. void IntParaChar(int n, char char_gerado[]) {
  496. int resto = 0;
  497. int cont = 0;
  498. char num[2];
  499.  
  500. while(n > 0){
  501. resto = n%10;//Atribui somente a parte inteira;
  502. n = n/10; //Atualiza
  503.  
  504. num[cont] = (char)GetCaracter(resto);//Fica invertido essa atribuição
  505. cont++;
  506. }
  507. char_gerado[0] = num[1];
  508. char_gerado[1] = num[0];
  509. char_gerado[2] = '\0';
  510. }
  511.  
  512. int CharParaInt(char n){
  513. return (n)-48;
  514. }
  515.  
  516. char GetCaracter(int a){
  517. int b = a+48;
  518. return (char)b;
  519. }
  520.  
  521. void JogadaClientes(int *sock_origem, int *sock_destino, int *qtd_jogadas, int *teste_erro, int *verifica_fim){
  522. int coordenada, coord_x, coord_y;
  523. char pacote_receber[100];
  524. char pacote_envio[100];
  525. bool coordenada_valida = true;
  526.  
  527. do{
  528. *teste_erro = recv(*sock_origem,pacote_receber,100,0);// Recebe pacote do cliente;
  529.  
  530. //Se nao houver erro e ainda nao for o fim jogo,
  531. if(*teste_erro!=-1 && !(*verifica_fim == 9 || *verifica_fim == -3 || *verifica_fim == 3)){
  532. coordenada = CharParaInt(pacote_receber[0]);
  533. coordenada_valida = ValidaCoordenada(coordenada);
  534. coordenada = coordenada - 1;
  535.  
  536. if(coordenada_valida){/*Caso a coordenada solicitada seja valida*/
  537. ConverteEmCoordenadaXY(coordenada, &coord_x, &coord_y);//Obtem a coordenada em x e y da matriz
  538.  
  539. //De acordo com o numero da jogada é possivel alterar a matriz com o numero correspondente;
  540. if(*qtd_jogadas%2==0)
  541. Matriz_Jogo[coord_x][coord_y] = -1;
  542. else
  543. Matriz_Jogo[coord_x][coord_y] = 1;
  544.  
  545. *qtd_jogadas = *qtd_jogadas + 1;
  546.  
  547. *verifica_fim = VerificaFimMatriz(*qtd_jogadas);
  548. if(!(*verifica_fim == 9 || *verifica_fim == -3 || *verifica_fim == 3)){
  549. //Envia para o destino a matriz alterada pela origem;
  550. Encapsular(pacote_envio, 5);//Mensagem solicitando uma jogada;
  551. *teste_erro = send(*sock_destino, pacote_envio, strlen(pacote_envio),0);
  552. }else{
  553. //Coordenada_valida recebe true para sair do laço;
  554. coordenada_valida = true;
  555. }
  556.  
  557. // Envia para a origem a matriz que ele acabou de alterar
  558. // assim ela poder observar sua coordenada alterada;
  559. Encapsular(pacote_envio, 0);//Mensagem dizendo para aguardar.
  560. *teste_erro = send(*sock_origem, pacote_envio, strlen(pacote_envio),0);
  561.  
  562. }else{/*Caso a coordenada solicitada nao seja valida*/
  563. //Reenvia o pacote solicitando uma coordenada correta;
  564. Encapsular(pacote_envio, 1);//Encapsula com mensagem dizendo que a coordenada eh invalida;
  565. *teste_erro = send(*sock_origem,pacote_envio,strlen(pacote_envio),0); /* Envia a string */
  566. }
  567. }
  568. *verifica_fim = VerificaFimMatriz(*qtd_jogadas);
  569. // Como pode ter ocorrido um erro ou o fim do jogo,atribui-se
  570. // true para a coordenada_valida, para sair do laço;
  571. if(*teste_erro == -1 || *verifica_fim == 9 || *verifica_fim == -3 || *verifica_fim == 3)
  572. coordenada_valida = true;
  573.  
  574. }while(!coordenada_valida);
  575. }
  576.  
  577. void ImprimeMatriz(void){
  578. int i, j;
  579.  
  580. for(i=0; i<3; i++){
  581. for(j=0; j<3; j++){
  582. if(Matriz_Jogo[i][j] == 1)
  583. printf(" O ");
  584. else if (Matriz_Jogo[i][j] == -1)
  585. printf(" X ");
  586. else
  587. printf(" - ");
  588. }
  589. printf("\n");
  590. }
  591. }
  592.  
  593. bool ValidaCoordenada(int coordenada){
  594. if(coordenada>9 || coordenada <1)
  595. return false;
  596. else if(VerifCoordJaDigitada(coordenada))
  597. return false;
  598.  
  599. return true;
  600. }
  601.  
  602. bool VerifCoordJaDigitada(int aux){
  603. int i;
  604.  
  605. for(i=0; i<9; i++){
  606. if(Coord_Digitadas[i] == aux){
  607. return true;
  608. }
  609. }
  610. for(i=0; i<9; i++){
  611. if(Coord_Digitadas[i] == 0){
  612. Coord_Digitadas[i] = aux;
  613. return false;
  614. }
  615. }
  616. }
  617.  
  618. int VerificaFimMatriz(int jogadas){
  619. int diagonal[2], vertical[3], horizontal[3], i;
  620.  
  621. vertical [0] = vertical [1] = vertical [2] = 0;
  622. horizontal[0] = horizontal[1] = horizontal[2] = 0;
  623. diagonal [0] = diagonal [1] = 0;
  624.  
  625. horizontal[0] = SomaCoordenadas(0,1,2);
  626. horizontal[1] = SomaCoordenadas(3,4,5);
  627. horizontal[2] = SomaCoordenadas(6,7,8);
  628.  
  629. vertical[0] = SomaCoordenadas(0,3,6);
  630. vertical[1] = SomaCoordenadas(1,4,7);
  631. vertical[2] = SomaCoordenadas(2,5,8);
  632.  
  633. diagonal[0] = SomaCoordenadas(0,4,8);
  634. diagonal[1] = SomaCoordenadas(2,4,6);
  635.  
  636.  
  637. for(i=0; i<3; i++){
  638. if(VerificaSomaCoord(horizontal[i])){
  639. return horizontal[i];
  640. }
  641. if(VerificaSomaCoord(vertical[i])){
  642. return vertical[i];
  643. }
  644. if(i<2){
  645. if(VerificaSomaCoord(diagonal[i])){
  646. return diagonal[i];
  647. }
  648. }
  649. }
  650.  
  651. if(jogadas == 9)
  652. return 9;
  653.  
  654. return 0;
  655. }
  656.  
  657. int SomaCoordenadas(int x, int y, int z){
  658. int i, j, cont=0;
  659.  
  660. ConverteEmCoordenadaXY(x, &i, &j);
  661. cont = cont + Matriz_Jogo[i][j];
  662. ConverteEmCoordenadaXY(y, &i, &j);
  663. cont = cont + Matriz_Jogo[i][j];
  664. ConverteEmCoordenadaXY(z, &i, &j);
  665. cont = cont + Matriz_Jogo[i][j];
  666.  
  667. return cont;
  668. }
  669.  
  670. bool VerificaSomaCoord(int aux){
  671. if(aux==3 || aux==-3){
  672. return true;
  673. }else{
  674. return false;
  675. }
  676. }
  677.  
  678. void ConverteEmCoordenadaXY(int coord, int *i, int *j){
  679. *i = (coord/3);
  680. *j = (coord%3);
  681. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement