2025(e)ko otsailaren 18(a), asteartea

4. jarduera (II) | Dadoen jokoa

ZER DAKIDAN:
Hainbat funtzio estandar ikasi dut eta for agindua ikasi dut ere.



ZER IKASIKO DUDAN:
Agindu errepikakor habiaratuen gaia sakonduko dut jarduera handiago batean. Bide batez, rand() eta srand() funtzioak praktikatuko ditut.

Artikulu honekin loturik dago 4. jarduera (I) | Dadoen jokoa izenburuko artikulua.



Planteamendua

Jokalarien kopurua ezezaguna da programaren hasieran, eta bere balioa teklatuaren bitartez eman beharko zaio programari.

Bi jokalarien artean berdinketa gertatzean, irabazlea txanpon baten bitartez erabakiko da

Jokalariek dado batekin jokatuko dute. Jokalari bakoitzak dadoaren hiru jaurtiketa egin ondoren, bere emaitza lortzeko dadoaren hiru jaurtiketen puntuak batu behar dira (baliorik txikiena 3 izango da eta baliorik handiena 18 izan daiteke). Programaren azken emaitza bikoitza izango da:

  • Jokalari guztien artean zenbatgarrenak irabazi duen
  • Zenbat puntuekin irabazi du jokalari horrek

Dadoa hiru aldiz jaurti ondoren puntuen baturak, uneko maximoarekin bat egiten badu, berdinketa hausteko txanpon bat erabiliko dugu.

Dadoaren jaurtiketa simulatzeko gogoratu blog honetako Ariketa 19 | Zenbakien funtzio estandarrak artikuluan ematen den (a) programa, non srand() eta rand() funtzio estandarrak erabili diren. Dadoaren aukerak 6 direlako rand()%6+1 aplikatu beharko da:
...
srand(time(NULL));   // srand() zenbaki aleatorioak berriro hasiarazteko, 
                     // hazia behar du. Hazia, adibidez, time(NULL) funtzioa
                     // izan daiteke, zeinek igarotako segundoak long batean
                     // itzultzen dituen 1970-01-01 datatik hasita
iJaurtiketarenBalioa = rand() % 6 + 1;   // 1 eta 6 arteko balioa
...


Irabazlea

Hiru jaurtiketak egin ondoren haien batura handiena lortuko duen jokalariak irabaziko du. Bi jokalarik (edo gehiagok) puntu-kopuru maximoa lortuz gero, irabazlea erabakitzeko txanpon bat erabiliko da. Programa honek bi bertsio izango ditu:

  1. Programa honen lehen bertsioan, berdinketa hausteko txanpona behin bakarrik jaurtitzen da, eta
  2. programa honen bigarren bertsioan, berdinketa hausteko txanpona birritan jaurtitzen da jokalari banarentzat.

Barruko begizta bukatzean, baina oraindik kanpoko begiztan gaudelarik, une horretan irabazlea zein den erabakitzen da. Ondorioz, emaitzak izango diren iMaximoa eta iIrabazlea aldagaien eguneraketak burutuko dira horrela badagokie. Berdinketa gertatzen bada, programaren puntu horretan prozesatu behar da:

/* 4a4-Jarduera_DadoenJokoa: laugarren urratsa, barruko iterazioak */

    ...

    // kanpoko begizta
    for (iKont1 = 1; iKont1 <= iJokalariKopurua; iKont1++)
    {
        printf("\n");
        iPuntuenBatura = 0;
        // barruko begizta
        for (iKont2 = 1; iKont2 <= 3; iKont2++)
        {
            iPuntuak = rand() % 6 + 1; // 1 eta 6 bitarteko zenbakiak
            printf("%d. jokalariak %d puntu lortu ditu %d. jaurtiketan.\n", iKont1, iPuntuak, iKont2);
            iPuntuenBatura += iPuntuak;
        }
        printf("%d. jokalariak guztira %d puntu lortu ditu.\n", iKont1, iPuntuenBatura);
        if (iPuntuenBatura > iMaximoa)  // irabazlea eguneratu
        {
            iMaximoa = iPuntuenBatura;
            iIrabazlea = iKont1;
        }
        else
        {
            if (iPuntuenBatura == iMaximoa) // berdinketan zein da irabazlea?
            {
                      // berdinketa hausteko kodea
            } // if
        } // else
    } // for

    ...
}


