2024(e)ko otsailaren 19(a), astelehena

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.

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.


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.


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.
 

iruzkinik ez:

Argitaratu iruzkina

Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.