Guest User

Joc Domino

a guest
Mar 6th, 2014
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 16.47 KB | None | 0 0
  1. /*##############################################################################
  2. # Alumne: Octavi Allué Fonoll (1224997)                                        #
  3. # Alumne: Juan Manuel Gómez Cruz (1201881)                                     #
  4. # Data: 09/05/09 14:02                                                         #
  5. # Descripció: El joc del dominó, projecte final de MTP1                        #
  6. ##############################################################################*/
  7.  
  8. /* Llibrerires utilitzades                                                    */
  9.  
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13.  
  14. /* Constants definides                                                        */
  15.  
  16. #define MAX_JUGADORS 4
  17.  
  18. /* Estructures de dades                                                       */
  19.  
  20. typedef enum {
  21.     FITXA_VERTICAL = 0,
  22.     FITXA_DRETA = 1,
  23.     FITXA_ESQUERRA = 2
  24. } ePosicio;
  25.  
  26. typedef enum {
  27.     ESQUERRA = 0,
  28.     DRETA = 1
  29. } eCostat;
  30.  
  31. typedef struct {
  32.     int superior, inferior;
  33.     ePosicio pos;
  34. } tFitxa;
  35.  
  36. typedef struct stNode {
  37.     tFitxa info;
  38.     struct stNode *seg;
  39. } tNode;
  40.  
  41. typedef struct {
  42.     tNode *cap;
  43. } tPila;
  44.  
  45. typedef struct {
  46.     tNode *esquerra, *dreta;
  47. } tPartida;
  48.  
  49. typedef struct {
  50.     tNode *primer;
  51. } tLlista;
  52.  
  53. typedef struct {
  54.     char nom[50];
  55.     int actiu;
  56.     tNode *fitxes;
  57. } tJugador;
  58.  
  59. /* Altres funcions                                                            */
  60.  
  61. void intercanvia (char *a, char *b, int length) {
  62.     char *aux;
  63.     int i;
  64.     aux = (char*) malloc (length);
  65.     for (i = 0; i < length; ++i) {
  66.         aux[i] = a[i];
  67.         a[i] = b[i];
  68.         b[i] = aux[i];
  69.     }
  70.     free(aux);
  71. }
  72.  
  73. /* Procediments i funcions per el tractament d'estructures de dades           */
  74.  
  75. void iniciarPila (tPila *p) {
  76.     /* Inicia la pila */
  77.     p->cap = NULL;
  78. }
  79.  
  80. int esBuidaPila (tPila *p) {
  81.     return(p->cap == NULL);
  82. }
  83.  
  84. int push (tPila *p, tNode x) {
  85.     /* Insereix un node a la pila */
  86.     tNode *q;
  87.     q = (tNode*) malloc (sizeof(tNode));
  88.     if (q != NULL) {
  89.         q->info.superior = x.info.superior;
  90.         q->info.inferior = x.info.inferior;
  91.         q->info.pos = x.info.pos;
  92.         q->seg = p->cap;
  93.         p->cap = q;
  94.     }
  95.     return(q != NULL);
  96. }
  97.  
  98. tNode pop (tPila *p) {
  99.     /* Retorna el node superior de la pila i lliberar memòria */
  100.     tNode *q;
  101.     tNode x;
  102.     q = p->cap;
  103.     x.info.superior = q->info.superior;
  104.     x.info.inferior = q->info.inferior;
  105.     x.info.pos = q->info.pos;
  106.     p->cap = p->cap->seg;
  107.     free(q);
  108.     return(x);
  109. }
  110.  
  111. void iniciarLlista (tNode **llista) {
  112.     /* Inicia la llista */
  113.     (*llista) = NULL;
  114. }
  115.  
  116. void primerLlista (tNode **iterador, tNode *llista) {
  117.     /* Col·loca l'iterador de la llista en primera posició de la llista */
  118.     (*iterador) = llista;
  119. }
  120.  
  121. void seguentLlista (tNode *llista, tNode **iterador) {
  122.     /* Avança l'iterador de la llista una posició */
  123.     if ((*iterador) != NULL) {
  124.         (*iterador) = (*iterador)->seg;
  125.     }
  126. }
  127.  
  128. int inserirLlista (tNode **llista, tNode *iterador, tNode x) {
  129.     /* Insereix a la llista el node x */
  130.     tNode *q;
  131.     q = (tNode*) malloc (sizeof(tNode));
  132.     if (q != NULL) {
  133.         q->info.superior = x.info.superior;
  134.         q->info.inferior = x.info.inferior;
  135.         q->info.pos = x.info.pos;
  136.         if (iterador == NULL) { /* Insereix en primera posició */
  137.             q->seg = (*llista);
  138.             (*llista) = q;      
  139.         }
  140.         else { /* Insereix en la posició següent a l'iterador */
  141.             q->seg = iterador->seg;
  142.             iterador->seg = q;
  143.         }
  144.     }
  145.     return(q != NULL);
  146. }
  147.  
  148. void eliminarLlista (tNode **llista, tNode *iterador, tNode *x) {
  149.     /* Treu de la llista el node següent a l'apuntat per l'iterador */
  150.     tNode *q;
  151.     if (iterador == NULL) { /* Elimina el primer node de la llista */
  152.         q = (*llista);
  153.         (*llista) = (*llista)->seg;
  154.     }
  155.     else {
  156.         q = iterador->seg;
  157.         iterador->seg = q->seg;
  158.     }
  159.     *x = *q;
  160.     free(q);
  161. }
  162.  
  163. tNode elementLlista (tNode *iterador) {
  164.     /* Selecciona un element de la llista */
  165.     tNode x;
  166.     x.info.superior = iterador->info.superior;
  167.     x.info.inferior = iterador->info.inferior;
  168.     x.info.pos = iterador->info.pos;
  169.     return(x);
  170. }
  171.  
  172. int esBuidaLlista (tNode *llista) {
  173.     return(llista == NULL);
  174. }
  175.  
  176. /* Funcions pròpies del joc                                                   */
  177.  
  178. void introduir_jugadors (tJugador *jugador) {
  179.     int nJugadors;
  180.     int i;
  181.     char n[50];
  182.     printf("Introdueix el nombre de jugadors que juga la partida: ");
  183.     scanf("%d", &nJugadors); printf("\n");
  184.     while (nJugadors > MAX_JUGADORS || nJugadors <= 1) {
  185.         printf("El nombre de jugadors permesos es d'entre 2 i 4.\n");
  186.         printf("Introdueix el nombre de jugadors que juga la partida: ");
  187.         scanf("%d", &nJugadors); printf("\n");
  188.     }
  189.     i = 0;
  190.     while (i < nJugadors) {
  191.         printf("Escriu el nom del jugador %d: ", i+1);
  192.         scanf("%s", n);
  193.         strcpy(jugador[i].nom, n);
  194.         jugador[i].actiu = 1;
  195.         iniciarLlista(&jugador[i].fitxes);
  196.         i++;
  197.     }
  198.     printf("\n");
  199.     while (i < MAX_JUGADORS-1) {
  200.         strcpy(jugador[i].nom, "");
  201.         jugador[i].actiu = 0;
  202.         iniciarLlista(&jugador[i].fitxes);
  203.         i++;
  204.     }
  205. }
  206.  
  207. tPila obtenir_fitxes_barrejades () {
  208.     tPila fitxesDisponibles;
  209.     FILE *z;
  210.     char fitxer[50], c;
  211.     tNode x;
  212.     int sup, inf;
  213.     printf("Introdueix el nom del fitxer que conte les fitxes: ");
  214.     scanf("%s", fitxer); printf("\n");
  215.     while ((z = fopen(fitxer, "r")) == NULL) {
  216.         printf("El fitxer no existeix, introdueix el nom d'un fitxer valid: ");
  217.         scanf("%s", fitxer); printf("\n");
  218.     }
  219.     iniciarPila(&fitxesDisponibles);
  220.     while (!feof(z)) {
  221.         fscanf(z, "%d", &sup);
  222.         fscanf(z, "%c", &c);
  223.         fscanf(z, "%d", &inf);
  224.         fscanf(z, "%c", &c);
  225.         x.info.superior = sup;
  226.         x.info.inferior = inf;
  227.         push(&fitxesDisponibles, x);
  228.     }
  229.     fclose(z);
  230.     x = pop(&fitxesDisponibles);
  231.     return(fitxesDisponibles);
  232. }    
  233.  
  234. void obtenir_index_seguent_jugador (tJugador jugador[], int *i) {
  235.     if (jugador[*i+1].actiu == 1 && *i < 3) {
  236.         *i = *i+1;
  237.     }
  238.     else {
  239.         *i = 0;
  240.     }
  241. }
  242.  
  243. void agafar_fitxa_pila (tPila *fitxesDisponibles, tJugador *jugador, int i) {
  244.     tNode fitxa;
  245.     fitxa = pop(fitxesDisponibles);
  246.     inserirLlista(&jugador[i].fitxes, NULL, fitxa);
  247. }  
  248.      
  249. void repartir (tPila *fitxesDisponibles, tJugador *jugador) {
  250.     int i = 0;
  251.     int j = 7;
  252.     tNode fitxa;
  253.     while (j > 0) {
  254.         fitxa = pop(fitxesDisponibles);
  255.         fitxa.info.pos = FITXA_ESQUERRA;
  256.         inserirLlista(&jugador[i].fitxes, NULL, fitxa);
  257.         obtenir_index_seguent_jugador(jugador, &i);
  258.         if (i == 0) {
  259.             j = j-1;
  260.         }
  261.     }
  262. }
  263.  
  264. int pot_tirar (tPartida partida, tJugador jugador[], int i) {
  265.     int trobat;
  266.     int esq, dre;
  267.     tNode *iteradorLlista;
  268.     if (partida.esquerra->info.pos == FITXA_ESQUERRA) {
  269.         esq = partida.esquerra->info.superior;
  270.     }
  271.     else {
  272.         esq = partida.esquerra->info.inferior;
  273.     }
  274.     if (partida.dreta->info.pos == FITXA_ESQUERRA) {
  275.         dre = partida.dreta->info.inferior;
  276.     }
  277.     else {
  278.         dre = partida.dreta->info.superior;
  279.     }
  280.     primerLlista(&iteradorLlista, jugador[i].fitxes);
  281.     trobat = 0;
  282.     while (iteradorLlista != NULL && !trobat) {
  283.         if (iteradorLlista->info.superior == esq || iteradorLlista->info.inferior == esq ||
  284.             iteradorLlista->info.superior == dre || iteradorLlista->info.inferior == dre) {
  285.                 trobat = 1;
  286.         }
  287.         seguentLlista(jugador[i].fitxes, &iteradorLlista);
  288.     }
  289.     return(trobat);
  290. }
  291.  
  292. int demanar_tirar_fitxa (tPartida *partida, tJugador *jugador, int i) {
  293.     int resultat;
  294.     tNode *iteradorLlista, *fitxaSeleccionada; /* Cal un doble iterador per fer les eliminacions */
  295.     tNode fitxa;
  296.     int nFitxa, nDisponibles, j, n;
  297.     char opc; /* Indicarà el costat de la partida on inserir la fitxa */
  298.     primerLlista(&iteradorLlista, partida->esquerra);
  299.     printf("Es torn de %s, l'estat actual de la partida es:\n", jugador[i].nom);
  300.     while (iteradorLlista != NULL) { /* Recorrem la llista de la partida per imprimir-la */
  301.         if (iteradorLlista->info.pos == FITXA_VERTICAL) {
  302.             printf("[[%d]]", iteradorLlista->info.superior);
  303.         }
  304.         else if (iteradorLlista->info.pos == FITXA_DRETA) {
  305.             printf("[%d|%d]", iteradorLlista->info.inferior, iteradorLlista->info.superior);
  306.         }
  307.         else {
  308.             printf("[%d|%d]", iteradorLlista->info.superior, iteradorLlista->info.inferior);
  309.         }
  310.         seguentLlista(partida->esquerra, &iteradorLlista);
  311.     }
  312.     primerLlista(&iteradorLlista, jugador[i].fitxes);
  313.     nDisponibles = 0;
  314.     printf("\nLes fitxes disponibles son:\n");
  315.     while (iteradorLlista != NULL) { /* Recorrem la llista de fitxes del jugador per imprimir-la */
  316.         printf(" [%d|%d] ", iteradorLlista->info.superior, iteradorLlista->info.inferior);
  317.         seguentLlista(jugador[i].fitxes, &iteradorLlista);
  318.         nDisponibles = nDisponibles+1;
  319.     }
  320.     printf("\nTens un total de %d fitxes disponibles.", nDisponibles);
  321.     printf("\nIntrodueix el nombre de fitxa que desitges inserir al domino: ");
  322.     scanf("%d", &nFitxa); printf("\n");
  323.     while (nFitxa > nDisponibles || nFitxa <= 0) {
  324.         printf("Nomes queden %d fitxes disponibles, introdueix un nou nombre de fitxa valid: ", nDisponibles);
  325.         scanf("%d", &nFitxa); printf("\n");
  326.     }
  327.     primerLlista(&fitxaSeleccionada, jugador[i].fitxes);
  328.     if (nFitxa == 1) { /* Al seleccionar la primera fitxa col·loquem iteradorLlista a NULL per esborrar correctament */
  329.         iteradorLlista = NULL;
  330.     }
  331.     for (j = 0; j < nFitxa-1; ++j) { /* Només entra si nFitxa > 1 */
  332.         iteradorLlista = fitxaSeleccionada;
  333.         seguentLlista(jugador[i].fitxes, &fitxaSeleccionada); /* Avança l'iterador fitxaSeleccionada */
  334.     }
  335.     if (partida->esquerra == NULL) { /* Primer moviment de la partida */
  336.         eliminarLlista(&jugador[i].fitxes, iteradorLlista, &fitxa);
  337.         if (fitxa.info.superior == fitxa.info.inferior) { /* Posem la fitxa en posició vertical  si és un doble */
  338.             fitxa.info.pos = FITXA_VERTICAL;
  339.         }
  340.         inserirLlista(&partida->esquerra, partida->esquerra, fitxa);
  341.         partida->dreta = partida->esquerra; /* Al inserir la primera fitxa fem que partida->esquerra i partida->dreta siguin iguals */
  342.         resultat = 1;
  343.     }
  344.     else { /* Altres moviments de la partida */
  345.         opc = 'x';
  346.         while (opc != 'd' && opc != 'e') {
  347.             printf("Introdueix el costat on s'introdueix la fitxa: (d)reta o (e)squerra: ");
  348.             scanf("%c", &opc); printf("\n");
  349.         }
  350.         if (opc == 'e') { /* Inserció a l'esquerra */
  351.             if (partida->esquerra->info.pos == FITXA_DRETA) {
  352.                 n = partida->esquerra->info.inferior;
  353.             }
  354.             else {
  355.                 n = partida->esquerra->info.superior;
  356.             }
  357.         }
  358.         else { /* Inserció a la dreta */
  359.             if (partida->dreta->info.pos == FITXA_ESQUERRA) {
  360.                 n = partida->dreta->info.inferior;
  361.             }
  362.             else {
  363.                 n = partida->dreta->info.superior;
  364.             }
  365.         }
  366.         fitxa = elementLlista(fitxaSeleccionada);
  367.         if (fitxa.info.superior == n || fitxa.info.inferior == n) { /* La fitxa serà inserida a la partida */
  368.             eliminarLlista(&jugador[i].fitxes, iteradorLlista, &fitxa);
  369.             if (opc == 'e') {
  370.                 if (fitxa.info.superior == fitxa.info.inferior) {
  371.                         fitxa.info.pos = FITXA_VERTICAL;
  372.                 }
  373.                 else {
  374.                     if (fitxa.info.superior == n) {
  375.                         fitxa.info.pos = FITXA_DRETA;
  376.                     }
  377.                 }
  378.                 inserirLlista(&partida->esquerra, NULL, fitxa);
  379.             }
  380.             else {
  381.                 if (fitxa.info.superior == fitxa.info.inferior) {
  382.                         fitxa.info.pos = FITXA_VERTICAL;
  383.                 }
  384.                 else {
  385.                     if (fitxa.info.inferior == n) {
  386.                         fitxa.info.pos = FITXA_DRETA;
  387.                     }
  388.                 }
  389.                 inserirLlista(&partida->esquerra, partida->dreta, fitxa);
  390.                 seguentLlista(partida->esquerra, &partida->dreta);
  391.             }
  392.             if (esBuidaLlista(jugador[i].fitxes)) {
  393.                 resultat = 2;
  394.             }
  395.             else {
  396.                 resultat = 1;
  397.             }
  398.         }
  399.         else { /* No s'ha inserit cap fitxa */
  400.             resultat = 0;
  401.         }
  402.     }
  403.     return(resultat);
  404. }
  405.  
  406. void mostrar_resultats (tJugador jugador[]) {
  407.     int i, j, minim, jActius;
  408.     int puntuacio[MAX_JUGADORS];
  409.     tNode *iteradorLlista;
  410.     jActius = 0;
  411.     for (i = 0; i <= MAX_JUGADORS-1; ++i) {
  412.         puntuacio[i] = 0;
  413.         if (jugador[i].nom != "") {
  414.             primerLlista(&iteradorLlista, jugador[i].fitxes);
  415.             printf("Ordenant");
  416.             while (iteradorLlista != NULL) {
  417.                 puntuacio[i] = puntuacio[i] + iteradorLlista->info.superior + iteradorLlista->info.inferior;
  418.                 seguentLlista(jugador[i].fitxes, &iteradorLlista);
  419.             }
  420.             jActius = jActius + 1;
  421.             printf("puntuacio[%d] = %d", i, puntuacio[i]);
  422.         }
  423.     }
  424.     for (i = 1; i <= jActius-1; ++i) {
  425.         minim = i;
  426.         for (j = i+1; i <= jActius; ++j) {
  427.             if (puntuacio[j] < puntuacio[minim]) {
  428.                 minim = j;
  429.             }
  430.         }
  431.         intercanvia((char*)&jugador[i], (char*)&jugador[minim], sizeof(tJugador));
  432.         intercanvia((char*)&puntuacio[i], (char*)&puntuacio[minim], sizeof(int));
  433.     }
  434.     printf("Llista ordenada");
  435.     for (i = 0; i <= MAX_JUGADORS-1; i++) {
  436.         if (jugador[i].nom != "") {
  437.             if (jugador[i].fitxes == NULL) {
  438.                 printf("El jugador %s ha guanyat la partida amb 0 punts i sense fitxes", jugador[i].nom);
  439.             }
  440.             else {
  441.                 printf("%d. %s amb %d punts", i+1, jugador[i].nom, puntuacio[i]);
  442.             }
  443.         }
  444.         else {
  445.             printf("%d.", i+1);
  446.         }
  447.     }
  448. }
  449.  
  450. void partida (tPartida *partida, tJugador *jugador) {
  451.     int final, continuar;
  452.     int indexJugador;
  453.     partida->esquerra = NULL;
  454.     partida->dreta = NULL;
  455.     tPila fitxesDisponibles;
  456.     tNode fitxa;
  457.     fitxesDisponibles = obtenir_fitxes_barrejades();
  458.     repartir(&fitxesDisponibles, jugador);
  459.     final = 0;
  460.     indexJugador = 0;
  461.     demanar_tirar_fitxa(partida, jugador, indexJugador); /* Primer moviment */
  462.     while (!final) {
  463.         obtenir_index_seguent_jugador(jugador, &indexJugador);
  464.         while (!pot_tirar(*partida, jugador, indexJugador) && !esBuidaPila(&fitxesDisponibles)) {
  465.             agafar_fitxa_pila(&fitxesDisponibles, jugador, indexJugador);
  466.         }
  467.         final = !pot_tirar(*partida, jugador, indexJugador) && esBuidaPila(&fitxesDisponibles); /*Cambio AND i esBuidaPila*/
  468.         if (!final) {
  469.             continuar = 0;
  470.             while (continuar == 0) {
  471.                 continuar = demanar_tirar_fitxa(partida, jugador, indexJugador);
  472.                 if (continuar == 2) { /* El jugador ha inserit la darrera fitxa */
  473.                     final = 1;
  474.                 }
  475.             }
  476.         }
  477.     }
  478.     mostrar_resultats(jugador);
  479.     for (indexJugador = 0; indexJugador < MAX_JUGADORS; ++indexJugador) { /* Lliberem memòria de les llistes de tots els jugadors */
  480.         while (!esBuidaLlista(jugador[indexJugador].fitxes)) {
  481.             eliminarLlista(&jugador[indexJugador].fitxes, NULL, &fitxa);
  482.         }
  483.     }
  484.     while (!esBuidaLlista(partida->esquerra)) { /* Lliberem memòria de les fitxes de la partida */
  485.         eliminarLlista(&partida->esquerra, NULL, &fitxa);
  486.     }
  487.     while (!esBuidaPila(&fitxesDisponibles)) { /* Lliberem la memòria utilitzada per la pila de fitxes fitxesDisponibles */
  488.         fitxa = pop(&fitxesDisponibles);
  489.     }
  490. }
  491.  
  492. /* Programa principal                                                         */
  493.  
  494. int main () {
  495.     tJugador jugador[MAX_JUGADORS];
  496.     tPartida game;
  497.     introduir_jugadors(jugador);
  498.     partida(&game, jugador);
  499.  
  500.     system("PAUSE");
  501.     return(0);
  502. }
Advertisement
Add Comment
Please, Sign In to add comment