Iterazioa jakin batean, berdinketa lortu duten jokalarientzat txanpon bat jaurtitzen da, eta txanponaren jaurtiketaren emaitzak erabakitzen du uneko irabazlea:

/* 4b1-Jarduera_DadoenJokoa: berdinketa hautsi txanpon jaurtiketa bakar batez */

// Zenbat jokalari izango diren zehaztu beharra dago.
// Kanpoko begiztan: jokalarien txandak erakusten dira.
// Barruko begiztan: jokalarien puntuak lortuz irabazlea erabakitzen da;
//                   berdinketarik gertatzean, txanpon bat jaurti egiten
//                   da behin bakarrik horrela irabazlea erabakiz.
// Azken emaitzak erakusten dira: irabazlea eta maximoa.

#include <stdio.h>
#include <stdlib.h>   // rand() eta srand() funtzioetarako
#include <time.h>     // time() funtziorako

int main()
{
    int iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura;
    int iJokalaria, iJaurtiketa;

    do
    {
        printf("Zenbat jokalari dira? ");
        scanf("%d", &iJokalariKopurua);
    } while (iJokalariKopurua <= 1); // gutxienez 2 jokalari

    srand(time(NULL)); // Random zenbakiak sortzeko hasieratu
    iIrabazlea = 0;
    iMaximoa = 0;

    // jokalarien jarduerak iteratu
    for (iJokalaria = 1; iJokalaria <= iJokalariKopurua; iJokalaria++)
    {
        printf("\n");
        iPuntuenBatura = 0;

        for (iJaurtiketa = 1; iJaurtiketa <= 3; iJaurtiketa++)
        {
            iPuntuak = rand() % 6 + 1; // 1 eta 6 bitarteko zenbakiak
            printf("%d. jokalariak %d puntu lortu ditu %d. jaurtiketan.\n", iJokalaria, iPuntuak, iJaurtiketa);
            iPuntuenBatura += iPuntuak;
        }
        if (iPuntuenBatura > iMaximoa)  // irabazlea eguneratu
        {
            iMaximoa = iPuntuenBatura;
            iIrabazlea = iJokalaria;
        }
        else
        {
            if (iPuntuenBatura == iMaximoa) // berdinketa kudeatzeko txanpon jaurtiketa bat simulatu
            {
                printf("Berdinketa!!! Txanpon bat jaurtitzen...\n");
                if (rand() % 2 == 0)
                    printf("%d. jokalaria aukeratua izan da.\n", iIrabazlea);
                else
                {
                    iIrabazlea = iJokalaria;
                    printf("%d. jokalaria aukeratua izan da.\n", iIrabazlea);
                }
            }  // if
        }  // else
    }  // for

    printf("\nIrabazlea %d. jokalaria da, %d punturekin!\n", iIrabazlea, iMaximoa);

    printf("\nENTER sakatu exekuzioa amaitzeko... ");
    getchar(); // ENTER teklari itxaron (bufferra garbitzeko)
    getchar(); // ENTER sakatu programatik irteteko
    return 0;
}


Berdinketa lortu duten jokalari biek txanpon bat jaurtiko dute bi aldiz, batek irabazi arte. Orain arteko irabazleak txanpona birritan jaurtitzean iAurrekoarenPuntuak aldagaian metatuko da bere emaitza. Eta berdinketa lortu duen une honetako jokalariak txanpona birritan jaurtitzean iUnekoarenPuntuak aldagaian metatuko da bere emaitza:

