Учебный Проект. Релиз 1: различия между версиями
м |
м |
||
(не показано 13 промежуточных версий этого же участника) | |||
Строка 11: | Строка 11: | ||
|functionality= | |functionality= | ||
Следуйте инструкциям на экране приложения. | Следуйте инструкциям на экране приложения. | ||
|install= | |install={{PolylineInstall}} | ||
|open={{Polyline1_10Open|project=Examples\Polyline\Polyline1\Polyline1.prj}} | |open= | ||
{{Polyline1_10Open|project='''Examples\Polyline\Polyline1\Polyline1.prj'''}} | |||
{{Polyline1-06Copy_Paste}} | {{Polyline1-06Copy_Paste}} | ||
|run=Запуск приложения из среды по '''E''' или запустить исполняемое приложение из директории EXE. | |||
|run= | <vip> | ||
/***************************************************************************** | |||
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 | |||
</vip> | |||
|enver= | |enver= | ||
[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 Первая публикация текста] | ||
}} | }} |
Текущая версия на 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