PageRenderTime 43ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/poker.c

https://gitlab.com/giancarlokc/poker
C | 1107 lines | 911 code | 101 blank | 95 comment | 314 complexity | 1a1cb62024c5c102d6b8a2f383fa5aaf MD5 | raw file
  1. // Copyright 2012 Giancarlo Klemm Camilo, Renan Greca
  2. // This program is free software: you can redistribute it and/or modify
  3. // it under the terms of the GNU General Public License as published by
  4. // the Free Software Foundation, either version 3 of the License, or
  5. // any later version.
  6. // This program is distributed in the hope that it will be useful,
  7. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. // GNU General Public License for more details.
  10. // You should have received a copy of the GNU General Public License
  11. // along with this program. If not, see <http://www.gnu.org/licenses/>.
  12. // ********************************************************************* //
  13. // Project 3 of Computer Networks. Students: Giancarlo Klemm Camilo, Renan Greca
  14. // UFPR 2012/2
  15. // This program uses a library udp_socket.h (Made by us) that was implemented using socket.h
  16. // This program tries to simulate a poker game with 4 players.
  17. // The basic rules for the program are:
  18. // 1. Each player sould start the program with a unique ID (integer).
  19. // 2. The player '0' starts.
  20. // 3. The normal rules of texas hold'em apply
  21. // Trabalho 3 de redes, Alunos: Giancarlo Klemm Camilo, Renan Greca.
  22. // UFPR 2012/2
  23. // Este programa utiliza a biblioteca udp_socket.h (feita por nós) que por sua vez implementa a biblioteca socket.h
  24. // Este programa visa simular um jogo de poker entre 4 jogadores. Sendo que o jogo tem as seguintes regras:
  25. //
  26. // 1. Cada jogador deve se identificar com um numero unico como argumento do programa
  27. // 2. O jogador '0' sempre começa
  28. // 3. As regras normal do poker Texas Hold'em se aplicam
  29. // message: |Source|Destination|'x'|Option|----[4]"hand"|----------[10]"desk's cards"|----------------[16]"player's pot"|----[4]"pot"
  30. #include<stdio.h>
  31. #include<string.h>
  32. #include<stdlib.h>
  33. #include<arpa/inet.h>
  34. #include<sys/socket.h>
  35. #include"udp_socket.h"
  36. #include <time.h>
  37. #define copas 0
  38. #define paus 1
  39. #define ouros 2
  40. #define espadas 3
  41. #define straight_flush 8
  42. #define four_of_kind 7
  43. #define full_house 6
  44. #define flush 5
  45. #define straight 4
  46. #define three_of_kind 3
  47. #define two_pair 2
  48. #define one_pair 1
  49. #define high_card 0
  50. #define WAIT 0
  51. #define CHECK 1
  52. #define BET 2
  53. #define PAY 3
  54. #define FOLD 4
  55. #define INITIAL_POT 1000
  56. // struct that defines a card //
  57. typedef struct Carta{
  58. int valor;
  59. int naipe;
  60. int usada;
  61. int visivel;
  62. }Carta;
  63. typedef struct Combinacao_Carta{
  64. Carta carta[7];
  65. int tipo;
  66. int valor;
  67. }Combinacao_Carta;
  68. // struct that defines a player's hand //
  69. typedef struct Mao{
  70. Carta carta[2];
  71. }Mao;
  72. // struct that defines the desk of bets //
  73. typedef struct Mesa{
  74. Carta carta[5];
  75. }Mesa;
  76. // struct that defines the deck of cards //
  77. typedef struct Baralho{
  78. Carta carta[52];
  79. }Baralho;
  80. // struct that defines a player //
  81. typedef struct Jogo{
  82. int fim_jogo;
  83. int player_turn;
  84. int fim_turno;
  85. int fim_rodada;
  86. int big_blind, small_blind;
  87. int dealer;
  88. int pot_mesa;
  89. int pot_mesa_ant;
  90. Mesa mesa;
  91. Baralho baralho;
  92. }Jogo;
  93. typedef struct Player{
  94. Mao mao;
  95. int estado_atual;
  96. int aposta_atual;
  97. int aposta_anterior;
  98. int pot;
  99. }Player;
  100. // return 1 if the program has enough arguments to begin //
  101. int testa_argumentos(int n_arg, char **args, int *p_number, char *server_ip){
  102. if(n_arg == 3){
  103. *p_number = atoi(args[1]);
  104. printf("Player number: %d\n",*p_number);
  105. strcpy(server_ip, args[2]);
  106. return 1;
  107. }else{
  108. printf("The program requires 2 arguments. ./poker [player number] [ip to connect]\n");
  109. return 0;
  110. }
  111. }
  112. // select the port's numbers to be used //
  113. void seleciona_portas(int *port_server, int *port_client, int p_number){
  114. *port_server = 8888 + p_number;
  115. if(p_number != 3)
  116. *port_client = 8888 + p_number + 1;
  117. else
  118. *port_client = 8888;
  119. }
  120. // send a message to all the player in the correct order //
  121. void envia_todos(int *player_number,char *message,struct sockaddr_in *si_other,int s,int port_client,int *recv_len,char *buf,int *slen, char *server_ip){
  122. int i = *player_number - 1;
  123. while(*player_number != i){ // manda uma mensagem para cada dos outros jogaores
  124. if((i >= 0) && (i <= 3)){
  125. do{
  126. message[0] = *player_number + '0';
  127. message[1] = i + '0';
  128. }while((envia_mesg(si_other, s, message, port_client, recv_len, buf, slen, server_ip) == 0) && (i < 4));
  129. // printf("mensagem enviada e recebida com sucesso para %d!\n",i);
  130. // getchar();
  131. }
  132. if(i == -1)
  133. i = 4;
  134. else
  135. i--;
  136. }
  137. }
  138. // shows the deck of cards //
  139. void mostra_baralho(struct Baralho *baralho){
  140. int i;
  141. printf("Deck - Value Kind\n");
  142. for(i=0;i<52;i++)
  143. printf("carta %d: %d %d\n",i+1,baralho->carta[i].valor,baralho->carta[i].naipe);
  144. }
  145. // show the player's hand //
  146. void mostra_mao(struct Mao mao){
  147. printf("Hand - Value Kind\n");
  148. printf("card 1: %d %d\ncard 2: %d %d\n",mao.carta[0].valor,mao.carta[0].naipe,mao.carta[1].valor,mao.carta[1].naipe);
  149. }
  150. // show the desk of cards //
  151. void mostra_mesa(struct Mesa mesa){
  152. int i;
  153. printf("Table - Value Kind\n");
  154. for(i=0;i<5;i++){
  155. if(mesa.carta[i].visivel == 1)
  156. printf("Card %d: %d %d\n",i+1,mesa.carta[i].valor,mesa.carta[i].naipe);
  157. else
  158. printf("Card %d: X X\n",i+1);
  159. }
  160. }
  161. // iniciates the deck of cards //
  162. void inicia_baralho(struct Baralho *baralho){
  163. int i,j,aux = 0;
  164. memset(baralho, 0, sizeof(baralho));
  165. for(i=2;i<15;i++)
  166. for(j=0;j<4;j++){
  167. baralho->carta[aux].valor = i;
  168. baralho->carta[aux].naipe = j;
  169. baralho->carta[aux].usada = 0;
  170. baralho->carta[aux].visivel = 1;
  171. aux++;
  172. }
  173. }
  174. // generates a random deck of cards //
  175. struct Mesa seleciona_mesa(struct Baralho *baralho){
  176. Mesa mesa;
  177. int i, rand_aux;
  178. srand(time(NULL));
  179. for(i=0;i<5;i){
  180. rand_aux = rand() % 52;
  181. if(baralho->carta[rand_aux].usada == 0){
  182. mesa.carta[i] = baralho->carta[rand_aux];
  183. mesa.carta[i].visivel = 0;
  184. baralho->carta[rand_aux].usada = 1;
  185. i++;
  186. }
  187. }
  188. return mesa;
  189. }
  190. // generates a random player's hand //
  191. struct Mao seleciona_mao(struct Baralho *baralho){
  192. Mao mao;
  193. int i, rand_aux;
  194. srand (time(NULL));
  195. for(i=0;i<2;i){
  196. rand_aux = rand() % 52;
  197. if(baralho->carta[rand_aux].usada == 0){
  198. mao.carta[i] = baralho->carta[rand_aux];
  199. baralho->carta[rand_aux].usada = 1;
  200. i++;
  201. }
  202. }
  203. return mao;
  204. }
  205. // iniciates the player's pot //
  206. iniciate_pot(struct Player *jogador){
  207. int i;
  208. for(i=0;i<4;i++){
  209. jogador[i].pot = INITIAL_POT + 2;
  210. }
  211. }
  212. // transcribe the deck of cards to a string mode //
  213. void escreve_mesa(struct Mesa mesa, char *mao_string){
  214. int i, aux = 8;
  215. for(i=0;i<5;i++){
  216. if(mesa.carta[i].valor > 9){
  217. if(mesa.carta[i].valor == 10){
  218. mao_string[aux] = 'D';
  219. }
  220. else if(mesa.carta[i].valor == 11){
  221. mao_string[aux] = 'Q';
  222. }
  223. else if(mesa.carta[i].valor == 12){
  224. mao_string[aux] = 'J';
  225. }
  226. else if(mesa.carta[i].valor == 13){
  227. mao_string[aux] = 'K';
  228. }
  229. else if(mesa.carta[i].valor == 14){
  230. mao_string[aux] = 'A';
  231. }
  232. mao_string[aux+1] = (char) mesa.carta[i].naipe + '0';
  233. }else{
  234. mao_string[aux] = (char) mesa.carta[i].valor + '0';
  235. mao_string[aux+1] = (char) mesa.carta[i].naipe + '0';
  236. }
  237. aux+=2;
  238. }
  239. mao_string[18] = '\0';
  240. }
  241. // transcribe the player's hand to a string mode //
  242. void escreve_mao(struct Mao outra_mao, char *mao_string){
  243. int i, aux = 4;
  244. for(i=0;i<2;i++){
  245. if(outra_mao.carta[i].valor > 9){
  246. if(outra_mao.carta[i].valor == 10){
  247. mao_string[aux] = 'D';
  248. }
  249. else if(outra_mao.carta[i].valor == 11){
  250. mao_string[aux] = 'Q';
  251. }
  252. else if(outra_mao.carta[i].valor == 12){
  253. mao_string[aux] = 'J';
  254. }
  255. else if(outra_mao.carta[i].valor == 13){
  256. mao_string[aux] = 'K';
  257. }
  258. else if(outra_mao.carta[i].valor == 14){
  259. mao_string[aux] = 'A';
  260. }
  261. mao_string[aux+1] = (char) outra_mao.carta[i].naipe + '0';
  262. }else{
  263. mao_string[aux] = (char) outra_mao.carta[i].valor + '0';
  264. mao_string[aux+1] = (char) outra_mao.carta[i].naipe + '0';
  265. }
  266. aux+=2;
  267. }
  268. mao_string[8] = '\0';
  269. }
  270. void escreve_aposta_atual(char *mao_string, struct Player *jogador){
  271. int pot_aux[4], i, j;
  272. for(j=0;j<4;j++)
  273. pot_aux[j] = jogador[j].aposta_atual;
  274. for(i=0;i<4;i++){
  275. for(j=0;j<4;j++){
  276. mao_string[(57-i*4)-j] = (char) ((pot_aux[3-i] % 10) + '0');
  277. pot_aux[3-i] = pot_aux[3-i] / 10;
  278. }
  279. }
  280. mao_string[58] = '\0';
  281. }
  282. void recebe_aposta_atual(char *buf, struct Player *jogador){
  283. int i=0, j, aux = 26;
  284. for(i=0;i<4;i++){
  285. jogador[i].aposta_atual = char_to_int(buf,42+i*4,(42+(i+1)*4)-1);
  286. // printf("aposta_atual[i] = %d\n",aposta_atual[i]);
  287. }
  288. }
  289. // transcribe the player's state to a string mode //
  290. void escreve_estado(char *mao_string, struct Player *jogador){
  291. mao_string[18] = (char) jogador[0].estado_atual + '0';
  292. mao_string[19] = (char) jogador[1].estado_atual + '0';
  293. mao_string[20] = (char) jogador[2].estado_atual + '0';
  294. mao_string[21] = (char) jogador[3].estado_atual + '0';
  295. mao_string[22] = '\0';
  296. }
  297. int char_to_int(char *string, int inicio, int fim){
  298. char buff[MESG_SIZE], i = 0, j;
  299. for(j=inicio;j<=fim;j++){
  300. buff[i] = string[j];
  301. i++;
  302. }
  303. buff[i] = '\0';
  304. return atoi(buff);
  305. }
  306. // transcribe the main pot and the player's pot to a string mode //
  307. void escreve_pot(char *mao_string, int pot, struct Player *jogador){
  308. int pot_aux[4];
  309. int i=0, j, aux = 26;
  310. for(j=0;j<4;j++){
  311. pot_aux[j] = jogador[j].pot;
  312. // printf("pot do jogador %d: %d\n",j,jogador[j].pot);
  313. }
  314. while(i < 4){
  315. mao_string[25-i] = (char) ((pot % 10) + '0');
  316. pot = pot/10;
  317. i++;
  318. }
  319. for(i=0;i<4;i++){
  320. for(j=0;j<4;j++){
  321. mao_string[(41-i*4)-j] = (char) ((pot_aux[3-i] % 10) + '0');
  322. pot_aux[3-i] = pot_aux[3-i] / 10;
  323. }
  324. }
  325. }
  326. void recebe_pot(char *buf, int *pot_mesa, struct Player *jogador){
  327. int i=0, j, aux = 26;
  328. *pot_mesa = char_to_int(buf,22,25);
  329. for(i=0;i<4;i++){
  330. jogador[i].pot = char_to_int(buf,26+i*4,(26+(i+1)*4)-1);
  331. }
  332. }
  333. // transcribe a string to a player's state mode //
  334. void recebe_estado(char *buf, struct Player *jogador){
  335. jogador[0].estado_atual = (int) buf[18] - '0';
  336. jogador[1].estado_atual = (int) buf[19] - '0';
  337. jogador[2].estado_atual = (int) buf[20] - '0';
  338. jogador[3].estado_atual = (int) buf[21] - '0';
  339. }
  340. // transcribe a string to a desk of cards mode //
  341. void recebe_mesa(char *buf, struct Mesa *mesa){
  342. int i, aux = 8;
  343. for(i=0;i<5;i++){
  344. if(buf[aux] > '9'){
  345. if(buf[aux] == 'D'){
  346. mesa->carta[i].valor = 10;
  347. }
  348. else if(buf[aux] == 'Q'){
  349. mesa->carta[i].valor = 11;
  350. }
  351. else if(buf[aux] == 'J'){
  352. mesa->carta[i].valor = 12;
  353. }
  354. else if(buf[aux] == 'K'){
  355. mesa->carta[i].valor = 13;
  356. }
  357. else if(buf[aux] == 'A'){
  358. mesa->carta[i].valor = 14;
  359. }
  360. mesa->carta[i].naipe = (int) buf[aux+1] - '0';
  361. }else{
  362. mesa->carta[i].valor = (int) buf[aux] - '0';
  363. mesa->carta[i].naipe = (int) buf[aux+1] - '0';
  364. }
  365. aux+=2;
  366. }
  367. }
  368. // transcribe a string to a player's hand mode //
  369. void recebe_mao(char *buf, struct Player *jogador, int player_number){
  370. int i, aux = 4;
  371. for(i=0;i<2;i++){
  372. if(buf[aux] > '9'){
  373. if(buf[aux] == 'D'){
  374. jogador[player_number].mao.carta[i].valor = 10;
  375. }
  376. else if(buf[aux] == 'Q'){
  377. jogador[player_number].mao.carta[i].valor = 11;
  378. }
  379. else if(buf[aux] == 'J'){
  380. jogador[player_number].mao.carta[i].valor = 12;
  381. }
  382. else if(buf[aux] == 'K'){
  383. jogador[player_number].mao.carta[i].valor = 13;
  384. }
  385. else if(buf[aux] == 'A'){
  386. jogador[player_number].mao.carta[i].valor = 14;
  387. }
  388. jogador[player_number].mao.carta[i].naipe = (int) buf[aux+1] - '0';
  389. }else{
  390. jogador[player_number].mao.carta[i].valor = (int) buf[aux] - '0';
  391. jogador[player_number].mao.carta[i].naipe = (int) buf[aux+1] - '0';
  392. }
  393. aux+=2;
  394. }
  395. }
  396. // copies one vector to another //
  397. void copia_vetor(struct Player *jogador){
  398. int i;
  399. for(i=0;i<4;i++)
  400. jogador[i].aposta_anterior = jogador[i].aposta_atual;
  401. }
  402. // increments the counter that can goes from 0 to 3 //
  403. void count_to_four(int *a){
  404. (*a)++;
  405. if(*a == 4)
  406. *a = 0;
  407. }
  408. // shows 'n' cards of the desk //
  409. void show_desk(struct Mesa *mesa, int n){
  410. int i;
  411. for(i=0;i<n;i++)
  412. mesa->carta[i].visivel = 1;
  413. }
  414. // iniciates the turn
  415. int iniciate_turn(int *rodada, struct Jogo *jogo, int *first_turn){
  416. int i;
  417. *rodada = 0;
  418. jogo->fim_turno = 0;
  419. *first_turn = 0;
  420. for(i=0;i<5;i++)
  421. jogo->mesa.carta[i].visivel = 0;
  422. jogo->pot_mesa = 0;
  423. }
  424. // check to see if it's the end of a turn //
  425. int check_end_turn(struct Player *jogador){
  426. int i = 0,cont_a = 0,cont_b = 0, cont_c = 0, ant_bet = 0, aux_i;
  427. while(i<4){
  428. if(ant_bet == jogador[i].aposta_atual)
  429. cont_c++;
  430. ant_bet = jogador[i].aposta_atual;
  431. if(jogador[i].estado_atual == PAY)
  432. cont_a++;
  433. else if(jogador[i].estado_atual == BET){
  434. cont_b++;
  435. }
  436. i++;
  437. }
  438. if(((cont_a == 3) && (cont_b == 1)) && (cont_c == 3))
  439. return 1;
  440. i = 0;
  441. cont_a = 0;
  442. while(i<4){
  443. if(jogador[i].estado_atual == FOLD)
  444. cont_a++;
  445. i++;
  446. }
  447. if(cont_a == 3)
  448. return 1;
  449. i = 0;
  450. while(i<4){
  451. if((jogador[i].estado_atual == WAIT) || (jogador[i].estado_atual == PAY) || (jogador[i].estado_atual == BET))
  452. return 0;
  453. i++;
  454. }
  455. return 1;
  456. }
  457. // set 0 at the current bets
  458. void zera_aposta_atual(struct Player *jogador){
  459. int i;
  460. for(i=0;i<4;i++)
  461. jogador[i].aposta_atual = 0;
  462. }
  463. // set 0 at the current states, exept if the state is FOLD
  464. void zera_estado_atual(struct Player *jogador){
  465. int i;
  466. for(i=0;i<4;i++)
  467. if(jogador[i].estado_atual != FOLD)
  468. jogador[i].estado_atual = WAIT;
  469. }
  470. void ordena_cartas(struct Combinacao_Carta *combinacao, int n){
  471. int i,j;
  472. for(j=0;j<7;j++){
  473. for(i=0;i<7;i++){
  474. if(i != 6)
  475. if(combinacao[n].carta[i].valor > combinacao[n].carta[i+1].valor){
  476. Carta aux;
  477. aux = combinacao[n].carta[i];
  478. combinacao[n].carta[i] = combinacao[n].carta[i+1];
  479. combinacao[n].carta[i+1] = aux;
  480. }
  481. }
  482. }
  483. }
  484. void verifica_combinacao(struct Combinacao_Carta *combinacao, int n){
  485. int i, contador = 1, maior = 0, j, full_house_n = 0;
  486. ordena_cartas(combinacao, n);
  487. // check to se if the hand is a straight flush
  488. contador = 1; maior = 0;
  489. for(i=6;i>0;i--){
  490. if((combinacao[n].carta[i].naipe == combinacao[n].carta[i-1].naipe) && (combinacao[n].carta[i].valor == combinacao[n].carta[i-1].valor - 1)){
  491. if(combinacao[n].carta[i].valor > maior)
  492. maior = combinacao[n].carta[i].valor;
  493. contador++;
  494. if(contador == 5){
  495. printf("It's a STRAIGHT FLUSH\n");
  496. combinacao[n].tipo = straight_flush;
  497. combinacao[n].valor = maior;
  498. return;
  499. }
  500. }
  501. else{
  502. contador = 1;
  503. maior = 0;
  504. }
  505. }
  506. // check to see if the hand is a four of kind
  507. contador = 1; maior = 0;
  508. for(i=6;i>0;i--){
  509. if(combinacao[n].carta[i].valor == combinacao[n].carta[i-1].valor){
  510. contador++;
  511. if(contador == 4){
  512. printf("It's a FOUR OF KIND\n");
  513. combinacao[n].tipo = four_of_kind;
  514. combinacao[n].valor = combinacao[n].carta[i+2].valor;
  515. return;
  516. }
  517. }
  518. else
  519. contador = 1;
  520. }
  521. // check to see if the hand is a full house CHECAR MAIOR
  522. int valor_usado, tem_three_kind = 0;
  523. contador = 1; maior = 0;
  524. for(i=6;i>0;i--){
  525. if(combinacao[n].carta[i].valor == combinacao[n].carta[i-1].valor){
  526. contador++;
  527. if(contador == 3){
  528. valor_usado = combinacao[n].carta[i].valor;
  529. tem_three_kind = 1;
  530. }
  531. }
  532. else
  533. contador = 1;
  534. }
  535. contador = 1;
  536. for(i=6;i>0;i--){
  537. if((combinacao[n].carta[i].valor == combinacao[n].carta[i-1].valor) && (combinacao[n].carta[i].valor != valor_usado)){
  538. contador++;
  539. if(contador == 2){
  540. full_house_n = 1;
  541. if((full_house_n == 1) && (tem_three_kind == 1)){
  542. printf("It's a FULL HOUSE\n");
  543. combinacao[n].tipo = full_house;
  544. combinacao[n].valor = valor_usado;
  545. return;
  546. }
  547. }
  548. }
  549. else
  550. contador = 1;
  551. }
  552. // check to se if the hand is a flush
  553. contador = 1; maior = 0;
  554. for(i=6;i>0;i--){
  555. if(combinacao[n].carta[i].naipe == combinacao[n].carta[i-1].naipe){
  556. contador++;
  557. if(contador == 5){
  558. printf("It's a FLUSH\n");
  559. combinacao[n].tipo = flush;
  560. combinacao[n].valor = maior;
  561. return;
  562. }
  563. }
  564. else{
  565. contador = 1;
  566. maior = 0;
  567. }
  568. }
  569. // check to see if the hand is a straight
  570. contador = 1; maior = 0;
  571. for(i=6;i>0;i--){
  572. if(combinacao[n].carta[i].valor == combinacao[n].carta[i-1].valor + 1){
  573. contador++;
  574. if(contador == 5){
  575. printf("It's a STRAIGHT\n");
  576. combinacao[n].tipo = straight;
  577. combinacao[n].valor = combinacao[n].carta[i+3].valor;
  578. return;
  579. }
  580. }
  581. else
  582. contador = 1;
  583. }
  584. // check to see if the hand is a three of kind
  585. contador = 1; maior = 0;
  586. for(i=6;i>0;i--){
  587. if(combinacao[n].carta[i].valor == combinacao[n].carta[i-1].valor){
  588. contador++;
  589. if(contador == 3){
  590. printf("It's a THREE OF KIND\n");
  591. combinacao[n].tipo = three_of_kind;
  592. combinacao[n].valor = combinacao[n].carta[i+1].valor;
  593. return;
  594. }
  595. }
  596. else
  597. contador = 1;
  598. }
  599. // check to see if the hand is a two pair CHECAR MAIOR
  600. contador = 1; maior = 0;
  601. int n_pair = 0;
  602. for(i=6;i>0;i--){
  603. if(combinacao[n].carta[i].valor == combinacao[n].carta[i-1].valor){
  604. contador++;
  605. if(contador == 2){
  606. if(maior < combinacao[n].carta[i].valor)
  607. maior = combinacao[n].carta[i].valor;
  608. n_pair++;
  609. if(n_pair == 2){
  610. printf("It's a TWO PAIR\n");
  611. combinacao[n].tipo = two_pair;
  612. combinacao[n].valor = maior;
  613. return;
  614. }
  615. }
  616. }
  617. else{
  618. contador = 1;
  619. }
  620. }
  621. // check to see if the hand is a one pair
  622. contador = 1; maior = 0;
  623. for(i=6;i>0;i--){
  624. if(combinacao[n].carta[i].valor == combinacao[n].carta[i-1].valor){
  625. contador++;
  626. if(contador == 2){
  627. printf("It's a ONE PAIR\n");
  628. combinacao[n].tipo = one_pair;
  629. combinacao[n].valor = combinacao[n].carta[i].valor;
  630. return;
  631. }
  632. }
  633. else
  634. contador = 1;
  635. }
  636. // retorna a maior carta
  637. maior = 0;
  638. for(i=6;i>-1;i--){
  639. if(combinacao[n].carta[i].valor > maior)
  640. maior = combinacao[n].carta[i].valor;
  641. }
  642. printf("It's a HIGHER CARD\n");
  643. combinacao[n].tipo = 0;
  644. combinacao[n].valor = maior;
  645. }
  646. int check_end_game(struct Player *jogador){
  647. int i, cont = 0, buff;
  648. for(i=0;i<4;i++)
  649. if(jogador[i].pot == 0)
  650. cont++;
  651. else
  652. buff = i;
  653. if(cont == 3)
  654. return buff;
  655. return 0;
  656. }
  657. // check to see who is the winner //
  658. int check_winner(struct Mesa mesa, struct Player *jogador, int pot_mesa){
  659. int i, j;
  660. Combinacao_Carta combinacao[4];
  661. for(i=0;i<4;i++){
  662. for(j=0;j<2;j++){
  663. combinacao[i].carta[j] = jogador[i].mao.carta[j];
  664. }
  665. for(j=0;j<5;j++){
  666. combinacao[i].carta[j+2] = mesa.carta[j];
  667. }
  668. verifica_combinacao(combinacao, i);
  669. printf("Combination %d: ",i);
  670. printf("Kind: %d Value: %d\n",combinacao[i].tipo, combinacao[i].valor);
  671. // for(j=0;j<7;j++)
  672. // printf("Carta %d: %d %d\n",j+1,combinacao[i].carta[j].valor,combinacao[i].carta[j].naipe);
  673. // printf("\n");
  674. getchar();
  675. }
  676. Combinacao_Carta maior;
  677. int winner;
  678. maior.tipo = 0;
  679. maior.valor = 0;
  680. for(i=3;i>-1;i--){
  681. if((combinacao[i].tipo > maior.tipo) && (jogador[i].estado_atual != 4)){
  682. maior = combinacao[i];
  683. winner = i;
  684. }
  685. else if((combinacao[i].tipo == maior.tipo) && (jogador[i].estado_atual != 4)){
  686. if(combinacao[i].valor > maior.valor){
  687. maior = combinacao[i];
  688. winner = i;
  689. }
  690. }
  691. }
  692. return winner;
  693. }
  694. // shows the screen of the game to the players who's not in turn //
  695. void game_screen_play(struct Player *jogador, struct Jogo *jogo, int player_number){
  696. int i;
  697. system("clear");
  698. printf("I'm the player: %d\n",player_number);
  699. printf("Main pot: %d\n",jogo->pot_mesa);
  700. for(i=0;i<4;i++)
  701. printf("Player %d State %d Pot %d Current bet %d\n",i,jogador[i].estado_atual,jogador[i].pot,jogador[i].aposta_atual);
  702. printf("\n");
  703. mostra_mao(jogador[player_number].mao);
  704. mostra_mesa(jogo->mesa);
  705. printf("\nPlayer's turn: %d\n",jogo->player_turn);
  706. printf("\nDo your move.\n");
  707. }
  708. // shows the screen of the game to the player who's in turn //
  709. void game_screen_wait(struct Player *jogador, struct Jogo *jogo, int player_number){
  710. int i;
  711. system("clear");
  712. printf("I'm the player: %d\n",player_number);
  713. printf("Main pot: %d\n",jogo->pot_mesa);
  714. for(i=0;i<4;i++)
  715. printf("Player %d State %d Pot %d Current bet %d\n",i,jogador[i].estado_atual,jogador[i].pot,jogador[i].aposta_atual);
  716. printf("\n");
  717. mostra_mao(jogador[player_number].mao);
  718. mostra_mesa(jogo->mesa);
  719. printf("\nPlayer's turn: %d\n",jogo->player_turn);
  720. printf("\nWaiting for the player %d...\n\n",jogo->player_turn);
  721. }
  722. // execute the player's turn //
  723. int jogada(char *message, int player_number, struct Jogo *jogo, struct Player *jogador){
  724. int opcao, aposta = 0, i = player_number, cobrir = 0, jogada_valida = 0;
  725. char op[512];
  726. if(jogador[player_number].estado_atual != 4){
  727. do{
  728. i = player_number;
  729. do{
  730. printf("1-CHECK 2-BET 3-PAY 4- FOLD\n");
  731. printf("option: ");
  732. scanf("%s",op);
  733. } while (!(op[0]>'0' && op[0]<'5' && strlen(op)<3));
  734. opcao = atoi(op);
  735. if(opcao == 1){
  736. do{
  737. if(i == 0)
  738. i = 3;
  739. else
  740. i--;
  741. }while((jogador[i].estado_atual != 2) && (i != player_number));
  742. if(i == player_number)
  743. jogada_valida = 1;
  744. else{
  745. printf("To continue you have to cover the bet or give up.\n");
  746. getchar();
  747. }
  748. }
  749. if(opcao == 2){
  750. printf("bet(1-1000): ");
  751. scanf("%d",&aposta);
  752. do{
  753. if(i == 0)
  754. i = 3;
  755. else
  756. i--;
  757. }while((jogador[i].estado_atual != 2) && (i != player_number));
  758. if(i != player_number){
  759. if(aposta + jogador[i].aposta_atual <= jogador[player_number].pot){
  760. jogo->pot_mesa = jogo->pot_mesa + (jogador[i].aposta_atual + aposta);
  761. jogador[player_number].pot = jogador[player_number].pot - (aposta + jogador[i].aposta_atual - jogador[player_number].aposta_atual);
  762. jogador[player_number].aposta_atual = jogador[i].aposta_atual + aposta;
  763. jogada_valida = 1;
  764. } else {
  765. printf("You don't have money enough to bet.\n");
  766. getchar();
  767. }
  768. }else{
  769. if(aposta <= jogador[player_number].pot){
  770. jogo->pot_mesa = jogo->pot_mesa + aposta;
  771. jogador[player_number].pot = jogador[player_number].pot - aposta;
  772. jogador[player_number].aposta_atual = aposta;
  773. jogada_valida = 1;
  774. } else {
  775. printf("You don't have money enough to bet.\n");
  776. getchar();
  777. }
  778. }
  779. }
  780. if(opcao == 3){
  781. do{
  782. if(i == 0)
  783. i = 3;
  784. else
  785. i--;
  786. }while((jogador[i].estado_atual != 2) && (i != player_number));
  787. if(i != player_number){
  788. jogo->pot_mesa = jogo->pot_mesa + (jogador[i].aposta_atual - jogador[player_number].aposta_atual);
  789. jogador[player_number].pot = jogador[player_number].pot - (jogador[i].aposta_atual - jogador[player_number].aposta_atual);
  790. jogador[player_number].aposta_atual = jogador[player_number].aposta_atual + (jogador[i].aposta_atual - jogador[player_number].aposta_atual);
  791. jogada_valida = 1;
  792. }else{
  793. printf("You can only pay if someone makes a bet.\n");
  794. getchar();
  795. }
  796. }
  797. if(opcao == 4)
  798. jogada_valida = 1;
  799. }while(jogada_valida == 0);
  800. jogador[player_number].estado_atual = opcao;
  801. for(i=0;i<4;i++)
  802. message[18+i] = (char) jogador[i].estado_atual + '0';
  803. escreve_pot(message,jogo->pot_mesa,jogador);
  804. escreve_aposta_atual(message, jogador);
  805. }else{
  806. for(i=0;i<4;i++)
  807. message[18+i] = (char) jogador[i].estado_atual + '0';
  808. escreve_pot(message,jogo->pot_mesa,jogador);
  809. escreve_aposta_atual(message, jogador);
  810. printf("You're in FOLD this round.\n");
  811. }
  812. }
  813. // deal the cards to the other players
  814. void deal_cards(struct Jogo *jogo, struct Player *jogador, int player_number , int first_turn, char *mao_string, char *message, struct sockaddr_in *si_other, int s, int port_client, int *recv_len, char *buf, int *slen, char *server_ip){
  815. printf("Dealing the cards...Press any key\n");
  816. getchar();
  817. inicia_baralho(&(jogo->baralho));
  818. jogador[0].estado_atual = 0;
  819. jogador[1].estado_atual = 0;
  820. jogador[2].estado_atual = 0;
  821. jogador[3].estado_atual = 0;
  822. jogador[player_number].mao = seleciona_mao(&(jogo->baralho));
  823. jogo->mesa = seleciona_mesa(&(jogo->baralho));
  824. int i = player_number - 1;
  825. while(player_number != i){ // manda uma mensagem para cada dos outros jogaores
  826. if((i >= 0) && (i <= 3)){
  827. do{
  828. jogador[i].mao = seleciona_mao(&(jogo->baralho));
  829. escreve_mao(jogador[i].mao, mao_string);
  830. escreve_mesa(jogo->mesa, mao_string);
  831. escreve_estado(mao_string, jogador);
  832. if(first_turn)
  833. iniciate_pot(jogador);
  834. escreve_pot(mao_string, jogo->pot_mesa, jogador);
  835. jogador[0].aposta_atual = 0;
  836. jogador[1].aposta_atual = 0;
  837. jogador[2].aposta_atual = 0;
  838. jogador[3].aposta_atual = 0;
  839. escreve_aposta_atual(mao_string, jogador);
  840. strcpy(message, mao_string);
  841. message[2] = 'a';
  842. message[3] = '2';
  843. message[0] = player_number + '0';
  844. message[1] = i + '0';
  845. printf("Message to be sent: %s\n\n",message);
  846. // iniciate_pot(jogador);
  847. copia_vetor(jogador);
  848. jogo->pot_mesa_ant = jogo->pot_mesa;
  849. }while((envia_mesg(si_other, s, message, port_client, recv_len, buf, slen,server_ip) == 0) && (i < 4));
  850. }
  851. if(i == -1)
  852. i = 4;
  853. else
  854. i--;
  855. }
  856. }
  857. // recieve the cards from the dealer
  858. recieve_cards(struct sockaddr_in *si_other, int s, char *message, int port_client, int *recv_len, char *buf, int *slen, int player_number, struct Jogo *jogo, struct Player *jogador, char *server_ip){
  859. printf("Waiting the dealer to finish...\n");
  860. int recebida = 0;
  861. char destino_ant = 'p';
  862. while(recebida < 3){
  863. if(receba_mesg(si_other, s, message, port_client, recv_len, buf, slen, player_number,server_ip)){
  864. if(buf[3] == '2'){
  865. // printf("mensagem recebida: %s\n",buf);
  866. // getchar();
  867. recebe_mao(buf, jogador, player_number);
  868. recebe_mesa(buf, &(jogo->mesa));
  869. recebe_estado(buf, jogador);
  870. recebe_pot(buf,&(jogo->pot_mesa),jogador);
  871. recebe_aposta_atual(buf, jogador);
  872. if(buf[1] != destino_ant)
  873. recebida++;
  874. }
  875. }
  876. else if((buf[1] != destino_ant) || (buf[3] == '1')){
  877. recebida++;
  878. // printf("buf[1] = %c e destino_ant = %c\n",buf[1],destino_ant);
  879. // getchar();
  880. }
  881. destino_ant = buf[1];
  882. }
  883. }
  884. //------// Main //------//
  885. int main(int argc, char **argv){
  886. // declarations to the poker game
  887. Player jogador[4];
  888. Jogo jogo;
  889. int player_number, i;
  890. char mao_string[MESG_SIZE] = "00000000";
  891. memset(jogador,0,sizeof(jogador));
  892. // declarations to the sockets
  893. struct sockaddr_in si_me, si_other;
  894. int s, slen = sizeof(si_other) , recv_len, port_server, port_client;
  895. char buf[MESG_SIZE], message[MESG_SIZE], server_ip[20];
  896. if(!testa_argumentos(argc, argv, &player_number, server_ip))
  897. return 0;
  898. seleciona_portas(&port_server, &port_client, player_number);
  899. if(!setup_socket(&s, &si_me, &si_other, port_server, port_client, server_ip))
  900. return 0;
  901. // iniciates the game
  902. printf("Iniciating Poker!\n");
  903. int first_turn = 1;
  904. jogo.fim_jogo = 0;
  905. jogo.fim_turno = 0;
  906. jogo.fim_rodada = 0;
  907. jogo.dealer = 0;
  908. while(!jogo.fim_jogo){
  909. jogo.player_turn = 0;
  910. if(player_number == jogo.dealer){ // se o jogador for o dealer ele prepara as cartas
  911. deal_cards(&jogo, jogador, player_number , first_turn++, mao_string, message, &si_other, s, port_client, &recv_len, buf, &slen, server_ip);
  912. }else{ // caso o jogador nao seja o dealer ele aguarda as cartas serem dadas
  913. recieve_cards(&si_other, s, message, port_client, &recv_len, buf, &slen, player_number, &jogo, jogador, server_ip);
  914. }
  915. int rodada;
  916. iniciate_turn(&rodada, &jogo, &first_turn); // iniciates the turn
  917. while(!jogo.fim_turno){ // beggining of the round
  918. jogo.fim_rodada = 0;
  919. if(rodada == 1) // se for a primeira rodada
  920. show_desk(&(jogo.mesa), 3);
  921. else if(rodada == 2) // se for a segunda rodada
  922. show_desk(&(jogo.mesa), 4);
  923. else if(rodada == 3) // se for a terceira rodada
  924. show_desk(&(jogo.mesa), 5);
  925. else if(rodada == 4){ // se for a quarta rodada
  926. if(player_number == jogo.dealer){
  927. message[3] = (int) check_winner(jogo.mesa, jogador, jogo.pot_mesa) + '0';
  928. envia_todos(&player_number,message,&si_other,s,port_client,&recv_len,buf,&slen,server_ip);
  929. printf("CHECK WHO WON\n");
  930. printf("The winner is: %c\n",message[3]);
  931. jogador[(int) message[3] - '0'].pot = jogador[(int) message[3] - '0'].pot + jogo.pot_mesa;
  932. // getchar();
  933. }else{
  934. int recebi = 0, winner;
  935. char destino_ant = 'p';
  936. printf("Waiting for the dealer to tell who won.\n");
  937. while(recebi < 3){
  938. if(receba_mesg(&si_other, s, message, port_client, &recv_len, buf, &slen, player_number,server_ip)){
  939. winner = (int) buf[3] - '0';
  940. if(buf[1] != destino_ant)
  941. recebi++;
  942. }
  943. else if((buf[1] != destino_ant) || (buf[3] == '1'))
  944. recebi++;
  945. destino_ant = buf[1];
  946. }
  947. printf("The winner is: %d\n",winner);
  948. jogador[winner].pot = jogador[winner].pot + jogo.pot_mesa;
  949. // getchar();
  950. }
  951. jogo.fim_turno = 1;
  952. jogo.fim_rodada = 1;
  953. }
  954. zera_estado_atual(jogador);
  955. zera_aposta_atual(jogador);
  956. while(!jogo.fim_rodada){
  957. if(jogo.player_turn == player_number){ // caso a vez seja deste jogador
  958. while(jogo.player_turn == player_number){
  959. game_screen_play(jogador, &jogo, player_number);
  960. strcpy(message,"xxx0xxxxxxxxxxxxxxxxxxx");
  961. jogada(message, player_number, &jogo, jogador);
  962. getchar();
  963. envia_todos(&player_number,message,&si_other,s,port_client,&recv_len,buf,&slen,server_ip);
  964. count_to_four(&(jogo.player_turn));
  965. }
  966. if(check_end_turn(jogador) == 1){
  967. rodada++;
  968. jogo.fim_rodada = 1;
  969. }
  970. }else{ // caso a vez seja de outro jogador
  971. int recebi = 0;
  972. char destino_ant = 'p';
  973. while(recebi < 3){
  974. game_screen_wait(jogador, &jogo, player_number);
  975. // se for para o proprio jogador ele reage a tal mensagem
  976. if(receba_mesg(&si_other, s, message, port_client, &recv_len, buf, &slen, player_number,server_ip)){
  977. if(buf[3] == '0'){
  978. recebe_estado(buf, jogador);
  979. copia_vetor(jogador);
  980. jogo.pot_mesa_ant = jogo.pot_mesa;
  981. recebe_pot(buf, &(jogo.pot_mesa), jogador);
  982. recebe_aposta_atual(buf, jogador);
  983. count_to_four(&(jogo.player_turn));
  984. if(buf[1] != destino_ant)
  985. recebi++;
  986. }
  987. }
  988. else if((buf[1] != destino_ant) || (buf[3] == '1'))
  989. recebi++;
  990. destino_ant = buf[1];
  991. }
  992. if(check_end_turn(jogador) == 1){
  993. rodada++;
  994. jogo.fim_rodada = 1;
  995. }
  996. }
  997. }
  998. // fim da rodada
  999. }
  1000. // fim do turno
  1001. count_to_four(&(jogo.dealer));
  1002. jogo.fim_jogo = check_end_game(jogador);
  1003. }
  1004. printf("End of game. The winner is: %d\n",jogo.fim_jogo);
  1005. // fim do jogo
  1006. }