All pastes #1409495 Raw Edit

Pro.-Kurs II 1.1 Rev 5

public text v1 · immutable
#1409495 ·published 2009-05-01 15:46 UTC
rendered paste body
with Ada.Text_IO; use Ada.Text_IO;
--  with Ada.Float_Text_IO; use Ada.Float_Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
--  with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;

procedure Connect_Four is

   --  0 ist ein leeres Feld, 1 und 2 die jeweiligen Spielsteine
   type Int_Array_2D is array (Natural range <>, Natural range <>) of
         Integer range 0 .. 2;
   --  Das Array, dass das Spielfeld enthealt (duh)
   Spielfeld : Int_Array_2D (1 .. 7, 1 .. 6) := (others => (others => 0));
   --  Tab : constant Character := Character'Val (09);
   Quot : constant Character := Character'Val (34);
   TMP : Integer := 0;
   X : Integer;
   TMP2 : Boolean := False;
   Raus_Hier : Boolean := False;

   
   procedure Reset_Spielfeld (Feld : in out Int_Array_2D) is
   begin
      Feld :=  (others => (others => 0));
   end Reset_Spielfeld;
   
   
   function Feld_Voll (Feld : Int_Array_2D) return Boolean
   is
   begin
      for i in 1 .. 7 loop
         for j in 1 .. 6 loop
            if Feld (i, j) = 0 then
               return False;
            end if;
         end loop;
      end loop;
      return True;
   end Feld_Voll;
   
   --  Gibt das Spielfeld aus.
   procedure Print_Spielfeld (Feld : Int_Array_2D) is
   begin
      --  Nummerierung
      New_Line; New_Line; 
      for i in 1 .. 7 loop
         Put (i'Img);
      end loop;
      
      New_Line;
      
      --  Trennlinie
      for i in 1 .. 14 loop
         Put ('-');
      end loop;
      
      New_Line;
      
      --  Das Spielfeld
      for i in reverse 1 .. 6 loop
         for j in 1 .. 7 loop
            Put (' ');
            Put (Feld (j, i), 0);
         end loop;
         New_Line;
      end loop;
      New_Line; New_Line; 
   end Print_Spielfeld;

   --  Prueft einen Zug auf seine Gueltigkeit und fuehrt in ggf. aus
   procedure Zug (X : in Integer;
                  Stein : in Integer;
                  Feld : in out Int_Array_2D) is
      Gezogen : Boolean := False;
   begin
      if (X not in 1 .. 7) or (Stein not in 1 .. 2) then
         Put_Line ("Zug ungueltig. DB verstaendigen ;-)");
         return;
      end if;
      
      --  wenn das Feld leer ist, wird der jeweilige Stein da hingesetzt
      for i in 1 .. 6 loop
         if Feld (X, i) = 0 then
            Feld (X, i) := Stein;
            Gezogen := True;
            TMP2 := True;
            exit;
         end if;
      end loop;
      --  wenn die Reihe voll ist...
      if Gezogen = False then
         New_Line;
         Put ("Ungueltiger Zug! Reihe voll!");
         New_Line;
         TMP2 := False;
      end if;
   end Zug;
   
   --  fragt beim Spieler eine Spalte ab und schmeisst da einen Stein rein
   procedure Zug_Machen (Stein : in Integer;
               Feld : in out Int_Array_2D) is
      X : Integer;
   begin
      Get (X);
      if X /= 0 then
         Raus_Hier := False;
         if (X not in 1 .. 7) or (Stein not in 1 .. 2) then
            Put_Line ("Zug ungueltig. DB verstaendigen ;-)");
            return;
         else
            Zug (X, Stein, Feld);
         end if;
      else
         Raus_Hier := True;
      end if;
   end Zug_Machen;
   
   --  Unerprueft in 4 Richtungen und in die 4 Richtungen der Diagonale, ob es
   --  schon eine Vierer-Reihe gibt.
   function Wer_Gewinnt (Feld : Int_Array_2D)
                           return Integer is
   begin
      for i in 1 .. 7 loop
         for j in 1 .. 6 loop
            if Feld (i, j) /= 0 then
               --  ueberpruft nach links, ... 
               if i + 3 <= 7 then
                  if (Feld (i, j) = Feld (i + 1, j)) and
                     (Feld (i, j) = Feld (i + 2, j)) and
                     (Feld (i, j) = Feld (i + 3, j)) then
                     return Feld (i, j);
                  end if;
               end if;
               
               --  ... ueberpruft nach rechts
               if i - 3 >= 1 then
                  if (Feld (i, j) = Feld (i - 1, j)) and
                     (Feld (i, j) = Feld (i - 2, j)) and
                     (Feld (i, j) = Feld (i - 3, j)) then
                     return Feld (i, j);
                  end if;
               end if;
               
               --  ... ueberpruft nach unten .. 
               if j + 3 <= 6 then
                  if (Feld (i, j) = Feld (i, j + 1)) and
                     (Feld (i, j) = Feld (i, j + 2)) and
                     (Feld (i, j) = Feld (i, j + 3)) then
                     return Feld (i, j);
                  end if;
               end if;
               
               --  ... ueberpruft nach oben
               if j - 3 >= 1 then
                  if (Feld (i, j) = Feld (i, j - 1)) and
                     (Feld (i, j) = Feld (i, j - 2)) and
                     (Feld (i, j) = Feld (i, j - 3)) then
                     return Feld (i, j);
                  end if;
               end if;
               
               --  ueberpruft in alle 4 richtungen in der Diagonale
               if (i + 3 <= 7) and (j + 3 <= 6) then
                  if (Feld (i, j) = Feld (i + 1, j + 1)) and
                     (Feld (i, j) = Feld (i + 2, j + 2)) and
                     (Feld (i, j) = Feld (i + 3, j + 3)) then
                     return Feld (i, j);
                  end if;
               end if;
               
               
               if (i - 3 >= 1) and (j + 3 <= 6) then
                  if (Feld (i, j) = Feld (i - 1, j + 1)) and
                     (Feld (i, j) = Feld (i - 2, j + 2)) and
                     (Feld (i, j) = Feld (i - 3, j + 3)) then
                     return Feld (i, j);
                  end if;
               end if;
               
               
               if (i + 3 <= 7) and (j - 3 >= 1) then
                  if (Feld (i, j) = Feld (i + 1, j - 1)) and
                     (Feld (i, j) = Feld (i + 2, j - 2)) and
                     (Feld (i, j) = Feld (i + 3, j - 3)) then
                     return Feld (i, j);
                  end if;
               end if;
               
               
               if (i - 3 >= 1) and (j - 3 >= 1) then
                  if (Feld (i, j) = Feld (i - 1, j - 1)) and
                     (Feld (i, j) = Feld (i - 2, j - 2)) and
                     (Feld (i, j) = Feld (i - 3, j - 3)) then
                     return Feld (i, j);
                  end if;
               end if;
               
            end if;
         end loop;
      end loop;
      return 0;
   end Wer_Gewinnt;
   
   --  Das Spiel kann beginnen!
   procedure Spielen (Feld : in out Int_Array_2D) is
      Winner : Integer := 0;
      Player : Integer;
   begin
   --  Die TUI
      New_Line;
      Put_Line ("Vier gewinnt. Die Regeln duerften bekannt sein ;-)");
      Put_Line ("2 Spieler, " & Quot & "1" & Quot & " und " & Quot & "2"
                  & Quot & ".");
      New_Line;
      Put_Line ("Bitte waehlen Sie die Spiel-Modi.");
      Put_Line ("(1) fuer Mensch-vs-Mensch-Modus.");
      Put_Line ("(2) fuer Mensch-vs-Maschiene-Modus.");
      New_Line;
      Put_Line ("(0) zum Beenden (ueberall im Spiel moeglich).");
      New_Line;
      Get (X);
      if X = 1 then
         --  Mensch-vs-Mensch-Modus. die Schleife laeft so lange, biss jemand
         --  gewonnen hat, 0 gedrueckt hat oder das Spielfeld voll ist.
         loop
            Player := (TMP mod 2) + 1;
            --  setzt den Zaeler zurueck, damit er nicht aus dem Zahlenbereich
            --  herausfaellt
            if TMP = 21011987 then
               TMP := 1;
            end if;
            
            
            Print_Spielfeld (Feld);
            Put ("Spieler " & Player'Img & ", machen Sie ihren Zug.  ");
            Zug_Machen (Player, Feld);
            if Wer_Gewinnt (Feld) /= 0 then
               Winner := Wer_Gewinnt (Feld);
               exit;
            end if;
            
            if TMP2 then
               TMP := TMP + 1;
            end if;
            
            if Raus_Hier or (Feld_Voll (Feld)) then
               exit;
            end if;
         end loop;
            
         if Wer_Gewinnt (Feld) /= 0 then
            Put ("Glueckwunsch, Spieler" & Winner'Img &
               " , Sie haben gewonnen!!");
            Print_Spielfeld (Feld);
         end if;
      elsif X = 2 then
         Put_Line ("Noch nicht implementiert. Tut mir leid.");
      end if;
   end Spielen;
   
begin

   --  Spielen (Spielfeld);
   
   Spielfeld := ((1,1,1,1,1,1,1),
                 (1,1,1,1,1,1,1),
                 (1,1,1,1,1,1,1),
                 (1,1,1,1,1,1,1),
                 (1,1,1,1,1,1,1),
                 (1,1,1,1,1,1,1));

exception when Device_Error =>
   New_Line;
   Put_Line ("SciTE gibt unter Linux keine Tastatureingaben"
            & " an ADA-Programme weiter >:-(");
   New_Line;
end Connect_Four;