Учебный Проект. Релиз 1
Материал из wikiru.visual-prolog.com
Первая версия Учебного проекта, функциональной идеей которого является простая игра.
Цель
Демонстрация простейших приемов программирования на языке 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