Учебный Проект. Релиз 1: различия между версиями

Материал из wikiru.visual-prolog.com

м
Строка 271: Строка 271:


=Ссылки=
=Ссылки=
[[Category:Примеры]]
[[Category:Проекты]]
[[Category:Игры]]
[[Category:Игры]]
[http://www.progz.ru/forum/index.php?showtopic=34097&pid=153443&st=0&#entry153443#2 Первая публикация текста]
[http://www.progz.ru/forum/index.php?showtopic=34097&pid=153443&st=0&#entry153443#2 Первая публикация текста]

Версия 21:12, 3 октября 2009

Первая версия Учебного проекта, функциональной идеей которого является простая игра.

Правила игры ...

Цель

Демонстрация простейших приемов программирования на языке Visual Prolog.

Особенности Release 1

  • Автор: Елена Ефимова
  • Источник: http://www.progz.ru/forum/index.php?showtopic=34097&pid=153443&st=0&#entry153443#2
  • В данной версии размер поля устновлен 5х6 точек.
  • В силу неэффективного алгоритма игры компьютера не рекомендуется устанавливать размер поля более 36 клеток (6x6, например).

Установка

Для помещения игры в проект необходимо:

  • Создать проект с пользовательским интерфейсом типа console
  • В построенном проекте заменить полностью код файла "main.pro" кодом, предложенным ниже (для версий 7.2 и 7.1 следует взять соответствующий код ниже)
  • При построении проекта ответить на предложение о включении дополнительных пакетов в проект "Add All".
/*****************************************************************************
игрок, который "замыкает" траекторию 
(т.е. ходит в точку на существующей ломаной),
выигрывает
Автор: Елена Ефимова
Совместимо с версией VIP 7.2
******************************************************************************/
goal
    mainExe::run(main::run).
 
 
implement main
    open core, console
 
constants
    className = "PolyLine".
    classVersion = "1.0".
 
clauses
    classInfo(className, classVersion).
 
domains
    cell = c(unsigned16, unsigned16).
    cells = cell*.
 
class predicates
    wins: (positive, positive, cells, cells) nondeterm (i,i,i,o).
clauses
    wins(_Player1, _Player2, PolyLine, PolyLine1):-
        step(PolyLine, PolyLine1, Cell),
        list::isMember(Cell, PolyLine).
    wins(Player1, Player2, PolyLine, PolyLine1):-
        step(PolyLine, PolyLine1, _),
        not(wins(Player2, Player1, PolyLine1, _)).
 
class predicates
    move: (positive, cells).
clauses
    move(2, PolyLine):-
        step(PolyLine, PolyLine1, Cell),
        list::isMember(Cell, PolyLine),
        !,
        show(PolyLine1),
        setLocation(console_native::coord(0, 14)),
        write("Computer Won!\n\n", PolyLine1).
    move(2, PolyLine):-
        wins(2, 1, PolyLine, PolyLine1),
        !,
        move(1, PolyLine1).
    move(2, PolyLine):-
        step(PolyLine, PolyLine1, _),
        !,
        move(1, PolyLine1).
    move(1, PolyLine):-
        show(PolyLine),
        setLocation(console_native::coord(0, 14)),
        write(PolyLine),
        std::repeat(),
            write( "\n\nIt is your turn.\nEnter the new cell as c(2,3): "),
            hasDomain(cell, К),
            К = read(), 
            clearInput(),
        step(PolyLine, PolyLine1, К),
        !,
        if list::isMember(К, PolyLine) then
            write("\nCongratulations! You have won!")
        else
            move(2, PolyLine1)
        end if.
    move(_, _).
 
class predicates
    step: (cells, cells, cell) nondeterm (i,o,o) (i,o,i).
clauses
    step([A, B | PolyLine], [X, A, B | PolyLine], X):-
        candidate(A, X),
        not(X = B).
    step(PolyLine, PolyLine1, X):-
        PolyLine2 = list::reverse(PolyLine),
        PolyLine2 = [A, B | _],
        candidate(A, X),
        not(X = B),
        PolyLine1 = list::append(PolyLine, [X]).
 
class predicates
    candidate: (cell, cell) nondeterm (i,o) (i,i).
clauses
    candidate(c(X, Y), c(X - 1, Y)):- X > 1.
    candidate(c(X, Y), c(X + 1, Y)):- X < 6.
    candidate(c(X, Y), c(X, Y - 1)):- Y > 1.
    candidate(c(X, Y), c(X, Y + 1)):- Y < 5.
 
class predicates
    show: (cells).
clauses
    show(PolyLine):-
        clearOutput(),
        foreach I = std::fromTo(1, 6) do
            setLocation(console_native::coord(3*I, 0)), write(I)
        end foreach,
        foreach J = std::fromTo(1, 5) do
            setLocation(console_native::coord(0, 2*J)), write(J)
        end foreach,
        foreach c(X, Y) = list::getMember_nd(PolyLine) do
            setLocation(console_native::coord(3*X, 2*Y)), write("*")
        end foreach.
 
clauses
    run():-
        init(),
        write("Wich player moves first? (1 - human, 2 - computer): "),
        Player = read(),
        clearInput(),
        if Player = 1 then
            write("Enter the start  of the line as  c(3,3): "),
            hasDomain(cell, К1),
            К1 = read(), 
            clearInput(),
            write("Enter the end of the line: "),
            hasDomain(cell, К2),
            К2 = read(), 
            clearInput(),
            move(2, [К1, К2])
        else
            move(1, [c(3, 3), c(4, 3)])
        end if,
        _ = readLine().
 
end implement main
/******************************************
игрок, который "замыкает" траекторию 
(т.е. ходит в точку на существующей ломаной),
выигрывает
Автор: Елена Ефимова
Совместимо с версией VIP 7.1
*******************************************/
goal
    mainExe::run(main::run).
 
 
implement main
    open core, console
 
constants
    className = "Ползунок".
    classVersion = "1.0".
 
clauses
    classInfo(className, classVersion).
 
domains
клетка = к(unsigned16, unsigned16).
клетки = клетка*.
 
class predicates
    выигр: (positive, positive, клетки, клетки) nondeterm (i,i,i,o).
    шаг: (клетки, клетки, клетка) nondeterm (i,o,o) (i,o,i).
    сдвиг: (клетка, клетка) nondeterm (i,o) (i,i).
    ход: (positive, клетки).
    отобразить: (клетки).
 
clauses 
    выигр(_Игрок1, _Игрок2, Ломаная, Ломаная1):-
        шаг(Ломаная, Ломаная1, Клетка),
        list::isMember(Клетка, Ломаная).
    выигр(Игрок1, Игрок2, Ломаная, Ломаная1):-
        шаг(Ломаная, Ломаная1, _),
        not(выигр(Игрок2, Игрок1, Ломаная1, _)).
 
    ход(2, Ломаная):-
        шаг(Ломаная, Ломаная1, Клетка),
        list::isMember(Клетка, Ломаная),
        !,
        отобразить(Ломаная1),
        setLocation(location(0, 14)),
        write("Компьютер выиграл!\n\n", Ломаная1).
    ход(2, Ломаная):-
        выигр(2, 1, Ломаная, Ломаная1),
        !,
        ход(1, Ломаная1).
    ход(2, Ломаная):-
        шаг(Ломаная, Ломаная1, _),
        !,
        ход(1, Ломаная1).
    ход(1, Ломаная):-
        отобразить(Ломаная),
        setLocation(location(0, 14)),
        write(Ломаная),
        std::repeat(),
            write( "\n\nВаш ход.\nВведите новую клетку в виде к(2,3): "),
            hasDomain(клетка, К),
            К = read(), clearInput(),
        шаг(Ломаная, Ломаная1, К), 
        !, 
        if list::isMember(К, Ломаная) then
            write("\nПоздравляю! Вы выиграли!")
        else
            ход(2, Ломаная1)
        end if.
    ход(_, _).
 
    шаг([A, B | Ломаная], [X, A, B | Ломаная], X):-
        сдвиг(A, X),
        not(X = B).
    шаг(Ломаная, Ломаная1, X):-
        Ломаная2 = list::reverse(Ломаная),
        Ломаная2 = [A, B | _],
        сдвиг(A, X),
        not(X = B),
        Ломаная1 = list::append(Ломаная, [X]).
 
    сдвиг(к(X, Y), к(X - 1, Y)):- X > 1.
    сдвиг(к(X, Y), к(X + 1, Y)):- X < 6.        
    сдвиг(к(X, Y), к(X, Y - 1)):- Y > 1.    
    сдвиг(к(X, Y), к(X, Y + 1)):- Y < 5.            
 
    отобразить(Ломаная):-
        clearOutput(),
        foreach I = std::fromTo(1, 6) do
            setLocation(location(3*I, 0)), write(I)
        end foreach,
        foreach J = std::fromTo(1, 5) do    
            setLocation(location(0, 2*J)), write(J)
        end foreach,    
        foreach к(X, Y) = list::getMember_nd(Ломаная) do
            setLocation(location(3*X, 2*Y)), write("*")
        end foreach.    
 
    run():-
        init(),
        write("Кто ходит первым? (1 - человек, 2 - компьютер): "),
        Игрок = read(), clearInput(),
        if Игрок = 1 then
            write("Введите начало отрезка в виде к(3,3): "),
            hasDomain(клетка, К1),
            К1 = read(), clearInput(),
            write("Введите конец отрезка: "),
            hasDomain(клетка, К2),
            К2 = read(), clearInput(),
            ход(2, [К1, К2])
        else 
            ход(1, [к(3, 3), к(4, 3)])
         end if,    
        _ = readLine().
    end implement

Ссылки

Первая публикация текста