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.

Definiu un projecte nou anomenat m4p05 i afegiu-li un arxiu de font C/C++ anomenat m4p05.cpp. Escriviu el següent codi:

//m4p05.cpp:  Joc dels xinos

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


void 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("cls");
       printf("ordinador %d, humà %d\n", punto, punth);
       printf("jugada %d\n",ct);
       printf("\nIntroduïu la seva previsió...\n");

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


       //tria una jugada a l'atzar
       jo=rand()*4/32768;

       if(ph==0) po=jo;
       if(ph==1) po=jo+rand()*2/32768;
       if(ph==2) po=jo+rand()*3/32768;
       if(ph==3) po=jo+rand()*4/32768;
       if(ph==4) po=jo+rand()*3/32768+1;
       if(ph==5) po=jo+rand()*2/32768+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...");

       c=getche();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++);
       }
    }

}

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/32768;

C/C++ incorpora a la seva llibreria estàndard aquesta funció que calcula un número pseudoaleatori entre 0 i 32767, 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/32768;
       if(ph==2) po=jo+rand()*3/32768;
       if(ph==3) po=jo+rand()*4/32768;
       if(ph==4) po=jo+rand()*3/32768+1;
       if(ph==5) po=jo+rand()*2/32768+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.