2024(e)ko martxoaren 21(a), osteguna

10. astea | itsas-bataila (I)






Itsas-bataila

Itsas-batailaren jokoa programatuko dugu. Bi dimentsioatako 6x6 taula batean gertatuko dira ekintza guztiak, taularen errenkadak izendatzeko zenbaki osoak erabiliko dira (1-etik 6-ra), eta taularen zutabeak izendatzeko karaktereak erabiliko dira (A-tik F-ra)

Ordenadoreak etsaien armada kokatuko du 6x6 itsasoan, eta etsaien armada hori hondoratu beharko dugu gehienez 19 jaurtiketa erabiliz. Etsaien armada sei itsasontziz osaturik dago:

  • 2 korazatu, armadako itsasontzi handienak dira (bakoitzak 3 zati)
  • 3 destruktore, armadako itsasontzi ertainak dira (bakoitzak 2 zati) 
  • 1 itsaspeko, armadako itsasontzi txikiena da (1 zati)

Hondoratu behar dugun etsaien armada 6x6 itsasoan kokatzeko, bi dimentsiotako array bat erabiliko dugu, hots, karaktereen array bat. Korazatua adierazteko K idatziko dugu, destruktorea adierazteko D idatziko dugu, itsaspekoa adierazteko P idatziko dugu, ura adierazteko, u idatziko dugu, eta, gainerako toki guztietan X idatzirik egongo da. Adibidez:


Baina bataila hasi aurretik, ikus dezagun etsaien ontziteriak har ditzaken kokapen posibleak zeintzuk diren. Horretarako, programa bat idatziko dugu eta bere helburu bakarra EtsaienArmadaGuztiakKokatu delako prozedurari dei egitea da. Dakigunez, EtsaienArmadaGuztiakKokatu prozedura itsas_w unitatean garaturik dago.

Guztira 16 kokapen desberdin direlako EtsaienArmadaGuztiakErakutsi prozedurak for-to-do agindu baten bitartez, iterazio bakoitzean bi dei egingo ditu: EtsaienArmadaHasieratu prozedurari eta EtsaienArmadaKokatu prozedurari. Hirurak itsas_w unitatean garaturik daude.

Lehendik programaturik dagoen unitate bat erabiliko dugu, itsas_w izeneko unitatea hain zuzen ere. Unitate horren iturburu-programa ez daukagu, baina bere interfazea ezagutzen dugu. Hori dela eta, guk idatziko dugun programan itsas_w unitatearen ondoko datu-mota erabil dezakegu eta ondoko azpiprogramen deiak egin ditzakegu:  

unit itsas_w ; 

interface        (* ----------------------------- interfazearen hasiera ----- *)

   type tacItsasoa = array[1..6, 'A'..'F'] of char ;
   function fncSuEgin(iErrenkada: integer;
                        cZutabea: char): char ;   { K, D, P edo X }
   procedure EtsaienArmadaHasieratu ;   
   procedure EtsaienArmadaErakutsi ;   
   procedure EtsaienArmadaKokatu ;
   procedure EtsaienArmadaGuztiakKokatu ;
   
                 (* ----------------------------- interfazearen amaiera ----- *)

implementation   (* ------------------------- inplementazioaren hasiera ----- *)

   ...

end.             (* --------- inplementazioaren eta unitatearen amaiera ----- *)  

Interfazean adierazten dira unitateak bezero-programarekin partekatuko dituen elementuak: konstanteak, datu-motak, funtzioak, prozedurak eta abar. Adibide honetan, datu-mota bat partekatzeaz gain funtzio bat eta lau prozedura partekatzen dira.

Interfazearen datu-motaren azalpena:

  • tacItsasoa datu-motak itsasoa ereduztatzen du, 6x6 itsaso zati horretan burutuko da bataila. Errenkadak izendatzeko zenbakizko indizeak erabiliko dira (1-etik 6-ra) eta zutabeak izendatzeko letrak erabiliko dira (A-tik F-ra)

Interfazearen bost azpiprogramen azalpenak:

  • fncSuEgin funtzioak 6x6 arrayaren koordenatuak hartuko ditu eta posizio horren karakterea itzuliko du (K, D, P edo X)
  • EtsaienArmadaHasieratu prozedurak 6x6 itsasoan X markak idatziko ditu
  • EtsaienArmadaKokatu prozedurak 6x6 itsasoan K, D eta P markak idatziko ditu
  • EtsaienArmadaErakutsi prozedurak 6x6 itsasoaren edukia pantailaratuko du. Honi esker gure programa-bezerotik posible zaigu jakitea etsaien ontziteria non dagoen, baina prozedura honi dei egiten badiogu itsas-bataila galdu dugulako izango da
  • EtsaienArmadaGuztiakErakutsi prozedurak 6x6 itsasoaren edukia pantailaratuko du, guztira 16 kokapen desberdin definitu dira itsas_w unitatean

