Universität Ulm, Fakultät für Mathematik und Wirtschaftswissenschaften, SAI

SS 99 || Ferienprojekt zu Allgemeine Informatik II || Puzzle Library

MODULE GreedyPlayers


MODULE GreedyPlayers;

   IMPORT ChessClocks, Iterators, Puzzle, PuzzlePlayers, Services, Write;

   TYPE
      Player = POINTER TO PlayerRec;
      PlayerRec = RECORD (PuzzlePlayers.PlayerRec) END;

   VAR
      if: PuzzlePlayers.Interface;
      type: Services.Type; (* of Player *)

   PROCEDURE MakeMove(player: PuzzlePlayers.Player;
		      situation: Puzzle.Situation;
		      clock: ChessClocks.ChessClock;
		      game: Services.Object;
		      VAR move: Puzzle.Move): BOOLEAN;
      VAR
	 pl: Puzzle.Player;
	 it: Iterators.Iterator;
	 m, best: Puzzle.Move;
	 count: INTEGER;
	 value, maxval: INTEGER;

      PROCEDURE Value(m: Puzzle.Move) : INTEGER;
	 VAR
	    newsituation: Puzzle.Situation;
      BEGIN
	 Puzzle.CopySituation(newsituation, situation);
	 Puzzle.MakeMove(newsituation, m, pl);
	 RETURN Puzzle.NumberOfPieces(newsituation, pl) -
	        Puzzle.NumberOfPieces(newsituation, Puzzle.OtherPlayer(pl))
      END Value;

   BEGIN (* MakeMove *)
      ASSERT(~Puzzle.Finished(situation));
      pl := Puzzle.Onturn(situation);
      Puzzle.CreateIterator(it, situation, pl);
      maxval := MIN(INTEGER);
      WHILE Iterators.Get(it, m) DO
	 value := Value(m);
	 IF value > maxval THEN
	    best := m; maxval := value;
	 END;
      END;
      move := best;
      RETURN TRUE
   END MakeMove;

   PROCEDURE Accept(player: PuzzlePlayers.Player;
		    game: Services.Object): BOOLEAN;
   BEGIN
      RETURN TRUE
   END Accept;

   PROCEDURE GameOver(player: PuzzlePlayers.Player; game: Services.Object);
   BEGIN
   END GameOver;

   PROCEDURE Init;
      VAR
	 playersType: Services.Type;
   BEGIN
      NEW(if); if.makeMove := MakeMove;
      if.accept := Accept; if.gameOver := GameOver;
      Services.CreateType(type, "GreedyPlayers.Player", "PuzzlePlayers.Player");
   END Init;

   PROCEDURE Create(VAR player: PuzzlePlayers.Player);
      VAR
	 new: Player;
   BEGIN
      NEW(new);
      Services.Init(new, type);
      PuzzlePlayers.Init(new, if);
      player := new;
   END Create;

BEGIN
   Init;
END GreedyPlayers.

SS 99 || Ferienprojekt zu Allgemeine Informatik II || Puzzle Library

Andreas Borchert, 26. Juli 1999