Enrere Mòdul 4
Fonaments de Programació. Llenguatge C/C++---
Pràctica  Resum teòric Exercicis
Pràctica d'ampliació Annex: la depuració

 
Simulació del clàssic joc dels xinos

Com a primera pràctica de simulació d'un joc hem triat aquest senzill i tradicional joc dels "xinos". En aquesta pràctica es veurà diferents casos d'elecció de números aleatoris.

 

Desenvolupament de la pràctica

En aquest joc, que en aquest cas es jugarà només amb 2 "jugadors" (l'usuari i l'ordinador), cadascú dels jugadors ha de "pensar" un número enter entre 0 i 3 i, també ha de fer una previsió de la suma de les puntuacions pensades pels dos jugadors. Guanya el jugador que encerti aquesta suma.

Creeu un nou arxiu font C anomenat m4p05.c. i escriviu el següent codi:

//m4p05.c - Joc dels xinos -
#include <stdio.h>
#include <stdlib.h>
 

void NetejaBuffer() { while(getchar() != '\n'); }
 

int main(){
  char c;
  int jo,po; //jugada i previsió de l'ordinador.
  int jh,ph; //jugada i previsió de l'humà .
  int ct,i; //comptadors
  int punto=0,punth=0; //marcadors de punts

  for(ct=0;;ct++){
     system("clear");
     printf("ordinador %d, humà  %d\n", punto, punth);
     printf("jugada %d\n",ct);
     printf("\nIntroduïu la seva previsió...\n");


     c=getc(stdin);if(c<'0'||c>'6') exit(1);ph=c-48;


     //tria una jugada a l'atzar
     jo=rand()%4; // pot sortir 0,1,2,3

     if(ph==0) po=jo;
     if(ph==1) po=jo+rand()% 2;
     if(ph==2) po=jo+rand()% 3;
     if(ph==3) po=jo+rand()% 4;
     if(ph==4) po=jo+rand()% 3;
     if(ph==5) po=jo+rand()% 2;
     if(ph==6) po=jo+3;

     printf("\n\nja he pensat la meva jugada. ");
     printf("\nLa meva previsió és %d\n",po);
     printf("\nIntrodueixi la seva jugada...");
     NetejaBuffer();
     c=getc(stdin);if(c<'0'||c>'3') exit(1); jh=c-48;

     printf("\nLa meva jugada era %d",jo);
     if(jh+jo==po) {
        printf("\nGuanya l'ordinador\n");
        punto++;
        for(i=1;i<100000000;i++);
     }else if(jh+jo==ph){
        printf("\nGuanya vosté\n");
        punth++;
        for(i=1;i<100000000;i++);
     }else {
        printf("\nNo guanya ningú\n");
        for(i=1;i<100000000;i++);
     }
     NetejaBuffer();
     printf("\n Prem una tecla per continuar");
     c=getc(stdin);

}
return 0;
}

 

Captura de l'execució del programa.

 

Explicació del programa

En aquest programa es fa servir les variables jo i po per emmagatzemar la jugada i la previsió que fa l'ordinador, i les variables jh i ph per emmagatzemar la jugada i la previsió que fa l'usuari (l'humà).

En aquesta versió del programa sempre comença l'humà a fer la seva previsió. La lectura d'aquesta dada es fa en aquesta línia de sentències múltiples:

 c=getche();if(c<'0'||c>'6') exit(1);ph=c-48;

Normalment, s'escriu una sentència en una línia diferent, però en alguns casos pot considerar-se la possibilitat d'agrupar-ne diverses de diferents en una mateixa línia sempre que siguin curtes i que faci el codi més clar. Com moltes coses, això dependrà de l'estil o del gust de cadascú.

La jugada de l'ordinador es crea a l'atzar amb la següent sentència:

jo=rand()%4; // donarà 0, 1, 2, 3

C/C++ incorpora a la seva llibreria estàndard aquesta funció que calcula un número pseudoaleatori entre 0 i RAND_MAX ( una constant simbólica definida en l'arxiu de capçalera <stdlib.h>. El valor de RAND_MAX ha de ser almenys 32767, el valor més gran positiu per a un enter de dos bytes ( 16 bits ). La funció té el prototipus:

int rand()

i per tal de fer-la servir s'ha d'incloure l'arxiu de capçalera stdlib.h.

L'expressió de la dreta en la línia anterior serà un nombre aleatori entre 0 i 3.

La previsió de l'ordinador no es fa realment a l'atzar sinó depenent de les dades que en té: jo i ph. Podem dir que la part següent del codi és la part "intel·ligent", la que decideix una o altra opció segons la jugada de l'humà:

       if(ph==0) po=jo;
       if(ph==1) po=jo+rand()%2;
       if(ph==2) po=jo+rand()%3;
       if(ph==3) po=jo+rand()%4;
       if(ph==4) po=jo+rand()%3+1;
       if(ph==5) po=jo+rand()%2+2;
       if(ph==6) po=jo+3;

Si la previsió de l'humà és 0, l'ordinador sap que la jugada de l'humà és 0 i, per tant decideix que la seva previsió serà igual a la seva jugada.

Si la previsió de l'humà és 1, l'ordinador sap que la jugada de l'humà és 0 o 1, per tant decideix que la seva previsió serà igual a la seva jugada més un nombre aleatori que pot ser 0 o 1.

...

Si la previsió de l'humà és 5, l'ordinador sap que la jugada de l'humà és 2 o 3, per tant decideix que la seva previsió serà igual a la seva jugada més un nombre aleatori que pot ser 2 o 3.

Per últim, si la previsió de l'humà és 6, l'ordinador sap que la jugada de l'humà és 3, per tant decideix que la seva previsió serà igual a la seva jugada més 3.

Una vegada decidida la previsió es demana la jugada de l'humà per decidir qui ha guanyat augmentant en 1 el marcador corresponent i tornant de nou.

El programa acaba en el moment que s'introdueix una tecla errònia.