Учебный Проект. Релиз 7. Класс Computer2

Материал из wikiru.visual-prolog.com
Учебный Проект. Релиз 7
/******************************************
Copyright (c) 2007. Prolog Development Center
Written by: Victor Yukhtenko
 
Class computer2
******************************************/
class computer2:player
open core
 
predicates
    getPlayerDescriptor:(game::language_D)->string Descriptor.
 
end class computer2
 
implement computer2
    inherits genericComputer
open core
 
clauses
    new():-
        PolyLineBraneObj=polylineStrategy2::new(),
        setpolylineStrategy(PolyLineBraneObj).
 
clauses
   getPlayerDescriptor(game::en)=polylineStrategy2::playerDescriptorEn_C.
   getPlayerDescriptor(game::ru)=polylineStrategy2::playerDescriptorRu_C.
 
end implement computer2
 
/******************************************
  Class polylineStrategy2
******************************************/
class polylineStrategy2:polylineStrategy
open core
predicates
    classInfo : core::classInfo.
 
constants
    playerDescriptorEn_C="Computer: Prognosis within Limited Depth".
    playerDescriptorRu_C="Computer: Прогноз на заданную глубину".
 
end class polylineStrategy2
 
implement polylineStrategy2
open core, exception
 
constants
    className = "polylineStrategy2".
    classVersion = "1.0".
 
clauses
    classInfo(className, classVersion).
 
facts
    maxDepth_V:positive:=5.
    genericComputer_V:genericComputer:=erroneous.
 
clauses
    new():-
        defineSearchDepth().
 
clauses
    setGenericComputer(GenericComputerObj):-
        genericComputer_V:=GenericComputerObj.
 
predicates
    defineSearchDepth:().
clauses
    defineSearchDepth():-
        DepthStr=humanInterface::getInput(humanInterface::searchDepth_S,toString(maxDepth_V)),
        not(DepthStr=""),
        !,
        try
            maxDepth_V:=toTerm(DepthStr),
            if maxDepth_V mod 2 = 0 then
                maxDepth_V:=maxDepth_V+1
            end if    
        catch _TraceID1 do
            humanInterface::announce(humanInterface::errorMustBeNumber_S,""),
            defineSearchDepth()
        end try.
    defineSearchDepth().
 
clauses
    successfulStep(PolyLine)=BestMove:-
        BestMove=successfulStep(maxDepth_V,PolyLine).
 
predicates
    successfulStep: (positive Depth, juniourJudge::cell*)->juniourJudge::cell BestMove determ.
clauses
    successfulStep(Depth,PolyLine)=SafeMove:-
        genericComputer_V:stepCandidate(PolyLine,PolyLine1,SafeMove),
            isSafeMove(Depth,PolyLine,SafeMove,PolyLine1),
            !.
 
predicates
    isSafeMove:(positive Depth,juniourJudge::cell* PolyLine,juniourJudge::cell Move,juniourJudge::cell* PolyLineAfterMove) determ.
clauses
    isSafeMove(_Depth,PolyLine,Move,_PolyLine1):-  %this move wins
        list::isMember(Move, PolyLine),
        !.
    isSafeMove(Depth,_PolyLine,_Move,_PolyLine1):-  %it is safe until that depth
        Depth>maxDepth_V-1,
        !.
    isSafeMove(Depth,_PolyLine,_MoveIn,PolyLine1):-  %it is not loss move till the end of the depth limit
        not(_MoveOut=successfulStep(Depth+1,PolyLine1)).
 
clauses
    randomStep()=Cell:-
        findAll(NewCell,genericComputer_V:stepCandidate(juniourJudge::polyline_P,_Polyline1, NewCell),CellCandidateListWithDuplicates),
        CellCandidateList=list::removeDuplicates(CellCandidateListWithDuplicates),
        not(CellCandidateList=[]),
        NoOfVariants=list::length(CellCandidateList),
        ChoiceNo=math::random(NoOfVariants-1),
        Cell=list::nth(ChoiceNo+1,CellCandidateList).
 
end implement polylineStrategy2