/* 4b2-Jarduera_DadoenJokoa: berdinketa hautsi txanponbat birritan jaurtiz */

// Zenbat jokalari izango diren zehaztu beharra dago.
// Kanpoko begiztan: jokalarien txandak erakusten dira.
// Barruko begiztan: jokalarien puntuak lortuz irabazlea erabakitzen da;
//                   berdinketarik gertatzean, bigarren txanda bat jokatu
//                   non txanpon bat birritan jaurtitzen den.
// Azken emaitzak erakusten dira: irabazlea eta maximoa.

#include <stdio.h>
#include <stdlib.h>   // rand() eta srand() funtzioetarako
#include <time.h>     // time() funtziorako

int main()
{
    int iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura;
    int iJokalaria, iJaurtiketa;
    int iAurrekoarenPuntuak, iUnekoarenPuntuak;

    do
    {
        printf("Zenbat jokalari dira? ");
        scanf("%d", &iJokalariKopurua);
    } while (iJokalariKopurua <= 1); // gutxienez 2 jokalari

    srand(time(NULL)); // Random zenbakiak sortzeko hasieratu
    iIrabazlea = 0;
    iMaximoa = 0;

    // jokalarien jarduerak iteratu
    for (iJokalaria = 1; iJokalaria <= iJokalariKopurua; iJokalaria++)
    {
        printf("\n");
        iPuntuenBatura = 0;

        for (iJaurtiketa = 1; iJaurtiketa <= 3; iJaurtiketa++)
        {
            iPuntuak = rand() % 6 + 1; // 1 eta 6 bitarteko zenbakiak
            printf("%d. jokalariak %d puntu lortu ditu %d. jaurtiketan.\n", iJokalaria, iPuntuak, iJaurtiketa);
            iPuntuenBatura += iPuntuak;
        }

        if (iPuntuenBatura > iMaximoa)  // irabazlea eguneratu
        {
            iMaximoa = iPuntuenBatura;
            iIrabazlea = iJokalaria;
        }
        else
        {
            if (iPuntuenBatura == iMaximoa) // berdinketa kudeatzeko txanpon jaurtiketak simulatu
            {
                do // errepikatu bietariko batek irabazi arte
                {
                    iAurrekoarenPuntuak = 0;
                    for (iJaurtiketa = 1; iJaurtiketa <= 2; iJaurtiketa++)
                    {
                        iAurrekoarenPuntuak += rand() % 2 + 1;
                    }
                    iUnekoarenPuntuak = 0;
                    for (iJaurtiketa = 1; iJaurtiketa <= 2; iJaurtiketa++)
                    {
                        iUnekoarenPuntuak += rand() % 2 + 1;
                    }
                    printf("Berdinketa haustean, aurreko jokalariak %d puntu eta uneko jokalariak %d puntu.\n",
                            iAurrekoarenPuntuak, iUnekoarenPuntuak);
                } while (iAurrekoarenPuntuak == iUnekoarenPuntuak);

                if (iAurrekoarenPuntuak > iUnekoarenPuntuak)
                    printf("Dagoeneko irabazlea, aurreko %d. jokalaria %d puntuekin berdinketa hautsita.\n", iIrabazlea, iMaximoa);
                else
                {
                    iIrabazlea = iJokalaria;
                    printf("Dagoeneko irabazlea, uneko %d. jokalaria %d puntuekin berdinketa hautsita.\n", iIrabazlea, iMaximoa);
                }
            }  // if
        }  // else
    }  // for

    printf("\nIrabazlea %d. jokalaria da, %d punturekin!\n", iIrabazlea, iMaximoa);

    printf("\nENTER sakatu exekuzioa amaitzeko... ");
    getchar(); // ENTER teklari itxaron (bufferra garbitzeko)
    getchar(); // ENTER sakatu programatik irteteko
    return 0;
}






  • 4b1-Jarduera_DadoenJokoa.cbp | main.c  
  • 4b2-Jarduera_DadoenJokoa.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina