Temporary_spy_manager.adb

with game_globals;  use game_globals;
with Text_Io; use Text_Io;
with Basic_Num_Io; use Basic_Num_Io;
with Sequential_Io;
with spelare1; with spelare2; with spelare3; with spelare4; with spelare5;
with spelare6; with spelare7; with spelare8; with spelare9; with spelare11;
with spelare12; with spelare13; with spelare15; with spelare16; with spelare17;
with spelare20; with spelare21; with spelare22; with spelare23; with spelare24;
with spelare25; with spelare26; with spelare27; with spelare28; with spelare29;
with spelare30; with spelare31; with spelare32; with spelare34; with spelare35;
with spelare36; with spelare40; with spelare41; with spelare42; with spelare43;
with spelare44; with spelare45; with spelare46; with spelare49; with spelare50;
with spelare51; with spelare52; with spelare53; with spelare55; with spelare57;
with spelare59; with spelare60; with spelare62; with spelare63; with spelare64;
with spelare65; with spelare68; with spelare69; with spelare71; with spelare72;
with spelare74; with spelare75; with spelare76; with spelare81; with spelare81;
with spelare47X;

procedure Temporary_Spy_Manager is
  type Playernumber is range 1 .. 90;
  type DoMatchesTable is array(1 .. 5000,1 .. 2) of Playernumber;
  type MoveHistory is array (1 .. 999) of Game_Globals.Move;
  DoMatches : DoMatchesTable;
  ForceMethod : Integer;
  NumMatches : Integer := 0;


-----------------------------------------------------------

  procedure Initialize is
  package FilePack is new Sequential_Io (Integer);
  Handle : FilePack.File_Type;
  Cnt : Integer := 1;
  Tmp : Integer;
  begin
  FilePack.Open (Handle,FilePack.IN_FILE,"temp_spy_manager.conversation");
  FilePack.Read(Handle,ForceMethod);

  while not FilePack.End_Of_File(Handle) loop
    FilePack.Read(Handle,Tmp);
    DoMatches(Cnt,1) := PlayerNumber (Tmp);
    FilePack.Read(Handle,Tmp);
    DoMatches(Cnt,2) := PlayerNumber (Tmp);
    Cnt := Cnt + 1;
  end loop;
  NumMatches := Cnt - 1;
  FilePack.Close (Handle);
  end Initialize;

