All pastes #1408699 Raw Edit

Pro.-Kurs II 1.1

public text v1 · immutable
#1408699 ·published 2009-04-30 18:10 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

   --  o 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;

   
   procedure Reset_Spielfeld (Feld : in out Int_Array_2D) is
   begin
      Feld :=  (others => (others => 0));
   end Reset_Spielfeld;
   
   --  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;
      
      
      for i in 1 .. 6 loop
         if Feld (X, i) = 0 then
            Feld (X, i) := Stein;
            Gezogen := True;
            exit;
         end if;
      end loop;
      if Gezogen = False then
         New_Line;
         Put ("Ungueltiger Zug! Reihe voll!");
         New_Line;
      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 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;
   end Zug_Machen;
   
   --  
   --  i = x j = y
   --  Ist das spiel schon beendet?
   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
               --  zuerst 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;
               --  ... dann 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;
               --  ... und am Ende diagonal nach einem Sieg pruefen
               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;
            end if;
         end loop;
      end loop;
      return 0;
   end Wer_Gewinnt;
   
   procedure Spielen (Feld : in out Int_Array_2D) is
      Winner : Integer := 0;
      Player : Integer;
   begin
      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;
      Get (X);
      if X = 1 then
         loop
            Player := (TMP mod 2) + 1;
            
            if TMP = 100 then
               TMP := 0;
            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;
            TMP := TMP + 1;
         end loop;
         Put ("Glueckwunsch, " & Winner'Img & " , Sie haben gewonnen!!");
      elsif X = 2 then
         Put_Line ("Noch nicht implementiert. Tut mir leid.");
      end if;
   end Spielen;
   
begin
   --  Print_Spielfeld (Spielfeld);
   --  for i in 1 .. 4 loop
      --  Zug (1, 2, Spielfeld);
      --  Print_Spielfeld (Spielfeld);
   --  end loop;
   --  Zug_Machen (1, Spielfeld);
   --  Print_Spielfeld (Spielfeld);
   --  Put (Wer_Gewinnt (Spielfeld));
   Spielen (Spielfeld);
end Connect_Four;