|
|
Строка 1: |
Строка 1: |
| {{copyright}} | | {{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}} |
| | {{Polyline1-06Copy_Paste}} |
| | {{PasteMainPro1}} |
| | |run= |
|
| |
|
| ==Установка==
| | |enver= |
| Для помещения игры в проект необходимо:
| |
| | |
| *Создать проект с пользовательским интерфейсом типа console
| |
| *В построенном проекте заменить полностью код файла "main.pro" кодом, предложенным ниже (для версий 7.2 и 7.1 следует взять соответствующий код ниже)
| |
| *При построении проекта ответить на предложение о включении дополнительных пакетов в проект "Add All".
| |
| | |
| <vip>
| |
| /*****************************************************************************
| |
| игрок, который "замыкает" траекторию
| |
| (т.е. ходит в точку на существующей ломаной),
| |
| выигрывает
| |
| Автор: Елена Ефимова
| |
| Совместимо с версией 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>
| |
| | |
| <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 Первая публикация текста] | | [http://www.progz.ru/forum/index.php?showtopic=34097&pid=153443&st=0&#entry153443#2 Первая публикация текста] |
| | }} |