-----------------------------------------------------------

  procedure GetName (Text : out Game_Globals.Playernametype;Player : in PlayerNumber) is
  begin
    Text := "                ";
    case Player is
      when 1 => Text(1..Spelare1.PlayerName'Last) := Spelare1.PlayerName;
      when 2 => Text(1..Spelare2.PlayerName'Last) := Spelare2.PlayerName;
      when 3 => Text(1..Spelare3.PlayerName'Last) := Spelare3.PlayerName;
      when 4 => Text(1..Spelare4.PlayerName'Last) := Spelare4.PlayerName;
      when 5 => Text(1..Spelare5.PlayerName'Last) := Spelare5.PlayerName;
      when 6 => Text(1..Spelare6.PlayerName'Last) := Spelare6.PlayerName;
      when 7 => Text(1..Spelare7.PlayerName'Last) := Spelare7.PlayerName;
      when 8 => Text(1..Spelare8.PlayerName'Last) := Spelare8.PlayerName;
      when 9 => Text(1..Spelare9.PlayerName'Last) := Spelare9.PlayerName;
      when 11 => Text(1..Spelare11.PlayerName'Last) := Spelare11.PlayerName;
      when 12 => Text(1..Spelare12.PlayerName'Last) := Spelare12.PlayerName;
      when 13 => Text(1..Spelare13.PlayerName'Last) := Spelare13.PlayerName;
      when 15 => Text(1..Spelare15.PlayerName'Last) := Spelare15.PlayerName;
      when 16 => Text(1..Spelare16.PlayerName'Last) := Spelare16.PlayerName;
      when 17 => Text(1..Spelare17.PlayerName'Last) := Spelare17.PlayerName;
      when 20 => Text(1..Spelare20.PlayerName'Last) := Spelare20.PlayerName;
      when 21 => Text(1..Spelare21.PlayerName'Last) := Spelare21.PlayerName;
      when 22 => Text(1..Spelare22.PlayerName'Last) := Spelare22.PlayerName;
      when 23 => Text(1..Spelare23.PlayerName'Last) := Spelare23.PlayerName;
      when 24 => Text(1..Spelare24.PlayerName'Last) := Spelare24.PlayerName;
      when 25 => Text(1..Spelare25.PlayerName'Last) := Spelare25.PlayerName;
      when 26 => Text(1..Spelare26.PlayerName'Last) := Spelare26.PlayerName;
      when 27 => Text(1..Spelare27.PlayerName'Last) := Spelare27.PlayerName;
      when 28 => Text(1..Spelare28.PlayerName'Last) := Spelare28.PlayerName;
      when 29 => Text(1..Spelare29.PlayerName'Last) := Spelare29.PlayerName;
      when 30 => Text(1..Spelare30.PlayerName'Last) := Spelare30.PlayerName;
      when 31 => Text(1..Spelare31.PlayerName'Last) := Spelare31.PlayerName;
      when 32 => Text(1..Spelare32.PlayerName'Last) := Spelare32.PlayerName;
      when 34 => Text(1..Spelare34.PlayerName'Last) := Spelare34.PlayerName;
      when 35 => Text(1..Spelare35.PlayerName'Last) := Spelare35.PlayerName;
      when 36 => Text(1..Spelare36.PlayerName'Last) := Spelare36.PlayerName;
      when 40 => Text(1..Spelare40.PlayerName'Last) := Spelare40.PlayerName;
      when 41 => Text(1..Spelare41.PlayerName'Last) := Spelare41.PlayerName;
      when 42 => Text(1..Spelare42.PlayerName'Last) := Spelare42.PlayerName;
      when 43 => Text(1..Spelare43.PlayerName'Last) := Spelare43.PlayerName;
      when 44 => Text(1..Spelare44.PlayerName'Last) := Spelare44.PlayerName;
      when 45 => Text(1..Spelare45.PlayerName'Last) := Spelare45.PlayerName;
      when 46 => Text(1..Spelare46.PlayerName'Last) := Spelare46.PlayerName;
      when 49 => Text(1..Spelare49.PlayerName'Last) := Spelare49.PlayerName;
      when 50 => Text(1..Spelare50.PlayerName'Last) := Spelare50.PlayerName;
      when 51 => Text(1..Spelare51.PlayerName'Last) := Spelare51.PlayerName;
      when 52 => Text(1..Spelare52.PlayerName'Last) := Spelare52.PlayerName;
      when 53 => Text(1..Spelare53.PlayerName'Last) := Spelare53.PlayerName;
      when 55 => Text(1..Spelare55.PlayerName'Last) := Spelare55.PlayerName;
      when 57 => Text(1..Spelare57.PlayerName'Last) := Spelare57.PlayerName;
      when 59 => Text(1..Spelare59.PlayerName'Last) := Spelare59.PlayerName;
      when 60 => Text(1..Spelare60.PlayerName'Last) := Spelare60.PlayerName;
      when 62 => Text(1..Spelare62.PlayerName'Last) := Spelare62.PlayerName;
      when 63 => Text(1..Spelare63.PlayerName'Last) := Spelare63.PlayerName;
      when 64 => Text(1..Spelare64.PlayerName'Last) := Spelare64.PlayerName;
      when 65 => Text(1..Spelare65.PlayerName'Last) := Spelare65.PlayerName;
      when 68 => Text(1..Spelare68.PlayerName'Last) := Spelare68.PlayerName;
      when 69 => Text(1..Spelare69.PlayerName'Last) := Spelare69.PlayerName;
      when 71 => Text(1..Spelare71.PlayerName'Last) := Spelare71.PlayerName;
      when 72 => Text(1..Spelare72.PlayerName'Last) := Spelare72.PlayerName;
      when 74 => Text(1..Spelare74.PlayerName'Last) := Spelare74.PlayerName;
      when 75 => Text(1..Spelare75.PlayerName'Last) := Spelare75.PlayerName;
      when 76 => Text(1..Spelare76.PlayerName'Last) := Spelare76.PlayerName;
      when 81 => Text(1..Spelare81.PlayerName'Last) := Spelare81.PlayerName;
      when 47 => Text(1..Spelare47X.PlayerName'Last) := Spelare47X.PlayerName;
      when others => NULL;
    end case;
  end GetName;

-----------------------------------------------------------

  function CallPlayFunc (Player : PlayerNumber;
                         MoveNum : Integer;
                         OppName : Game_Globals.Playernametype;
                         Opplast : Game_Globals.Move;
                         OppScore, MyScore :Integer) return Game_Globals.Move is
    TheMove : Game_Globals.Move;
  begin
    case Player is
      when 1 => TheMove := Spelare1.Player1(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 2 => TheMove := Spelare2.Player2(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 3 => TheMove := Spelare3.Player3(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 4 => TheMove := Spelare4.Player4(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 5 => TheMove := Spelare5.Player5(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 6 => TheMove := Spelare6.Player6(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 7 => TheMove := Spelare7.Player7(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 8 => TheMove := Spelare8.Player8(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 9 => TheMove := Spelare9.Player9(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 11 => TheMove := Spelare11.Player11(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 12 => TheMove := Spelare12.Player12(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 13 => TheMove := Spelare13.Player13(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 15 => TheMove := Spelare15.Player15(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 16 => TheMove := Spelare16.Player16(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 17 => TheMove := Spelare17.Player17(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 20 => TheMove := Spelare20.Player20(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 21 => TheMove := Spelare21.Player21(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 22 => TheMove := Spelare22.Player22(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 23 => TheMove := Spelare23.Player23(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 24 => TheMove := Spelare24.Player24(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 25 => TheMove := Spelare25.Player25(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 26 => TheMove := Spelare26.Player26(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 27 => TheMove := Spelare27.Player27(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 28 => TheMove := Spelare28.Player28(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 29 => TheMove := Spelare29.Player29(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 30 => TheMove := Spelare30.Player30(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 31 => TheMove := Spelare31.Player31(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 32 => TheMove := Spelare32.Player32(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 34 => TheMove := Spelare34.Player34(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 35 => TheMove := Spelare35.Player35(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 36 => TheMove := Spelare36.Player36(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 40 => TheMove := Spelare40.Player40(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 41 => TheMove := Spelare41.Player41(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 42 => TheMove := Spelare42.Player42(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 43 => TheMove := Spelare43.Player43(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 44 => TheMove := Spelare44.Player44(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 45 => TheMove := Spelare45.Player45(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 46 => TheMove := Spelare46.Player46(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 49 => TheMove := Spelare49.Player49(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 50 => TheMove := Spelare50.Player50(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 51 => TheMove := Spelare51.Player51(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 52 => TheMove := Spelare52.Player52(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 53 => TheMove := Spelare53.Player53(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 55 => TheMove := Spelare55.Player55(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 57 => TheMove := Spelare57.Player57(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 59 => TheMove := Spelare59.Player59(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 60 => TheMove := Spelare60.Player60(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 62 => TheMove := Spelare62.Player62(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 63 => TheMove := Spelare63.Player63(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 64 => TheMove := Spelare64.Player64(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 65 => TheMove := Spelare65.Player65(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 68 => TheMove := Spelare68.Player68(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 69 => TheMove := Spelare69.Player69(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 71 => TheMove := Spelare71.Player71(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 72 => TheMove := Spelare72.Player72(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 74 => TheMove := Spelare74.Player74(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 75 => TheMove := Spelare75.Player75(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 76 => TheMove := Spelare76.Player76(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 81 => TheMove := Spelare81.Player81(MoveNum,OppName,Opplast,OppScore,MyScore);
      when 47 => TheMove := Spelare47X.Player47(MoveNum,OppName,Opplast,OppScore,MyScore,ForceMethod);
      when others => put_line ("Error in CPF...");return game_globals.defect;
    end case;
    if not (TheMove in Game_Globals.Move) then raise CONSTRAINT_ERROR; end if;
    return TheMove;
  exception
    when CONSTRAINT_ERROR =>
      Put ("--==--==--==--==--==--");
      Put (Integer (Player),4);
      Put ("   ");
      raise;
    when PROGRAM_ERROR =>
      Put ("--==--==--==--==--==--");
      Put (Integer (Player),4);
      Put ("   ");
      raise;
  end CallPlayFunc;

-----------------------------------------------------------

  procedure PlayOneGame (Player1, Player2 : PlayerNumber; Points1, Points2 : in out Integer; Points1Part, Points2Part : in out Integer) is
    LastMove1, LastMove2 : Game_Globals.Move;
    Move1, Move2 : Game_Globals.Move;
    Name1 : Game_Globals.Playernametype;
    Name2 : Game_Globals.Playernametype;
    Failer : PlayerNumber;

  begin
    GetName (Name1,Player1);
    GetName (Name2,Player2);
    Points1 := 0;
    Points2 := 0;
    Points1Part := 0;
    Points2Part := 0;
    for Cnt in 1 .. 100 -- Game_Globals.Totalnofmoves
    loop
      Failer := Player1;
      Move1 := CallplayFunc (Player1,Cnt,Name2,LastMove2,Points2,Points1);
      Failer := Player2;
      Move2 := CallplayFunc (Player2,Cnt,Name1,LastMove1,Points1,Points2);

      Points1 := Points1 + Game_Globals.Payoffs(Move1,Move2).player1;
      Points2 := Points2 + Game_Globals.Payoffs(Move1,Move2).player2;
      if Cnt <= 20 then
        Points1Part := Points1Part + Game_Globals.Payoffs(Move1,Move2).player1;
        Points2Part := Points2Part + Game_Globals.Payoffs(Move1,Move2).player2;
      end if;
      LastMove1 := Move1;
      LastMove2 := Move2;
    end loop;
    exception
      when CONSTRAINT_ERROR =>
        Put ("--==--==--==--==--==--");
        Put (Integer (Failer),4);
        Put ("   ");
        raise;
      when PROGRAM_ERROR =>
        Put ("--==--==--==--==--==--");
        Put (Integer (Failer),4);
        Put ("   ");
        raise;
  end PlayOneGame;

-----------------------------------------------------------

  procedure PlayOneGameFull (Player1, Player2 : PlayerNumber; P1 : in out Integer;Points1, Points2 : in out Integer; Points1Part, Points2Part : in out Integer;MHist : in out MoveHistory) is
    LastMove1, LastMove2 : Game_Globals.Move;
    Move1, Move2 : Game_Globals.Move;
    Name1 : Game_Globals.Playernametype;
    Name2 : Game_Globals.Playernametype;
    P2 : Integer;
    Failer : PlayerNumber;

  begin
    GetName (Name1,Player1);
    GetName (Name2,Player2);
    Points1 := 0;
    Points2 := 0;
    P1 := 0;
    P2 := 0;
    Points1Part := 0;
    Points2Part := 0;
    for Cnt in 1 .. 999 -- Game_Globals.Totalnofmoves
    loop
      Failer := Player1;
      if Player1 /= 47 then
        Move1 := CallplayFunc (Player1,Cnt,Name2,LastMove2,P2,P1);
      else
        Move1 := MHist(Cnt);
      end if;
      Failer := Player2;
      Move2 := CallplayFunc (Player2,Cnt,Name1,LastMove1,P1,P2);

    if Player1 /= 47 then MHist(Cnt) := Move1; end if;
      P1 := P1 + Game_Globals.Payoffs(Move1,Move2).player1;
      P2 := P2 + Game_Globals.Payoffs(Move1,Move2).player2;
      if Cnt <= 100 then
        Points1 := Points1 + Game_Globals.Payoffs(Move1,Move2).player1;
        Points2 := Points2 + Game_Globals.Payoffs(Move1,Move2).player2;
      end if;
      if Cnt <= 20 then
        Points1Part := Points1Part + Game_Globals.Payoffs(Move1,Move2).player1;
        Points2Part := Points2Part + Game_Globals.Payoffs(Move1,Move2).player2;
      end if;
      LastMove1 := Move1;
      LastMove2 := Move2;
    end loop;
    exception
      when CONSTRAINT_ERROR =>
        Put ("--==--==--==--==--==--");
        Put (Integer (Failer),4);
        Put ("   ");
        raise;
      when PROGRAM_ERROR =>
        Put ("--==--==--==--==--==--");
        Put (Integer (Failer),4);
        Put ("   ");
        raise;
  end PlayOneGameFull;

-----------------------------------------------------------

  procedure PlayOneGameOutput (Player1, Player2 : PlayerNumber; Delimiter : Character) is
    Points1, Points2 : Integer;
    Points1Part, Points2Part : Integer;

  begin
    Put (Integer (Player1),2);
    Put (Integer (Player2),3);
    PlayOneGame (Player1,Player2,Points1,Points2,Points1Part,Points2Part);
    Put ("->+.");
    Put (Integer (Player1),2);
    Put (Integer (Player2),3);
    if Player2 = 47 then
      Put(ForceMethod,3);
    else
      Put(Integer(0),3);
    end if;
    Put (" ");
    Put (" =");
    Put (Delimiter);
    Put (" ");
    Put(Points1,5);Put(" ");Put(Points2,5);Put(" ");
    Put(Points1Part,5);Put(" ");Put(Points2Part ,5);Put(" ");
    New_Line;
  end PlayOneGameOutput;

-----------------------------------------------------------

  procedure PlayOneGameFullOutput (Player1, Player2 : PlayerNumber) is
    TotPoints1, TotPoints2 : Integer;
    Points11, Points21 : Integer;
    Points11Part, Points21Part : Integer;
    Points12, Points22 : Integer;
    Points12Part, Points22Part : Integer;
    Points11x, Points21x : Integer;
    Points11Partx, Points21Partx : Integer;
    Points12x, Points22x : Integer;
    Points12Partx, Points22Partx : Integer;

    MHist1, MHist2 : MoveHistory;

  begin
    Put (Integer (Player1),2);
    Put (Integer (Player2),3);
    PlayOneGame (81,Player2,Points11,Points21,Points11Part,Points21Part);
    PlayOneGame (81,Player1,Points11,Points21,Points11Part,Points21Part);
    PlayOneGameFull (Player1,Player2,TotPoints1,Points11x,Points21x,Points11Partx,Points21Partx,MHist1);
    PlayOneGameFull (47,Player2,TotPoints1,Points11,Points21,Points11Part,Points21Part,MHist1);
    PlayOneGameFull (Player1,Player2,TotPoints2,Points12x,Points22x,Points12Partx,Points22Partx,MHist2);
    PlayOneGameFull (47,Player2,TotPoints2,Points12,Points22,Points12Part,Points22Part,MHist2);
    Put (">;->");
    Put (Integer (Player2),2);
    Put (" ");
    Put(Points11x,5);Put(" ");Put(Points21x,5);Put(" ");
    Put(Points11Partx,5);Put(" ");Put(Points21Partx ,5);Put(" ");
    Put(Points12x,5);Put(" ");Put(Points22x,5);Put(" ");
    Put(Points12Partx,5);Put(" ");Put(Points22Partx ,5);Put(" ");
    New_Line;
    Put ("--.;");
    Put (Integer (Player2),2);
    Put (" ");
    Put(Points11,5);Put(" ");Put(Points21,5);Put(" ");
    Put(Points11Part,5);Put(" ");Put(Points21Part ,5);Put(" ");
    Put(Points12,5);Put(" ");Put(Points22,5);Put(" ");
    Put(Points12Part,5);Put(" ");Put(Points22Part ,5);Put(" ");
    Put(TotPoints1,5);Put(" ");Put(TotPoints2,5);Put(" ");
    Put("|");
    for Cnt in MHist1'Range loop
      if MHist1(Cnt) = Game_Globals.Cooperate then
        Put ("1");
      else
        Put ("0");
      end if;
    end loop;
    Put("|");
    for Cnt in MHist2'Range loop
      if MHist2(Cnt) = Game_Globals.Cooperate then
        Put ("1");
      else
        Put ("0");
      end if;
    end loop;
    New_Line;
    Put("|");
  end PlayOneGameFullOutput;

-----------------------------------------------------------

  procedure PlayTheGame is
    Player1, Player2 : PlayerNumber;

  begin
    if ForceMethod = -1 then
      for Cnt in 1 .. NumMatches
      loop
        Player1 := DoMatches(Cnt,1);
        Player2 := DoMatches(Cnt,2);
        PlayOneGameFullOutput (Player1,Player2);
      end loop;
    else
      for Cnt in 1 .. NumMatches
      loop
        Player1 := DoMatches(Cnt,1);
        Player2 := DoMatches(Cnt,2);
        PlayOneGameOutput (Player1,Player2,'>');
      end loop;
      for Cnt in reverse 1 .. NumMatches
      loop
        Player1 := DoMatches(Cnt,1);
        Player2 := DoMatches(Cnt,2);
        PlayOneGameOutput (Player1,Player2,'<');
      end loop;
    end if;
    Put (".+<-");
  end PlayTheGame;

-----------------------------------------------------------

begin
  Initialize;
  PlayTheGame;
end;

Tillbaka till huvudsidan