Itsas-bataila
11. astea | itsas-guda (II) programa 10. astea | itsas-bataila (II) bezalakoa da, baina 6x6 taulako elementuak erregistroak izango dira. Horrela lau datu hauek gorde ahalko dira posizio bakoitzeko:
1 2 3 4 5 6 7 8 | type trdPuntua = record cLetra: char ; { K, D, P edo X } iKolorea: integer ; { letraren kolorea } iHondoa: integer ; { letraren hondoaren kolorea } boHartuta: boolean ; { hasieran FALSE eta puntua aukeratzean TRUE } end ; tardItsasoa = array [ 1..6 , 'A' .. 'F' ] of trdPuntua; |
Gogoratu taularen errenkadak izendatzeko zenbaki osoak erabiliko direla (1-etik 6-ra), eta taularen zutabeak izendatzeko karaktereak erabiliko direla (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 itsasoarena unitatean garaturik dago.
Guztira 10 kokapen desberdin direlako EtsaienArmadaGuztiakErakutsi prozedurak pantailaratuko ditu for-to-do agindu baten bitartez.
Lehendik programaturik dagoen unitate bat erabiliko dugu, itsasoarena izeneko unitatea hain zuzen ere. Unitate horren iturburu-programa ez daukagu, baina bere interfazea ezagutzen dugu. Hori dela eta, guk idatziko dugun programan itsasoarena unitatearen ondoko konstante, datu-mota eta azpiprogra erabil ditzakegu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | unit itsasoarena; interface (* ----------------------------- interfazearen hasiera ----- *) const KOKAPENKOPURUA = 10 ; type trdPuntua = record cLetra: char ; { K, D, P edo X } iKolorea: integer ; { letraren kolorea } iHondoa: integer ; { letraren hondoaren kolorea } boHartuta: boolean ; { hasieran FALSE eta puntua aukeratzean TRUE } end ; tardItsasoa = array [ 1..6 , 'A' .. 'F' ] of trdPuntua; function fncSuEgin(iErrenkada: integer ;cZutabea: char ): char ; { K, D, P edo X } procedure EtsaienArmadaHasieratu; procedure EtsaienArmadaErakutsi; procedure EtsaienArmadaKokatu; // 10 kokapen artean bat aukeratzen da 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, konstantea eta datu-mota bat partekatzeaz gain funtzio bat eta lau prozedura partekatzen dira.
Interfazearen datu-motaren azalpena:
- tardItsasoa 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 10 kokapen desberdin definitu dira itsasoarena unitatean
Aurreko bost azpiprograma horiek gure programatik aktiba ditzakegu. Horretarako, uses klausulari esker itsasoarena unitatea behar-beharrekoa zaigula adieraziko dugu gure iturburu-programaren hasieran:
1 2 3 4 5 6 7 8 9 10 | program ItsasGudak; uses crt, itsasoarena; const ARMADA_OSOA = 13 ; JAURTIK_MAX = 22 ; type tsJaurtiketa = string [ 2 ]; |
Hori dela eta, gure bezero-programak EtsaienArmadaKokatu prozedurari deia egitean etsaien armadaren kokapen zehatz bat gertatuko da (10 kokapen posibleetatik bat) eta jokoa hasi ahalko da. Jakin badakigu etsaien armadak 6 ontzi izango dituela eta bi ontziren artean beti ura dagoela; esate baterako, ondoko irudian erakusten den kokapena ez da itsasarena unitateak emandakoa kokapena desegokia delako:
![]() |
Erroreak daudelako, goiko irudia ez du eman EtsaienArmadaKokatu prozedurak |
ItsasGudak.pas bezero-programak itsasoarena eta crt unitateak beharko dituela dakigu. Bere programa nagusia ondoko hau izan daiteke, non aboJaurtiketaErrepikaturik bezalako 6x6 array karraturen beharrik ez daukagun:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | { -----------------------Programa Nagusia-------------------------- } var iErrenkada, iJaurtiKont, iOntziZatiak, iUrKont: integer ; cZutabea: char ; ardItsasoarenEgoera: tardItsasoa; sJaurtiketa: tsJaurtiketa; boJaurtiketaEgokia: boolean ; boErrepikatuGabea: boolean ; cEmaitza: char ; begin clrscr; writeln ; writeln ( '///////////////////////////////////////////////////////////////////' ); writeln ; writeln ( 'Garaile ateratzeko, gehienez ' , JAURTIK_MAX, ' jaurtiketa dituzu' ); writeln ; EtsaienArmadaHasieratu; (* unitatean garaturik *) EtsaienArmadaKokatu; (* unitatean garaturik *) // EtsaienArmadaErakutsi; writeln ( 'Gudaren hasieran itsasoaren egoera hauxe da:' ); writeln ; ItsasoarenEgoeraHasieratu(ardItsasoarenEgoera); (* hasieran cLetra denak "X" eta boHartuta denak "FALSE" *) ItsasoaErakutsi(ardItsasoarenEgoera); writeln ; writeln ( 'ARMISTIZIOA:' ); writeln ( 'Amore eman eta bataila galdutzat jotzen baduzu, etsaien armada ikus dezakezu.' ); writeln ( 'Garaitu zaituen etsaien armadaren kokapena ikusi nahi duzu, "AR" erantzun. ' ); writeln ; iUrKont := 0 ; iOntziZatiak := 0 ; iJaurtiKont := 0 ; repeat if iUrKont >= 6 then begin TextColor(Blue); writeln ( 'Jaurtiketa okerrak askotan egin dituzu, armistizioa eskatzerik daukazu!!!' ); TextColor(Black); end ; iJaurtiKont := iJaurtiKont + 1 ; boJaurtiketaEgokia := FALSE ; repeat repeat write (iJaurtiKont: 3 , '. jaurtiketa egin (adibidez 3C koordenatuak, armistizioa eskatzeko "AR"): ' ); readln(sJaurtiketa); sJaurtiketa := upcase(sJaurtiketa); boJaurtiketaEgokia := fnboJaurtiketaAztertu(sJaurtiketa); until boJaurtiketaEgokia; boErrepikatuGabea := fnboErrepikatuGabea(sJaurtiketa, ardItsasoarenEgoera); until boErrepikatuGabea; if sJaurtiketa <> 'AR' then begin val (sJaurtiketa[ 1 ], iErrenkada); //writeln('iErrenkada = ', iErrenkada); cZutabea := sJaurtiketa[ 2 ]; cEmaitza := fncSuEgin(iErrenkada, cZutabea); (* unitatean garaturik *) case cEmaitza of { K, D, P edo X } 'K' : begin writeln (iErrenkada: 3 , cZutabea, ' ---> K, korazatua' ); iOntziZatiak := iOntziZatiak + 1 ; ardItsasoarenEgoera[iErrenkada,cZutabea].cLetra := 'K' ; ardItsasoarenEgoera[iErrenkada,cZutabea].boHartuta := TRUE ; end ; 'D' : begin writeln (iErrenkada: 3 , cZutabea, ' ---> D, destruktorea' ); iOntziZatiak := iOntziZatiak + 1 ; ardItsasoarenEgoera[iErrenkada,cZutabea].cLetra := 'D' ; ardItsasoarenEgoera[iErrenkada,cZutabea].boHartuta := TRUE ; end ; 'P' : begin writeln (iErrenkada: 3 , cZutabea, ' ---> P, itsaspekoa' ); iOntziZatiak := iOntziZatiak + 1 ; ardItsasoarenEgoera[iErrenkada,cZutabea].cLetra := 'P' ; ardItsasoarenEgoera[iErrenkada,cZutabea].boHartuta := TRUE ; end ; 'X' : begin writeln (iErrenkada: 3 , cZutabea, ' ---> URA' ); ardItsasoarenEgoera[iErrenkada,cZutabea].cLetra := 'u' ; ardItsasoarenEgoera[iErrenkada,cZutabea].boHartuta := TRUE ; iUrKont := iUrKont + 1 ; end ; end ; writeln ((JAURTIK_MAX-iJaurtiKont): 4 , ' jaurtiketa geratzen d(ir)a' ); writeln ; ItsasoaErakutsi(ardItsasoarenEgoera); writeln ; end ; until (iOntziZatiak = ARMADA_OSOA) or (iJaurtiKont = JAURTIK_MAX) or (sJaurtiketa = 'AR' ); writeln ; if sJaurtiketa = 'AR' then begin writeln ( 'ARMISTIZIOA, garaile atera diren etsaien ontziteria:' ); writeln ; EtsaienArmadaErakutsi; (* unitatean garaturik *) end else begin if (iOntziZatiak = ARMADA_OSOA) and (iJaurtiKont <= JAURTIK_MAX) then begin writeln (iJaurtiKont, ' jaurtiketekin etsaien armada osoa hondoratu dugunez, gerra irabazi duzu!!!' ); end else begin writeln (iJaurtiKont, ' jaurtiketa ondoren itsas-bataila galdu duzu!!!' ); writeln ( 'Garaitu zaituen etsaien ontziteria:' ); writeln ; EtsaienArmadaErakutsi; (* unitatean garaturik *) end ; end ; writeln ; writeln ( '///////////////////////////////////////////////////////////////////' ); writeln ; repeat until keypressed; end . |
ardItsasoarenEgoera karaktereen array horretan itsas-batailaren egoera gordeko dugu uneoro. Bataila hasi aurretik ItsasoarenEgoeraHasieratu prozedurak 6x6 arrayaren elementu guztien cLetra eremua X karakterez betetzen ditu, FALSE konstantez boHartuta eremuak betetzen ditu, iKolorea eremu guztiak beltzez eta iHondoa eremu guztiak grisez betetzen ditu.
Etsaien armada hondoratu nahian, 6x6 itsasoko koordenatu pare bat hautatzeko aukera izango dugu (5D bezalako karaktere-katea) eta koordenatu horiek fncSuEgin funtzioari pasatuz, honek jaurtiketaren emaitza itzuliko digu, eta, ondorioz ItsasoarenEgoeraHasieratu prozedurak bete dituen X guztietatik bat ordeztuko dugu. Arrayaren posizio horretako balio berria, honako hauetatik bat izango da:
- u ura, gure jaurtiketak huts egin du
- K korazatua, gure jaurtiketak korazatu baten zatia suntsitu du
- D destruktorea, gure jaurtiketak destruktore baten zatia suntsitu du
- P itsaspekoa, gure jaurtiketak itsaspekoa suntsitu eta hondoratu du
Etsaien armadak 3+3+2+2+2+1=13 zatiz osaturik dago, eta guztiak suntsitu arte itsas-bataila ez da bukatuko eta garaile aterako gara 19 jaurtiketa behar izan badugu (19 jaurtiketa edo gutxiago beharko dira itsas-bataila irabazteko). Dagozkigun 19 jaurtiketak agortzean, batailaren galtzaileak gu izango gara eta programa bukatuko da. Baina 19. jaurtiketa egin baino lehenago, bataila galdutzat jotzen badugu, armistizioa eskatu ahalko dugu (AR koordenatuak sartuz) eta etsaien ontziteria pantailaratu ondoren programa bukatuko da.
|
iruzkinik ez:
Argitaratu iruzkina
Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.