Bost azpiprograma horiek gure programatik aktiba ditzakegu. Horretarako, uses klausulari esker itsas_w unitatea behar-beharrekoa zaigula adieraziko dugu gure iturburu-programaren hasieran. Dena den EtsaiakNon_w programan azpiprograma bakarra erabiliko dugu, EtsaienArmadaGuztiakErakutsi prozedura:

program EtsaiakNon_w ;

uses
   crt, itsas_w ;

Hori dela eta, gure bezero-programak EtsaienArmadaGuztiakErakutsi prozedurari dei egitean etsaien armadaren kokapen guztiak zeintzuk izan daitezkeen erakutsiko ditu pantailan. Orotara 16 kokapen desberdinetatik hona hemen lehen laurak:

EtsaienArmadaGuztiakErakutsi prozedurak pantailaratzen duenenaren zati bat


EtsaiakNon_w.pas bezero-programak itsas_w eta crt unitateak beharko dituela dakigu. Baina, zer gertatuko litzateke  bezero-programak deklaratu eta garatuko balu unitatearen interfazeko funtzioa edo prozeduraren bat? Honako hau galdetzen da: EtsaienArmadaGuztiakKokatu prozedura unitatean garaturik dago (bezero-programaren erabiltzaileak jakin ez dezan etsaien ontziteria non egon daitekeen), bezero-programak EtsaienArmadaGuztiakKokatu prozedura berri bat idatz dezake? Bai idatz dezake, errorerik ez dago ez sintaxian ez exekuzioan.

Aurreko erantzunak beste galdera bat sorarazten du: baldin eta EtsaienArmadaGuztiakKokatu bi prozedura badaude (bat unitatekoa eta bestea bezero-programakoa), zein aktibatuko da bezero-programa exekutatzean? Bezero-programakoa, hots, bezero-programako EtsaienArmadaGuztiakKokatu prozedura piztuko da eta unitateko EtsaienArmadaGuztiakKokatu prozedura ez balego bezala da. Ondorioz, unitatean garaturik dagoen zerbait bezero-programan garatzen bada, azken honek "estaltzen" du unitatekoa.

EtsaiakNon_w.pas bezero-programak itsas_w eta crt unitateak beharko ditu jarraian ikusten den bezala:

program EtsaiakNon_w ;

uses
   crt, itsas_w ;

{ -----------------------Programa Nagusia-------------------------- }

begin
   clrscr ;
   writeln ;
   
   writeln('///////////////////////////////////////////////////////////////////') ;
   writeln ;
   writeln ;
     
   EtsaienArmadaGuztiakKokatu ;
    
   writeln ;
   writeln ;
   writeln('///////////////////////////////////////////////////////////////////') ;
   
   writeln ;
   repeat until keypressed ;
end.
 



    Windows:
  • EtsaiakNon_w.pas   bezero-programaren iturburu-kodea
  • itsas_w.pas   unitatearen iturburu-kodea, hau konpilatzean:
    • itsas_w.ow   unitatearen objektu-kodea lortzen da (itsas_w.pas konpilatu ondoren)
    • itsas_w.ppw   unitate konpilatua lortzen da (itsas_w.pas konpilatu ondoren)
  • EtsaiakNon_w.exe   programa exekutagarria fitxategi hauekin lor daiteke:
    • EtsaiakNon_w.pas
    • itsas_w.ow
    • itsas_w.ppw
    Windows:
  • EtsaiakNon_w.zip   unitate konpilatua eta bezero-programaren iturburu-kodea (itsas_w.ow eta itsas_w.ppw gehi EtsaiakNon_w.pas)
 

    Mac:
  • EtsaiakNon.pas   bezero-programaren iturburu-kodea
  • itsas.pas   unitatearen iturburu-kodea
  • itsas.o   unitatearen objektu-kodea
  • itsas.ppu   unitate konpilatua
  • EtsaiakNon   programa exekutagarria (goiko fitxategiekin lor daiteke)


 

iruzkinik ez:

Argitaratu iruzkina

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