2022(e)ko apirilaren 1(a), ostirala

4. astea | FOR-DO bat bere barnean beste FOR-DO bat duena (2)



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 eta txanponaren jaurtiketa simulatzeko random funtzio estandarra erabiliko da. Dadoaren aukerak 6 direlako random(6) aplikatu beharko da. Txanponaren aukerak 2 direlako random(2) aplikatu beharko da.







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.






Berdinketa prozesatzen



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:



{-------------------------------------------------------------
Zenbat jokalari izango diren zehaztu beharra dago.
Kanpoko begiztan jokalarien txandak erakusten dira.
Barruko begiztan jokalarien puntuak lortzen dira eta
irabazlea erabakitzen da, berdinketarik
gertatzean txanpon baten laguntzaz erabaki
Azken emaitzak erakusten dira: irabazlea eta maximoa
-------------------------------------------------------------}

program DadoenJaurtiketak_Berdinketa;
var
iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura: integer;
iJokalaria, iJaurtiketa: integer;
begin
repeat
write('Zenbat jokalari dira? ');
readln(iJokalariKopurua);
until iJokalariKopurua > 1; (* gutxienez 2 jokalari *)

randomize;
iIrabazlea := 0;
iMaximoa := 0;
for iJokalaria:=1 to iJokalariKopurua do
begin
writeln;
iPuntuenBatura := 0;
for iJaurtiketa:=1 to 3 do
begin
iPuntuak := random(6) + 1; (* random(6)-ek 0 eta 5 arteko balioak emango ditu *)
writeln(iJokalaria, '. jokalariak ', iPuntuak, ' puntu lortu ditu ', iJaurtiketa, '. jaurtiketan.');
iPuntuenBatura := iPuntuenBatura + iPuntuak;
end;

if iPuntuenBatura > iMaximoa then
begin
iMaximoa := iPuntuenBatura;
iIrabazlea := iJokalaria;
writeln('Dagoeneko irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');
end
else
begin
if iPuntuenBatura = iMaximoa then
begin
(* random(2) bitartez txanpoi bat jaurtitzen dela simula daiteke *)
writeln('Berdinketa!!!');
end;
end; (* else *)
end; (* kanpoko for *)

writeln;
writeln('Irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');

writeln;
writeln('ENTER sakatu exekuzioa amaitzeko...');
readln;
end.






1. bertsioa, txanponaren jaurtiketa bana



Orain arteko irabazleak txanpona behin jaurtitzean iAurrekoarenPuntuak aldagaian gordeko da bere emaitza. Eta berdinketa lortu duen une honetako jokalariak txanpona jaurtitzean iUnekoarenPuntuak aldagaian gordeko da bere emaitza:



{-------------------------------------------------------------
Zenbat jokalari izango diren zehaztu beharra dago.
Kanpoko begiztan jokalarien txandak erakusten dira.
Barruko begiztan jokalarien puntuak lortzen dira eta
irabazlea erabakitzen da, berdinketarik
gertatzean bigarren txanda bat jokatu
txanpon bakar baten jaurtiketa burutuz
Azken emaitzak erakusten dira: irabazlea eta maximoa
-------------------------------------------------------------}

program DadoenJaurtiketak_BerdinketaTxanponBat;
var
iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura: integer;
iJokalaria, iJaurtiketa: integer;
iAurrekoarenPuntuak, iUnekoarenPuntuak: integer;
begin
repeat
write('Zenbat jokalari dira? ');
readln(iJokalariKopurua);
until iJokalariKopurua > 1; (* gutxienez 2 jokalari *)

randomize;
iIrabazlea := 0;
iMaximoa := 0;
for iJokalaria:=1 to iJokalariKopurua do
begin
writeln;
iPuntuenBatura := 0;
for iJaurtiketa:=1 to 3 do
begin
iPuntuak := random(6) + 1; (* random(6)-ek 0 eta 5 arteko balioak emango ditu *)
writeln(iJokalaria, '. jokalariak ', iPuntuak, ' puntu lortu ditu ', iJaurtiketa, '. jaurtiketan.');
iPuntuenBatura := iPuntuenBatura + iPuntuak;
end;

if iPuntuenBatura > iMaximoa then
begin
iMaximoa := iPuntuenBatura;
iIrabazlea := iJokalaria;
writeln('Dagoeneko irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');
end
else
begin
if iPuntuenBatura = iMaximoa then
begin
repeat
iAurrekoarenPuntuak := random(2) + 1; (* random(2)-ek 0 eta 1 arteko balioak emango ditu *)
iUnekoarenPuntuak := random(2) + 1; (* random(2)-ek 0 eta 1 arteko balioak emango ditu *)
writeln('Berdinketa haustean, aurreko jokalariak ', iAurrekoarenPuntuak, ' puntu eta uneko jokalariak ', iUnekoarenPuntuak, ' puntu.');
until iAurrekoarenPuntuak <> iUnekoarenPuntuak;

