http://www.adaconcept.com/programs/gyerekcsomagos/nyolc_kiralyno.adb
with Ada.Text_IO;


with Szamrendszerek.Vegyes_Alapu_Szamrendszer.Teszt;                                                                                                                                                   -- ez elerhetove teszi a "szolo-csomagjait" is
with Szamrendszerek.Vegyes_Alapu_Szamrendszer;                                                                                                                                                         -- az elozo with miatt ez a csomag is elerheto, de a kod olvashatosaganak noveleses erdekeben, mindig igyekezzunk with -elni azokat a csomagokat, amelyeket hasznalunk

procedure nyolc_kiralyno is
   use Szamrendszerek;                                                                                                                                                                                 -- use -olni "lokalisan" is lehet


   Kiralynok : Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus; -- := Vegyes_Alapu_Szamrendszer.Letrehoz((0..7 => 8));                                                                               -- Ada 2005 -tol egy limited tipusu valtozot igy is inicializalhatunk,  "Konstruktor" hivas (letrehozunk egy (maximum) 8 szamjegybol allo 8 -as alapu szamrendszerben felirt szamot)
   -- Figyeljuk meg, hogy a kodban szamos helyen a kiralyno helyett a vezer szot hasznaljuk (amikor egy nagyobb programot irunk mindig fontoljuk meg
   -- milyen terminologiat hasznalunk, mert egy kelloen hozza nem erto ember szamara ez felrevezeto lehet)


   -- Megjeleniti a "sakktablat" rajta a vezerekkel
   procedure Kirajzol(Kiralynok : Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus) is
      Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus := Vegyes_Alapu_Szamrendszer.Szamjegyek(kiralynok);
   begin

      for i in reverse 0 .. 7 loop
         for j in reverse Poziciok'Range loop

            if Poziciok(j) = i then              -- ahol van vezer
               Ada.Text_IO.Put(" V ");
            else                                 -- ahol nincs vezer
               Ada.Text_IO.Put(" - ");
            end if;

         end loop;
         Ada.Text_IO.Put(Natural'Image(i + 1));                                                                                                                                                        -- mindig legyunk kovetkezetesek abban, hogy a kiirast csusztatjuk el vagy az indexelest
         Ada.Text_IO.New_Line;
      end loop;


      Ada.Text_IO.Put_Line(" a " & " b " & " c " & " d " & " e " & " f " & " g " & " h ");                                                                                                             -- ez a sor egeszen meglepo :)  (altalaban talblazatok "kirajzolasakor" latni ilyet...)


      Ada.Text_IO.Put_Line("egy megoldas: ");
      for i in Poziciok'Range loop
         Ada.Text_IO.Put("[" & Character'Val(Character'Pos('a') + i ) & Natural'Image(Poziciok(Poziciok'Last - i) + 1 ) & "] ");
      end loop;
      Ada.Text_IO.New_Line;

   end Kirajzol;


   procedure Keres(Kiralynok_Pozicioi : Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus; Akt_Oszlop : in out Natural; megvan : out Boolean) is
      Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus := Vegyes_Alapu_Szamrendszer.Szamjegyek(Kiralynok_Pozicioi);

      function Kiralynok_Utik_Egymast(Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus; o : Natural) return Boolean is
         Vissza : Boolean := False;
         i : integer;
      begin
         i := o;
         while not Vissza and i < Poziciok'Last loop
            if   Poziciok(i + 1) = Poziciok(o)
              or Poziciok(i + 1) = Poziciok(o) - ( i + 1 - o )
              or Poziciok(i + 1) = Poziciok(o) + ( i + 1 - o ) then
               Vissza := True;
            end if;

            i := i + 1;
         end loop;

         return Vissza;
      end Kiralynok_Utik_Egymast;

   begin

      -- linearis kereses

      Akt_Oszlop := Akt_Oszlop + 1;
      Megvan := True;

      while megvan and Akt_Oszlop /= 0 loop
         megvan :=  not Kiralynok_Utik_Egymast(Poziciok, Akt_Oszlop - 1);

         Akt_Oszlop := Akt_Oszlop - 1;
      end loop;

   end Keres;


   -- Probaljuk az elnevezeseinket a konkret feladathoz igazitani
   procedure Lep(Szam : in out Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus; Hanyadik_Indexu_Helyierteken : in out Natural; Mennyivel : Natural := 1) renames Vegyes_Alapu_Szamrendszer.Novel;


   procedure Novel(Kiralynok : in out Vegyes_Alapu_Szamrendszer.Vegyes_Alapu_Szam_Tipus; Melyik_Oszlopban : in out Natural) is
      Vege : Boolean;
   begin
      Vege := True;
      while Vege and Melyik_Oszlopban < Vegyes_Alapu_Szamrendszer.Legmagasabb_Helyiertek_Indexe(Kiralynok) loop
         Lep(Kiralynok, Melyik_Oszlopban);
         Vege := Vegyes_Alapu_Szamrendszer.Tulcsordulas(Kiralynok);
      end loop;
   end Novel;


   procedure Osszes_Lehetseges_Modon_Feltesz is
      Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus := Vegyes_Alapu_Szamrendszer.Szamjegyek(Kiralynok);
      Akt_Oszlop : Natural;                      -- az az oszlop, amelyikben eppen megtoljuk a kiralynot
      Megvan : Boolean;
   begin

      Akt_Oszlop := Poziciok'Last;
      Keres(Kiralynok, Akt_Oszlop, megvan);

      while not Megvan and not Vegyes_Alapu_Szamrendszer.Tulcsordulas(Kiralynok) loop
         -- delay 0.5;                                                                                                                                                                                 --| szandekosan a kodban hagyott tesztelest segito komment
         -- Kirajzol(Kiralynok);                                                                                                                                                                       --|
         Novel(Kiralynok, Akt_Oszlop);
         if not Vegyes_Alapu_Szamrendszer.Tulcsordulas(Kiralynok) then
            Keres(Kiralynok, Akt_Oszlop, megvan);
         end if;

      end loop;
      Kirajzol(Kiralynok);

   end Osszes_Lehetseges_Modon_Feltesz;


   procedure Osszes_Lehetseges_Megoldas_Megszamlalasa is
      Poziciok : Vegyes_Alapu_Szamrendszer.Szamjegyek_Tomb_Tipus := Vegyes_Alapu_Szamrendszer.Szamjegyek(Kiralynok);
      Akt_Oszlop : Natural;
      db : Natural;
      Megvan : Boolean;
   begin

      Akt_Oszlop := Poziciok'Last;
      db := 0;                                                                                                                                                                                         -- a kezdo-ertek-adast irjuk minel kozelebb a valtozo felhaszanlasi helyehez
      while not Vegyes_Alapu_Szamrendszer.Tulcsordulas(Kiralynok) loop
         Keres(Kiralynok, Akt_Oszlop, megvan);

         if megvan then
            db :=db + 1;
         end if;

         Novel(Kiralynok, Akt_Oszlop);
      end loop;

      Ada.Text_IO.Put_Line("A lehetseges megoldasok szama:" & Natural'Image(db));

   end Osszes_Lehetseges_Megoldas_Megszamlalasa;


begin
   Ada.Text_IO.Put_Line("Program indul");

   Szamrendszerek.Vegyes_Alapu_Szamrendszer.Teszt.Teszt;                                                                                                                                               -- a csomag tesztelese


   -- "Konstruktor" hivas (letrehozunk egy (maximum) 8 szamjegybol allo 8 -as alapu szamrendszerben felirt szamot)
   Vegyes_Alapu_Szamrendszer.Letrehoz(kiralynok, (0..7 => 8));

   Vegyes_Alapu_Szamrendszer.Beallit(kiralynok, (0,0,0,0,0,0,0,0));                                                                                                                                     -- a tomb 0 -atol indexelodik!!!

   Osszes_Lehetseges_Modon_Feltesz;                                                                                                                                                                    -- Visszalepeses kereses
   Osszes_Lehetseges_Megoldas_Megszamlalasa;                                                                                                                                                           -- Visszalepeses szamlalas

   Ada.Text_IO.Put_Line("Program vege");
end nyolc_kiralyno;