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