if iAurrekoarenPuntuak > iUnekoarenPuntuak then
begin
(* iMaximoa := iPuntuenBatura; maximoa ez dago zertan aldatu beharrik *)
(* iIrabazlea := iJokalaria; irabazlea ez dago zertan aldatu beharrik *)
writeln('Dagoeneko irabazlea, aurreko ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin berdinketa haustean.');
end
else
begin
(* iMaximoa := iPuntuenBatura; maximoa ez dago zertan aldatu beharrik *)
iIrabazlea := iJokalaria;
writeln('Dagoeneko irabazlea, uneko ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin berdinketa haustean.');
end;
end;
end; (* else *)
end; (* kanpoko for *)

writeln;
writeln('Irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');

writeln;
writeln('ENTER sakatu exekuzioa amaitzeko...');
readln;
end.






2. bertsioa, txanponaren bina jaurtiketa



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:



{-------------------------------------------------------------
Zenbat jokalari izango diren zehaztu beharra dago.
Kanpoko begiztan jokalarien txandak erakusten dira.
Barruko begiztan jokalarien puntuak lortzen dira eta
irabazlea erabakitzen da, berdinketarik
gertatzean bigarren txanda bat jokatu
txanpon bat birritan jaurtiz
Azken emaitzak erakusten dira: irabazlea eta maximoa
-------------------------------------------------------------}

program DadoenJaurtiketak_BerdinketaTxanponBi;
var
iJokalariKopurua, iMaximoa, iIrabazlea, iPuntuak, iPuntuenBatura: integer;
iJokalaria, iJaurtiketa: integer;
iAurrekoarenPuntuak, iUnekoarenPuntuak: integer;
begin
repeat
write('Zenbat jokalari dira? ');
readln(iJokalariKopurua);
until iJokalariKopurua > 1; (* gutxienez 2 jokalari *)

randomize;
iIrabazlea := 0;
iMaximoa := 0;
for iJokalaria:=1 to iJokalariKopurua do
begin
writeln;
iPuntuenBatura := 0;
for iJaurtiketa:=1 to 3 do
begin
iPuntuak := random(6) + 1; (* random(6)-ek 0 eta 5 arteko balioak emango ditu *)
writeln(iJokalaria, '. jokalariak ', iPuntuak, ' puntu lortu ditu ', iJaurtiketa, '. jaurtiketan.');
iPuntuenBatura := iPuntuenBatura + iPuntuak;
end;

if iPuntuenBatura > iMaximoa then
begin
iMaximoa := iPuntuenBatura;
iIrabazlea := iJokalaria;
writeln('Dagoeneko irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');
end
else
begin
if iPuntuenBatura = iMaximoa then
begin
repeat
iAurrekoarenPuntuak := 0;
for iJaurtiketa:=1 to 2 do
begin
iAurrekoarenPuntuak := iAurrekoarenPuntuak + random(2) + 1; (* random(2)-ek 0 eta 1 arteko balioak emango ditu *)
end;

iUnekoarenPuntuak := 0;
for iJaurtiketa:=1 to 2 do
begin
iUnekoarenPuntuak := iUnekoarenPuntuak + random(2) + 1; (* random(2)-ek 0 eta 1 arteko balioak emango ditu *)
end;
writeln('Berdinketa haustean, aurreko jokalariak ', iAurrekoarenPuntuak, ' puntu eta uneko jokalariak ', iUnekoarenPuntuak, ' puntu.');
until iAurrekoarenPuntuak <> iUnekoarenPuntuak;

if iAurrekoarenPuntuak > iUnekoarenPuntuak then
begin
(* iMaximoa := iPuntuenBatura; maximoa ez dago zertan aldatu beharrik *)
(* iIrabazlea := iJokalaria; irabazlea ez dago zertan aldatu beharrik *)
writeln('Dagoeneko irabazlea, aurreko ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin berdinketa hautsita.');
end
else
begin
(* iMaximoa := iPuntuenBatura; maximoa ez dago zertan aldatu beharrik *)
iIrabazlea := iJokalaria;
writeln('Dagoeneko irabazlea, uneko ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin berdinketa hautsita.');
end;
end;
end; (* else *)
end; (* kanpoko for *)

writeln;
writeln('Irabazlea ', iIrabazlea, '. jokalaria ', iMaximoa, ' puntuekin.');

writeln;
writeln('ENTER sakatu exekuzioa amaitzeko...');
readln;
end.