| 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:
- Programa honen lehen bertsioan, berdinketa hausteko txanpona behin bakarrik jaurtitzen da, eta
- 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;
}

iruzkinik ez:
Argitaratu iruzkina