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

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

м
 
(не показано 17 промежуточных версий этого же участника)
Строка 1: Строка 1:
Первая версия Учебного проекта, функциональной идеей которого является простая игра.
{{PolylineTemplateRu
 
|goal=
[[Игра "Ползунок". Правила игры|Правила игры ...]]
Демонстрация простейших приемов программирования на языке системы программирования Visual Prolog.
 
|goalContent=
==Цель==
|code=
Демонстрация простейших приемов программирования на языке Visual Prolog.
 
==Особенности Release 1==  
*Автор: Елена Ефимова
*Автор: Елена Ефимова
*Источник: [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]
*Источник: [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]
*В данной версии размер поля устновлен 5х6 точек.
*Тип пользовательского приложения – консоль (console).
*В данной версии размер поля установлен 5х6 точек.
*В силу неэффективного алгоритма игры компьютера не рекомендуется устанавливать размер поля более 36 клеток (6x6, например).
*В силу неэффективного алгоритма игры компьютера не рекомендуется устанавливать размер поля более 36 клеток (6x6, например).
|functionality=
Следуйте инструкциям на экране приложения.
|install={{PolylineInstall}}


==Установка==
|open=
Для помещения игры в проект необходимо:
{{Polyline1_10Open|project='''Examples\Polyline\Polyline1\Polyline1.prj'''}}
 
*Создать проект с пользовательским интерфейсом типа console
*В построенном проекте заменить полностью код файла "main.pro" кодом, предложенным ниже (для версий 7.2 и 7.1 следует взять соответствующий код ниже)
*При построении проекта ответить на предложение о включении дополнительных пакетов в проект "Add All".  


{{Polyline1-06Copy_Paste}}
|run=Запуск приложения из среды по '''E''' или запустить исполняемое приложение из директории EXE.
<vip>
<vip>
/*****************************************************************************
/*****************************************************************************
игрок, который "замыкает" траекторию
Copyright (c) Elena Efimova
(т.е. ходит в точку на существующей ломаной),
 
выигрывает
Translated by Victor Yukhtenko
Автор: Елена Ефимова
Совместимо с версией VIP 7.2
******************************************************************************/
******************************************************************************/
goal
goal
     mainExe::run(main::run).
     mainExe::run(main::run).
   
   
 
implement main
implement main
     open core, console
     open core, console
Строка 150: Строка 147:
end implement main
end implement main
</vip>
</vip>
|enver=
[http://www.progz.ru/forum/index.php?showtopic=34097&pid=153443&st=0&#entry153443#2 Первая публикация текста]


<vip>
}}
/******************************************
игрок, который "замыкает" траекторию
(т.е. ходит в точку на существующей ломаной),
выигрывает
Автор: Елена Ефимова
Совместимо с версией 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
</vip>
 
=Ссылки=
[[Category:Проекты]]
[[Category:Игры]]
[http://www.progz.ru/forum/index.php?showtopic=34097&pid=153443&st=0&#entry153443#2 Первая публикация текста]

Текущая версия на 13:41, 28 марта 2011

Автор: Виктор Юхтенко. Email victor@pdc.spb.su

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

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

Цель

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

Функции

Следуйте инструкциям на экране приложения.

Код

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

Установка

Если Вам нужен полный набор проектов серии Polyline (персональная версия), сгрузите и разархивируйте файлы архивов, пользуясь ссылками на форуме PDC ЗДЕСЬ

  • VipSpbSDK_PE_73_Examples_Polyline_1_14.zip
  • VipSpbSDK_PE_73_Tools_Polyline_1_14.zip]

в удобную для Вас директорию.

Коммерческая версия представлена в виде одного архива и может быть получена Здесь.

Оплата в любой из указанных валют. При оплате с рублевой кредитной карты валюта оплаты конвертируется в рубли по курсу банка-эмитента карты.

Директория с именем VipSpbSDK будет создана автоматически.

Если у Вас установлен VipSpbSDK, то следует открыть проект Examples\Polyline\Polyline1\Polyline1.prj

Если у Вас нет полного набора примеров из VipSpbSDK, то для помещения игры в проект необходимо:

  • Создать проект с пользовательским интерфейсом типа console
  • Построить проект
  • В построенном проекте заменить полностью код файла "main.pro" кодом, предложенным ниже.
  • Запустить вновь построение проекта. При построении проекта ответить на предложение о включении дополнительных пакетов в проект "Add All".

Запуск

Запуск приложения из среды по E или запустить исполняемое приложение из директории EXE.

/*****************************************************************************
Copyright (c) Elena Efimova
 
Translated by Victor Yukhtenko
******************************************************************************/
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

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