<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wikiru.visual-prolog.com/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2</id>
	<title>Учебный Проект. Релиз 2 - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wikiru.visual-prolog.com/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2"/>
	<link rel="alternate" type="text/html" href="https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;action=history"/>
	<updated>2026-05-18T23:08:32Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2572&amp;oldid=prev</id>
		<title>Victor Yukhtenko в 13:19, 31 марта 2011</title>
		<link rel="alternate" type="text/html" href="https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2572&amp;oldid=prev"/>
		<updated>2011-03-31T13:19:17Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 15:19, 31 марта 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l22&quot;&gt;Строка 22:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 22:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|open=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|open=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Polyline1_10Open|project=&amp;#039;&amp;#039;&amp;#039;Examples\Polyline\&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Polyline1&lt;/del&gt;\Polyline2.prj&amp;#039;&amp;#039;&amp;#039;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Polyline1_10Open|project=&amp;#039;&amp;#039;&amp;#039;Examples\Polyline\&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Polyline2&lt;/ins&gt;\Polyline2.prj&amp;#039;&amp;#039;&amp;#039;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Polyline1-06Copy_Paste}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Polyline1-06Copy_Paste}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Victor Yukhtenko</name></author>
	</entry>
	<entry>
		<id>https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2543&amp;oldid=prev</id>
		<title>Victor Yukhtenko в 18:52, 26 марта 2011</title>
		<link rel="alternate" type="text/html" href="https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2543&amp;oldid=prev"/>
		<updated>2011-03-26T18:52:00Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 20:52, 26 марта 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l17&quot;&gt;Строка 17:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 17:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*В силу неэффективного алгоритма игры компьютера размер поля более 36 клеток (6x6, например) устанавливать не рекомендуется.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*В силу неэффективного алгоритма игры компьютера размер поля более 36 клеток (6x6, например) устанавливать не рекомендуется.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|functionality=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|functionality=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*&lt;/del&gt;*Если первым ходит компьютер то он выбирает ход случайным образом;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Если первым ходит компьютер то он выбирает ход случайным образом;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;*&lt;/del&gt;*Если у модели компьютера нет хода, ведущего к выигрышу, то он выбирается случайно.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*Если у модели компьютера нет хода, ведущего к выигрышу, то он выбирается случайно.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|install={{PolylineInstall}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;|install={{PolylineInstall}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Victor Yukhtenko</name></author>
	</entry>
	<entry>
		<id>https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2542&amp;oldid=prev</id>
		<title>Victor Yukhtenko в 18:49, 26 марта 2011</title>
		<link rel="alternate" type="text/html" href="https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2542&amp;oldid=prev"/>
		<updated>2011-03-26T18:49:40Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;amp;diff=2542&amp;amp;oldid=2433&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Victor Yukhtenko</name></author>
	</entry>
	<entry>
		<id>https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2433&amp;oldid=prev</id>
		<title>Victor Yukhtenko в 08:27, 27 мая 2010</title>
		<link rel="alternate" type="text/html" href="https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2433&amp;oldid=prev"/>
		<updated>2010-05-27T08:27:53Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 10:27, 27 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{copyright}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Очередная версия Учебного проекта, функциональной идеей которого является простая игра.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Очередная версия Учебного проекта, функциональной идеей которого является простая игра.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Victor Yukhtenko</name></author>
	</entry>
	<entry>
		<id>https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2319&amp;oldid=prev</id>
		<title>Victor Yukhtenko: /* Ссылки */</title>
		<link rel="alternate" type="text/html" href="https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2319&amp;oldid=prev"/>
		<updated>2009-10-03T19:14:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Ссылки&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 21:14, 3 октября 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l988&quot;&gt;Строка 988:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 988:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Ссылки==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Ссылки==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[en:Game Polyline. release 2]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[en:Game Polyline. release 2]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Примеры&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Проекты&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Игры]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Игры]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Victor Yukhtenko</name></author>
	</entry>
	<entry>
		<id>https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2297&amp;oldid=prev</id>
		<title>Victor Yukhtenko: Новая: Очередная версия Учебного проекта, функциональной идеей которого является простая игра.  [[Игра &quot;Полз...</title>
		<link rel="alternate" type="text/html" href="https://wikiru.visual-prolog.com/index.php?title=%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D1%8B%D0%B9_%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82._%D0%A0%D0%B5%D0%BB%D0%B8%D0%B7_2&amp;diff=2297&amp;oldid=prev"/>
		<updated>2009-10-01T19:04:42Z</updated>

		<summary type="html">&lt;p&gt;Новая: Очередная версия Учебного проекта, функциональной идеей которого является простая игра.  [[Игра &amp;quot;Полз...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Очередная версия Учебного проекта, функциональной идеей которого является простая игра.&lt;br /&gt;
&lt;br /&gt;
[[Игра &amp;quot;Ползунок&amp;quot;. Правила игры|Правила игры ...]]&lt;br /&gt;
&lt;br /&gt;
==Цель==&lt;br /&gt;
Демонстрация простейших приемов программирования на языке Visual Prolog, в том числе:&lt;br /&gt;
*генерация случайных чисел.&lt;br /&gt;
*использование одного и того же интерфейса в разных классах&lt;br /&gt;
*использование фактов-переменных&lt;br /&gt;
*генерация простейших исключений&lt;br /&gt;
*простейшая обработка исключений&lt;br /&gt;
*использование констант&lt;br /&gt;
&lt;br /&gt;
==Особенности Release 2== &lt;br /&gt;
*Стратегия поведения компьютера из [[Учебный Проект. Релиз 1]], отличается здесь тем, что:&lt;br /&gt;
**Если первым ходит компьютер то он выбирает ход случайным образом&lt;br /&gt;
**Если нет хода, ведущего к выигрышу, то он выбирается случайно&lt;br /&gt;
* Модели поведения компьютера и человека построены как динамические классы&lt;br /&gt;
* Предикаты, явно относящиеся к пользовательскому интерфейсу, выделены в отдельный класс&lt;br /&gt;
*В данной версии использован размер поля 6х6 точек.&lt;br /&gt;
*В силу неэффективного алгоритма игры компьютера размер поля более 36 клеток (6x6, например) устанавливать не рекомендуется.&lt;br /&gt;
&lt;br /&gt;
==Установка==&lt;br /&gt;
*Создать проект с пользовательским интерфейсом типа console&lt;br /&gt;
*В построенном проекте заменить полностью код файла &amp;quot;main.pro&amp;quot; кодом, предложенным ниже (для версий 7.2 и 7.1 следует взять соответствующий код ниже)&lt;br /&gt;
*При построении проекта ответить на предложение о включении дополнительных пакетов в проект &amp;quot;Add All&amp;quot;. &lt;br /&gt;
&amp;lt;vip&amp;gt;&lt;br /&gt;
/*********************************************************&lt;br /&gt;
VIP 7.2 Compatable &lt;br /&gt;
Copyright (c) 2007-2008 Prolog Development Center SPb&lt;br /&gt;
&lt;br /&gt;
SpbSolutions/Examples/Polyline&lt;br /&gt;
&lt;br /&gt;
Predicates, which represent the strategy&lt;br /&gt;
  resolveMove,&lt;br /&gt;
  moveCandidate,&lt;br /&gt;
  successfulMove,&lt;br /&gt;
  rule_nd,&lt;br /&gt;
based on solutions proposed by Elena Efimova&lt;br /&gt;
&lt;br /&gt;
Written by: Victor Yukhtenko                        &lt;br /&gt;
*********************************************************/&lt;br /&gt;
goal&lt;br /&gt;
    mainExe::run(main::run).&lt;br /&gt;
 &lt;br /&gt;
implement main&lt;br /&gt;
open core&lt;br /&gt;
 &lt;br /&gt;
constants&lt;br /&gt;
    className = &amp;quot;PolyLine&amp;quot;.&lt;br /&gt;
    classVersion = &amp;quot;1.0&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    classInfo(className, classVersion).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    run():-&lt;br /&gt;
        console::init(),&lt;br /&gt;
        game::run().&lt;br /&gt;
end implement main&lt;br /&gt;
 &lt;br /&gt;
/**************************************&lt;br /&gt;
The Game class manages the playing process&lt;br /&gt;
**************************************/&lt;br /&gt;
class game&lt;br /&gt;
    open core&lt;br /&gt;
 &lt;br /&gt;
predicates&lt;br /&gt;
    classInfo : core::classInfo.&lt;br /&gt;
 &lt;br /&gt;
constants&lt;br /&gt;
    maxRow_C:positive=6.&lt;br /&gt;
    maxColumn_C:positive=6.&lt;br /&gt;
 &lt;br /&gt;
domains&lt;br /&gt;
    cell = c(positive,positive).&lt;br /&gt;
    moveType_D=&lt;br /&gt;
        ordinary_S;&lt;br /&gt;
        winner_S.&lt;br /&gt;
 &lt;br /&gt;
properties&lt;br /&gt;
    polyline_P:cell*.&lt;br /&gt;
 &lt;br /&gt;
predicates&lt;br /&gt;
    run:().&lt;br /&gt;
    set:(string CellAsString).&lt;br /&gt;
    rule_nd: (cell,cell) nondeterm (i,o) (i,i).&lt;br /&gt;
    ruleLimited_nd:(cell,cell)-&amp;gt;cell nondeterm.&lt;br /&gt;
 &lt;br /&gt;
end class game&lt;br /&gt;
 &lt;br /&gt;
implement game&lt;br /&gt;
open core&lt;br /&gt;
 &lt;br /&gt;
constants&lt;br /&gt;
    className = &amp;quot;Game&amp;quot;.&lt;br /&gt;
    classVersion = &amp;quot;1.0&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    classInfo(className, classVersion).&lt;br /&gt;
 &lt;br /&gt;
class facts&lt;br /&gt;
    human_V:player:=erroneous.&lt;br /&gt;
    computer_V:player:=erroneous.&lt;br /&gt;
    polyline_P:cell*:=[].&lt;br /&gt;
    endOfGame_V:boolean:=false.&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    run():-&lt;br /&gt;
        human_V:=human::new(),&lt;br /&gt;
        computer_V:=computer::new(),&lt;br /&gt;
        playerTurn().&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    playerTurn:().&lt;br /&gt;
clauses&lt;br /&gt;
    playerTurn():-&lt;br /&gt;
        PlayerTurnStr=humanInterface::getInput(humanInterface::playerTurn_S),&lt;br /&gt;
        not(PlayerTurnStr=&amp;quot;&amp;quot;),&lt;br /&gt;
        try&lt;br /&gt;
            hasDomain(positive,PlayerTurn),&lt;br /&gt;
            PlayerTurn=toTerm(PlayerTurnStr),&lt;br /&gt;
            if PlayerTurn=2 then&lt;br /&gt;
                Player=human_V,&lt;br /&gt;
                StarterName=&amp;quot;Computer&amp;quot; % because of it is used NextPlayer in the Play predicate&lt;br /&gt;
            else&lt;br /&gt;
                Player=computer_V,&lt;br /&gt;
                StarterName=&amp;quot;Human&amp;quot;&lt;br /&gt;
            end if,&lt;br /&gt;
            humanInterface::showStage(),&lt;br /&gt;
            !,&lt;br /&gt;
            humanInterface::announceStarter(StarterName),&lt;br /&gt;
            play(Player)&lt;br /&gt;
        catch _TraceID1 do&lt;br /&gt;
            humanInterface::announceChoiceError(humanInterface::errorMustBeNumber_S)&lt;br /&gt;
        end try,&lt;br /&gt;
            !,&lt;br /&gt;
            polyline_P:=[],&lt;br /&gt;
            endOfGame_V:=false,&lt;br /&gt;
            playerTurn().&lt;br /&gt;
    playerTurn().&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    play:(player Player).&lt;br /&gt;
clauses&lt;br /&gt;
    play(Player):-&lt;br /&gt;
        endOfGame_V=true,&lt;br /&gt;
        !,&lt;br /&gt;
        if Player=human_V then&lt;br /&gt;
            humanInterface::announceWin(&amp;quot;Human&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
            humanInterface::announceWin(&amp;quot;Computer&amp;quot;)&lt;br /&gt;
        end if.&lt;br /&gt;
    play(Player):-&lt;br /&gt;
        if Player=human_V then&lt;br /&gt;
            NextPlayer=computer_V,&lt;br /&gt;
            Name=&amp;quot;Computer&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            NextPlayer=human_V,&lt;br /&gt;
            Name=&amp;quot;Human&amp;quot;&lt;br /&gt;
        end if,&lt;br /&gt;
        !,&lt;br /&gt;
        humanInterface::announceMovingPlayer(Name),&lt;br /&gt;
        NextPlayer:move(),&lt;br /&gt;
        play(NextPlayer).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    set(InputString):-&lt;br /&gt;
        Cell=toTerm(InputString),&lt;br /&gt;
        handleInput (Cell).&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    handleInput:(cell Cell).&lt;br /&gt;
clauses&lt;br /&gt;
    handleInput(Cell):-&lt;br /&gt;
        list::isMember(Cell,polyline_P),&lt;br /&gt;
        try&lt;br /&gt;
            _=makePolyLine(Cell,polyline_P)   % If the Cell is not acceptable,&lt;br /&gt;
                                                            % then exception appears and we ignore it&lt;br /&gt;
                                                            % using fail&lt;br /&gt;
        catch _TraceID do&lt;br /&gt;
            fail&lt;br /&gt;
        end try,&lt;br /&gt;
        !,&lt;br /&gt;
        endOfGame_V:=true,&lt;br /&gt;
        humanInterface::showMove(Cell,winner_S).&lt;br /&gt;
    handleInput (Cell):-&lt;br /&gt;
        polyline_P:=makePolyLine(Cell,polyline_P),&lt;br /&gt;
        !,&lt;br /&gt;
        humanInterface::showMove(Cell,ordinary_S).&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    makePolyLine: (cell,cell*)-&amp;gt; cell* multi.&lt;br /&gt;
clauses&lt;br /&gt;
    makePolyLine(c(X,Y),[])=[c(X,Y)]:-&lt;br /&gt;
        X&amp;gt;0,X&amp;lt;=maxColumn_C,&lt;br /&gt;
        Y&amp;gt;0,Y&amp;lt;=maxRow_C,&lt;br /&gt;
        !.&lt;br /&gt;
    makePolyLine(NewCell,[SingleCell])=[NewCell,SingleCell]:-&lt;br /&gt;
        game::rule_nd(SingleCell, NewCell),&lt;br /&gt;
        !.&lt;br /&gt;
    makePolyLine(NewCell,[Left, RestrictingCell | PolyLineTail])=[NewCell, Left, RestrictingCell | PolyLineTail]:-&lt;br /&gt;
        NewCell=ruleLimited_nd(Left,RestrictingCell).&lt;br /&gt;
    makePolyLine(NewCell,PolyLine)=list::reverse([NewCell,Left, RestrictingCell | PolyLineTail]):-&lt;br /&gt;
        [Left, RestrictingCell | PolyLineTail]= list::reverse(PolyLine),&lt;br /&gt;
        NewCell=ruleLimited_nd(Left,RestrictingCell).&lt;br /&gt;
    makePolyLine(NewCell,_PolyLine)= _PolyLine1:-&lt;br /&gt;
        exception::raise(classInfo,wrongMoveException,[namedValue(&amp;quot;data&amp;quot;,string(toString(NewCell)))]).&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    wrongMoveException:exception.&lt;br /&gt;
clauses&lt;br /&gt;
    wrongMoveException&lt;br /&gt;
        (&lt;br /&gt;
        classInfo,&lt;br /&gt;
        predicate_Name(),&lt;br /&gt;
        &amp;quot;The point % can not prolong the polyline!&amp;quot;&lt;br /&gt;
        ).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    ruleLimited_nd(Cell,RestrictingCell)=NewCell:-&lt;br /&gt;
        rule_nd(Cell,NewCell),&lt;br /&gt;
            not(NewCell = RestrictingCell).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    rule_nd(c(X, Y), c(X + 1, Y)):- X &amp;lt; maxColumn_C.&lt;br /&gt;
    rule_nd(c(X, Y), c(X, Y + 1)):- Y &amp;lt; maxrow_C.&lt;br /&gt;
    rule_nd(c(X, Y), c(X - 1, Y)):- X &amp;gt; 1.&lt;br /&gt;
    rule_nd(c(X, Y), c(X, Y - 1)):- Y &amp;gt; 1.&lt;br /&gt;
 &lt;br /&gt;
end implement game&lt;br /&gt;
 &lt;br /&gt;
/******************************************&lt;br /&gt;
  Interface Player&lt;br /&gt;
  Player in responce to predicate call move()&lt;br /&gt;
  must  reply by calling set(ResponceMove)&lt;br /&gt;
******************************************/&lt;br /&gt;
interface player&lt;br /&gt;
 &lt;br /&gt;
predicates&lt;br /&gt;
    move:().&lt;br /&gt;
end interface player&lt;br /&gt;
 &lt;br /&gt;
/********************************&lt;br /&gt;
  The Class Human&lt;br /&gt;
********************************/&lt;br /&gt;
class human:player&lt;br /&gt;
open core&lt;br /&gt;
 &lt;br /&gt;
end class human&lt;br /&gt;
 &lt;br /&gt;
implement human&lt;br /&gt;
open core, exception&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    move():-&lt;br /&gt;
        InputString=humanInterface::getInput(humanInterface::playerMove_S),&lt;br /&gt;
        try&lt;br /&gt;
            game::set(InputString)&lt;br /&gt;
        catch TraceID do&lt;br /&gt;
            handleException(TraceID),&lt;br /&gt;
            fail&lt;br /&gt;
        end try,&lt;br /&gt;
        !.&lt;br /&gt;
    move():-&lt;br /&gt;
        move().&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    handleException:(exception::traceId TraceID).&lt;br /&gt;
clauses&lt;br /&gt;
    handleException(TraceID):-&lt;br /&gt;
        foreach Descriptor=exception::getDescriptor_nd(TraceID) do&lt;br /&gt;
            Descriptor = exception::descriptor(&lt;br /&gt;
                _ClassInfo1,&lt;br /&gt;
                exception::exceptionDescriptor(_ClassInfo2,_PredicateName,Description),&lt;br /&gt;
                _Kind,&lt;br /&gt;
                ExtraInfo,&lt;br /&gt;
                _GMTTime,&lt;br /&gt;
                _ExceptionDescription,&lt;br /&gt;
                _ThreadId),&lt;br /&gt;
            if&lt;br /&gt;
                ExtraInfo=[namedValue(&amp;quot;data&amp;quot;,string(CellPointer))]&lt;br /&gt;
            then&lt;br /&gt;
                ErrorMsg=string::format(Description,CellPointer),&lt;br /&gt;
                humanInterface::announceError(ErrorMsg)&lt;br /&gt;
            else&lt;br /&gt;
                humanInterface::announceError(&amp;quot;&amp;quot;)&lt;br /&gt;
            end if&lt;br /&gt;
        end foreach.&lt;br /&gt;
 &lt;br /&gt;
end implement human&lt;br /&gt;
 &lt;br /&gt;
/******************************************&lt;br /&gt;
  Class Сomputer&lt;br /&gt;
******************************************/&lt;br /&gt;
class computer:player&lt;br /&gt;
predicates&lt;br /&gt;
    classInfo : core::classInfo.&lt;br /&gt;
end class computer&lt;br /&gt;
 &lt;br /&gt;
implement computer&lt;br /&gt;
open core&lt;br /&gt;
 &lt;br /&gt;
constants&lt;br /&gt;
    className = &amp;quot;Computer&amp;quot;.&lt;br /&gt;
    classVersion = &amp;quot;1.0&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    classInfo(className, classVersion).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    move():-&lt;br /&gt;
        Cell=resolveMove(),&lt;br /&gt;
        game::set(toString(Cell)).&lt;br /&gt;
 &lt;br /&gt;
predicates&lt;br /&gt;
    resolveMove:()-&amp;gt;game::cell.&lt;br /&gt;
clauses&lt;br /&gt;
    resolveMove()=Cell:-&lt;br /&gt;
        Cell=successfulMove(game::polyline_P),&lt;br /&gt;
        !.&lt;br /&gt;
    resolveMove()=Cell:-&lt;br /&gt;
        moveCandidate(game::polyline_P,_PolyLine,Cell),&lt;br /&gt;
        !.&lt;br /&gt;
    resolveMove()=game::c(X+1,Y+1):-&lt;br /&gt;
        X=math::random(game::maxColumn_C-1),&lt;br /&gt;
        Y=math::random(game::maxRow_C-1).&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    successfulMove: (game::cell*)-&amp;gt;game::cell nondeterm.&lt;br /&gt;
clauses&lt;br /&gt;
    successfulMove(PolyLine)=Cell:-&lt;br /&gt;
        moveCandidate(PolyLine,_PolyLine1,Cell),&lt;br /&gt;
            list::isMember(Cell, PolyLine),&lt;br /&gt;
            !.&lt;br /&gt;
    successfulMove(PolyLine)=Cell:-&lt;br /&gt;
        moveCandidate(PolyLine, PolyLine1, Cell),&lt;br /&gt;
            not(_=successfulMove(PolyLine1)).&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    moveCandidate: (game::cell*,game::cell* [out],game::cell [out]) nondeterm.&lt;br /&gt;
clauses&lt;br /&gt;
    moveCandidate([Cell],[Cell,NewCell], NewCell):-&lt;br /&gt;
        game::rule_nd(Cell, NewCell),&lt;br /&gt;
        !.&lt;br /&gt;
    moveCandidate([Left, RestrictingCell | PolyLine],[NewCell,Left, RestrictingCell| PolyLine], NewCell):-&lt;br /&gt;
        NewCell=game::ruleLimited_nd(Left,RestrictingCell).&lt;br /&gt;
    moveCandidate(PolyLine,list::reverse([NewCell,Left, RestrictingCell |PolyLineTail]),NewCell):-&lt;br /&gt;
        [Left, RestrictingCell |PolyLineTail] = list::reverse(PolyLine),&lt;br /&gt;
        NewCell=game::ruleLimited_nd(Left,RestrictingCell).&lt;br /&gt;
 &lt;br /&gt;
end implement computer&lt;br /&gt;
 &lt;br /&gt;
/******************************************&lt;br /&gt;
  Class HumanInterface supports the communication&lt;br /&gt;
  of the human with the computer&lt;br /&gt;
******************************************/&lt;br /&gt;
class humanInterface&lt;br /&gt;
open core&lt;br /&gt;
 &lt;br /&gt;
predicates&lt;br /&gt;
    showStage:().&lt;br /&gt;
    showMove:(game::cell,game::moveType_D).&lt;br /&gt;
    getInput:(inputType_D)-&amp;gt;string InputString.&lt;br /&gt;
 &lt;br /&gt;
domains&lt;br /&gt;
    inputType_D=&lt;br /&gt;
        playerMove_S;&lt;br /&gt;
        playerTurn_S.&lt;br /&gt;
 &lt;br /&gt;
predicates&lt;br /&gt;
    announceStarter:(string Name).&lt;br /&gt;
    announceMovingPlayer:(string Name).&lt;br /&gt;
    announceWin:(string Name).&lt;br /&gt;
    announceError:(string Description).&lt;br /&gt;
    announceError:().&lt;br /&gt;
 &lt;br /&gt;
domains&lt;br /&gt;
    choiceError_D=&lt;br /&gt;
        errorMustBeNumber_S;&lt;br /&gt;
        errorPlayerTurn_S.&lt;br /&gt;
predicates&lt;br /&gt;
    announceChoiceError:(choiceError_D).&lt;br /&gt;
 &lt;br /&gt;
end class humanInterface&lt;br /&gt;
 &lt;br /&gt;
implement humanInterface&lt;br /&gt;
open core&lt;br /&gt;
 &lt;br /&gt;
constants&lt;br /&gt;
    cellMarkedOrdinary_C=&amp;quot;*&amp;quot;.&lt;br /&gt;
    cellMarkedWinner_C=&amp;quot;O&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
constants % messages&lt;br /&gt;
    movingPlayer_C=&amp;quot;% is thinking&amp;quot;.&lt;br /&gt;
    beginner_C=&amp;quot;First move done by: %&amp;quot;.&lt;br /&gt;
    error_C=&amp;quot;Error, % &amp;quot;.&lt;br /&gt;
    congratulation_C=&amp;quot;Player % has won!&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
    playerMove_C=&amp;quot;Enter the move as  c(X,Y): &amp;quot;.&lt;br /&gt;
    playerTurn_C=&amp;quot;\nWho is moving first (1-human, 2-computer, Enter-exit)?:&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
    errorMustBeNumber_C=&amp;quot;\nIt must be numeric! Please repeat the input:&amp;quot;.&lt;br /&gt;
    errorPlayerTurn_C=&amp;quot;\nNo player with this ID! Please repeat the input:&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
constants&lt;br /&gt;
    verticalSpace_C=2.&lt;br /&gt;
    horizontalSpace_C=3.&lt;br /&gt;
    emptyLineLenght_C=80.&lt;br /&gt;
 &lt;br /&gt;
constants % Position of Line&lt;br /&gt;
    starterLine_C=1.&lt;br /&gt;
    announceLine_C=starterLine_C+1.&lt;br /&gt;
    actionLine_C=announceLine_C+1.&lt;br /&gt;
    polylineLine_C=actionLine_C+1.&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    getInput(InputType)=Input:-&lt;br /&gt;
        inputInvitation(InputType),&lt;br /&gt;
        Input = console::readLine(),&lt;br /&gt;
        console::clearInput().&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    inputInvitation:(inputType_D).&lt;br /&gt;
clauses&lt;br /&gt;
    inputInvitation(playermove_S):-&lt;br /&gt;
        clearMessageArea(actionLine_C),&lt;br /&gt;
        writeMessage(actionLine_C,&amp;quot;%&amp;quot;,playermove_C).&lt;br /&gt;
    inputInvitation(playerTurn_S):-&lt;br /&gt;
        console::clearOutput(),&lt;br /&gt;
        console::write(playerTurn_C).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    showStage():-&lt;br /&gt;
        console::clearOutput(),&lt;br /&gt;
        foreach I = std::fromTo(1, game::maxColumn_C) do&lt;br /&gt;
            console::setLocation(console_native::coord(horizontalSpace_C*I, 0)),&lt;br /&gt;
            console::write(I)&lt;br /&gt;
        end foreach,&lt;br /&gt;
        foreach J = std::fromTo(1, game::maxRow_C) do&lt;br /&gt;
            console::setLocation(console_native::coord(0, verticalSpace_C*J)),&lt;br /&gt;
            console::write(J)&lt;br /&gt;
        end foreach.&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    showMove(game::c(X,Y),_Type):-&lt;br /&gt;
        console::setLocation(console_native::coord(horizontalSpace_C*X, verticalSpace_C*Y)),&lt;br /&gt;
        fail.&lt;br /&gt;
    showMove(_Cell,game::ordinary_S):-&lt;br /&gt;
        console::write(cellMarkedOrdinary_C).&lt;br /&gt;
    showMove(_Cell,game::winner_S):-&lt;br /&gt;
        console::write(cellMarkedWinner_C).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    announceStarter(Name):-&lt;br /&gt;
        clearMessageArea(starterLine_C),&lt;br /&gt;
        writeMessage(starterLine_C,beginner_C,Name).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    announceChoiceError(errorMustBeNumber_S):-&lt;br /&gt;
        console::write(errorMustBeNumber_C),&lt;br /&gt;
        _ = console::readLine().&lt;br /&gt;
    announceChoiceError(errorPlayerTurn_S):-&lt;br /&gt;
        console::write(errorPlayerTurn_C),&lt;br /&gt;
        _ = console::readLine().&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    announceError():-&lt;br /&gt;
        announceError(&amp;quot;&amp;quot;).&lt;br /&gt;
 &lt;br /&gt;
    announceError(ErrorText):-&lt;br /&gt;
        clearMessageArea(announceLine_C),&lt;br /&gt;
        writeMessage(announceLine_C,error_C,ErrorText).&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    announceWin(Name):-&lt;br /&gt;
        clearMessageArea(announceLine_C),&lt;br /&gt;
        writeMessage(announceLine_C,congratulation_C,Name),&lt;br /&gt;
        showPolyLine(),&lt;br /&gt;
        _ = console::readLine().&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    announceMovingPlayer(Name):-&lt;br /&gt;
        clearMessageArea(announceLine_C),&lt;br /&gt;
        clearMessageArea(actionLine_C),&lt;br /&gt;
        writeMessage(actionLine_C,movingPlayer_C,Name).&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    showPolyLine:().&lt;br /&gt;
clauses&lt;br /&gt;
    showPolyLine():-&lt;br /&gt;
        clearMessageArea(actionLine_C),&lt;br /&gt;
        writeMessage(polylineLine_C,&amp;quot;%&amp;quot;,toString(game::polyline_P)).&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    clearMessageArea:(positive AreaID).&lt;br /&gt;
clauses&lt;br /&gt;
    clearMessageArea(AreaID):-&lt;br /&gt;
        console::setLocation(console_native::coord(0,game::maxRow_C*verticalSpace_C+AreaID)),&lt;br /&gt;
        console::write(string::create(emptyLineLenght_C,&amp;quot; &amp;quot;)).&lt;br /&gt;
 &lt;br /&gt;
class predicates&lt;br /&gt;
    writeMessage:(positive AreaID,string FormatString,string ParameterString).&lt;br /&gt;
clauses&lt;br /&gt;
    writeMessage(AreaID,FormatString,ParameterString):-&lt;br /&gt;
        console::setLocation(console_native::coord(0, game::maxRow_C*verticalSpace_C+AreaID)),&lt;br /&gt;
        console::writef(FormatString,ParameterString).&lt;br /&gt;
 &lt;br /&gt;
end implement humanInterface&lt;br /&gt;
&amp;lt;/vip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;vip&amp;gt;&lt;br /&gt;
/*****************************************************************************&lt;br /&gt;
Совместимо с VIP 7.1 &lt;br /&gt;
Written by: Victor Yukhtenko&lt;br /&gt;
&lt;br /&gt;
Предикаты определения стратегии&lt;br /&gt;
  resolveMove, &lt;br /&gt;
  moveCandidate, &lt;br /&gt;
  successfulMove,&lt;br /&gt;
  rule_nd, &lt;br /&gt;
основаны на решениях, предложенных Еленой Ефимовой&lt;br /&gt;
******************************************************************************/&lt;br /&gt;
goal&lt;br /&gt;
    mainExe::run(main::run).&lt;br /&gt;
&lt;br /&gt;
implement main&lt;br /&gt;
open core&lt;br /&gt;
&lt;br /&gt;
constants&lt;br /&gt;
    className = &amp;quot;Ползунок&amp;quot;.&lt;br /&gt;
    classVersion = &amp;quot;1.0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    classInfo(className, classVersion).&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    run():-&lt;br /&gt;
        console::init(),   &lt;br /&gt;
        game::run().&lt;br /&gt;
end implement main&lt;br /&gt;
/***********************************&lt;br /&gt;
Класс Game управляет ходом игры&lt;br /&gt;
***********************************/&lt;br /&gt;
class game&lt;br /&gt;
    open core&lt;br /&gt;
&lt;br /&gt;
constants&lt;br /&gt;
    maxRow_C:positive=6.&lt;br /&gt;
    maxColumn_C:positive=6.&lt;br /&gt;
&lt;br /&gt;
domains&lt;br /&gt;
    cell = c(positive,positive).&lt;br /&gt;
    moveType_D=&lt;br /&gt;
        ordinary_S;&lt;br /&gt;
        winner_S.&lt;br /&gt;
&lt;br /&gt;
properties&lt;br /&gt;
    polyline_P:cell*.&lt;br /&gt;
&lt;br /&gt;
predicates&lt;br /&gt;
    run:().&lt;br /&gt;
    set:(string CellAsString).&lt;br /&gt;
    rule_nd: (cell,cell) nondeterm (i,o) (i,i).&lt;br /&gt;
    ruleLimited_nd:(cell,cell)-&amp;gt;cell nondeterm.&lt;br /&gt;
&lt;br /&gt;
end class game&lt;br /&gt;
&lt;br /&gt;
implement game&lt;br /&gt;
open core&lt;br /&gt;
&lt;br /&gt;
constants&lt;br /&gt;
    className = &amp;quot;Game&amp;quot;.&lt;br /&gt;
    classVersion = &amp;quot;1.0&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    classInfo(className, classVersion).&lt;br /&gt;
&lt;br /&gt;
class facts&lt;br /&gt;
    human_V:player:=erroneous.&lt;br /&gt;
    computer_V:player:=erroneous.&lt;br /&gt;
    polyline_P:cell*:=[].&lt;br /&gt;
    endOfGame_V:boolean:=false.&lt;br /&gt;
    &lt;br /&gt;
clauses&lt;br /&gt;
    run():-&lt;br /&gt;
        human_V:=human::new(),&lt;br /&gt;
        computer_V:=computer::new(),&lt;br /&gt;
        playerTurn().&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    playerTurn:().&lt;br /&gt;
clauses&lt;br /&gt;
    playerTurn():-&lt;br /&gt;
        PlayerTurnStr=humanInterface::getInput(humanInterface::playerTurn_S),&lt;br /&gt;
        not(PlayerTurnStr=&amp;quot;&amp;quot;), &lt;br /&gt;
        try&lt;br /&gt;
            hasDomain(positive,PlayerTurn),&lt;br /&gt;
            PlayerTurn=toTerm(PlayerTurnStr),&lt;br /&gt;
            if PlayerTurn=2 then&lt;br /&gt;
                Player=human_V,&lt;br /&gt;
                StarterName=&amp;quot;Computer&amp;quot; % because of it is used NextPlayer in the Play predicate&lt;br /&gt;
            else&lt;br /&gt;
                Player=computer_V,&lt;br /&gt;
                StarterName=&amp;quot;Human&amp;quot;&lt;br /&gt;
            end if,&lt;br /&gt;
            humanInterface::showStage(),&lt;br /&gt;
            !,&lt;br /&gt;
            humanInterface::announceStarter(StarterName),&lt;br /&gt;
            play(Player)&lt;br /&gt;
        catch _TraceID1 do&lt;br /&gt;
            humanInterface::announceChoiceError(humanInterface::errorMustBeNumber_S)&lt;br /&gt;
        end try,&lt;br /&gt;
            !,&lt;br /&gt;
            polyline_P:=[],&lt;br /&gt;
            endOfGame_V:=false,&lt;br /&gt;
            playerTurn().&lt;br /&gt;
    playerTurn().&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    play:(player Player).&lt;br /&gt;
clauses&lt;br /&gt;
    play(Player):-&lt;br /&gt;
        endOfGame_V=true,&lt;br /&gt;
        !,&lt;br /&gt;
        if Player=human_V then&lt;br /&gt;
            humanInterface::announceWin(&amp;quot;Human&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
            humanInterface::announceWin(&amp;quot;Computer&amp;quot;)&lt;br /&gt;
        end if.&lt;br /&gt;
    play(Player):-&lt;br /&gt;
        if Player=human_V then&lt;br /&gt;
            NextPlayer=computer_V,&lt;br /&gt;
            Name=&amp;quot;Computer&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            NextPlayer=human_V,&lt;br /&gt;
            Name=&amp;quot;Человек&amp;quot;&lt;br /&gt;
        end if,&lt;br /&gt;
        !,&lt;br /&gt;
        humanInterface::announceMovingPlayer(Name),&lt;br /&gt;
        NextPlayer:move(),&lt;br /&gt;
        play(NextPlayer).&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    set(InputString):-&lt;br /&gt;
        Cell=toTerm(InputString),&lt;br /&gt;
        handleInput (Cell).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    handleInput:(cell Cell).&lt;br /&gt;
clauses&lt;br /&gt;
    handleInput(Cell):-&lt;br /&gt;
        list::isMember(Cell,polyline_P),&lt;br /&gt;
        try &lt;br /&gt;
            _=makePolyLine(Cell,polyline_P) % Если Cell не может быть принят как допустимый&lt;br /&gt;
                                            % ход, то возникает exception, которое &lt;br /&gt;
                                            % игнорируется использованием fail&lt;br /&gt;
        catch _TraceID do&lt;br /&gt;
            fail&lt;br /&gt;
        end try,&lt;br /&gt;
        !,&lt;br /&gt;
        endOfGame_V:=true,&lt;br /&gt;
        humanInterface::showMove(Cell,winner_S).&lt;br /&gt;
    handleInput (Cell):-&lt;br /&gt;
        polyline_P:=makePolyLine(Cell,polyline_P),&lt;br /&gt;
        !,&lt;br /&gt;
        humanInterface::showMove(Cell,ordinary_S).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    makePolyLine: (cell,cell*)-&amp;gt; cell* multi.&lt;br /&gt;
clauses&lt;br /&gt;
    makePolyLine(c(X,Y),[])=[c(X,Y)]:-&lt;br /&gt;
        X&amp;gt;0,X&amp;lt;=maxColumn_C,&lt;br /&gt;
        Y&amp;gt;0,Y&amp;lt;=maxRow_C,&lt;br /&gt;
        !.&lt;br /&gt;
    makePolyLine(NewCell,[SingleCell])=[NewCell,SingleCell]:-&lt;br /&gt;
        game::rule_nd(SingleCell, NewCell),&lt;br /&gt;
        !.&lt;br /&gt;
    makePolyLine(NewCell,[Left, RestrictingCell | PolyLineTail])=[NewCell, Left, RestrictingCell | PolyLineTail]:-&lt;br /&gt;
        NewCell=ruleLimited_nd(Left,RestrictingCell).&lt;br /&gt;
    makePolyLine(NewCell,PolyLine)=list::reverse([NewCell,Left, RestrictingCell | PolyLineTail]):-&lt;br /&gt;
        [Left, RestrictingCell | PolyLineTail]= list::reverse(PolyLine),&lt;br /&gt;
        NewCell=ruleLimited_nd(Left,RestrictingCell).&lt;br /&gt;
    makePolyLine(NewCell,_PolyLine)= _PolyLine1:-&lt;br /&gt;
        exception::raise(classInfo,wrongMoveException,[namedValue(&amp;quot;data&amp;quot;,string(toString(NewCell)))]).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    wrongMoveException:exception.&lt;br /&gt;
clauses&lt;br /&gt;
    wrongMoveException&lt;br /&gt;
        (&lt;br /&gt;
        classInfo,&lt;br /&gt;
        predicate_Name(),&lt;br /&gt;
        &amp;quot;Точка % не может быть продолжением маршрута!&amp;quot;&lt;br /&gt;
        ).&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    ruleLimited_nd(Cell,RestrictingCell)=NewCell:-&lt;br /&gt;
        rule_nd(Cell,NewCell),&lt;br /&gt;
            not(NewCell = RestrictingCell).&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    rule_nd(c(X, Y), c(X + 1, Y)):- X &amp;lt; maxColumn_C.        &lt;br /&gt;
    rule_nd(c(X, Y), c(X, Y + 1)):- Y &amp;lt; maxrow_C.            &lt;br /&gt;
    rule_nd(c(X, Y), c(X - 1, Y)):- X &amp;gt; 1.&lt;br /&gt;
    rule_nd(c(X, Y), c(X, Y - 1)):- Y &amp;gt; 1.    &lt;br /&gt;
&lt;br /&gt;
end implement game&lt;br /&gt;
&lt;br /&gt;
/******************************************&lt;br /&gt;
  Interface Игрок&lt;br /&gt;
  Игрок в ответ на предложение move()&lt;br /&gt;
  должен ответить классу game вызовом&lt;br /&gt;
  предиката set(Ответный Ход)&lt;br /&gt;
******************************************/&lt;br /&gt;
interface player&lt;br /&gt;
&lt;br /&gt;
predicates&lt;br /&gt;
    move:().&lt;br /&gt;
end interface player&lt;br /&gt;
&lt;br /&gt;
/********************************&lt;br /&gt;
  Класс Человек (Human)&lt;br /&gt;
********************************/&lt;br /&gt;
class human:player&lt;br /&gt;
open core &lt;br /&gt;
&lt;br /&gt;
end class human&lt;br /&gt;
&lt;br /&gt;
implement human&lt;br /&gt;
open core, exception&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    move():-&lt;br /&gt;
        InputString=humanInterface::getInput(humanInterface::playerMove_S),&lt;br /&gt;
        try&lt;br /&gt;
            game::set(InputString)&lt;br /&gt;
        catch TraceID do&lt;br /&gt;
            handleException(TraceID),&lt;br /&gt;
            fail&lt;br /&gt;
        end try,&lt;br /&gt;
        !.&lt;br /&gt;
    move():-&lt;br /&gt;
        move().&lt;br /&gt;
            &lt;br /&gt;
class predicates&lt;br /&gt;
    handleException:(exception::traceId TraceID).&lt;br /&gt;
clauses&lt;br /&gt;
    handleException(TraceID):-&lt;br /&gt;
        foreach Descriptor=exception::getDescriptor_nd(TraceID) do&lt;br /&gt;
            Descriptor = exception::descriptor(&lt;br /&gt;
                _ClassInfo1,&lt;br /&gt;
                exception::exceptionDescriptor(_ClassInfo2,_PredicateName,Description),&lt;br /&gt;
                _Kind,&lt;br /&gt;
                ExtraInfo,&lt;br /&gt;
                _GMTTime,&lt;br /&gt;
                _ExceptionDescription,&lt;br /&gt;
                _ThreadId),&lt;br /&gt;
            if&lt;br /&gt;
                ExtraInfo=[namedValue(&amp;quot;data&amp;quot;,string(CellPointer))]&lt;br /&gt;
            then&lt;br /&gt;
                ErrorMsg=string::format(Description,CellPointer),&lt;br /&gt;
                humanInterface::announceError(ErrorMsg)&lt;br /&gt;
            else&lt;br /&gt;
                humanInterface::announceError(&amp;quot;&amp;quot;)&lt;br /&gt;
            end if&lt;br /&gt;
        end foreach.&lt;br /&gt;
&lt;br /&gt;
end implement human&lt;br /&gt;
&lt;br /&gt;
/******************************************&lt;br /&gt;
  Класс Сomputer&lt;br /&gt;
******************************************/&lt;br /&gt;
class computer:player&lt;br /&gt;
open core&lt;br /&gt;
end class computer&lt;br /&gt;
&lt;br /&gt;
implement computer&lt;br /&gt;
open core&lt;br /&gt;
&lt;br /&gt;
constants&lt;br /&gt;
    className = &amp;quot;Ползунок&amp;quot;.&lt;br /&gt;
    classVersion = &amp;quot;1.0&amp;quot;.&lt;br /&gt;
 &lt;br /&gt;
clauses&lt;br /&gt;
    classInfo(className, classVersion).&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    move():-&lt;br /&gt;
        Cell=resolveMove(),&lt;br /&gt;
        game::set(toString(Cell)).&lt;br /&gt;
&lt;br /&gt;
predicates&lt;br /&gt;
    resolveMove:()-&amp;gt;game::cell.&lt;br /&gt;
clauses&lt;br /&gt;
    resolveMove()=Cell:-&lt;br /&gt;
        Cell=successfulMove(game::polyline_P),&lt;br /&gt;
        !.&lt;br /&gt;
    resolveMove()=Cell:-&lt;br /&gt;
        moveCandidate(game::polyline_P,_PolyLine,Cell),&lt;br /&gt;
        !.&lt;br /&gt;
    resolveMove()=game::c(X+1,Y+1):-&lt;br /&gt;
        X=math::random(game::maxColumn_C-1),&lt;br /&gt;
        Y=math::random(game::maxRow_C-1).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    successfulMove: (game::cell*)-&amp;gt;game::cell nondeterm.&lt;br /&gt;
clauses&lt;br /&gt;
    successfulMove(PolyLine)=Cell:-&lt;br /&gt;
        moveCandidate(PolyLine,_PolyLine1,Cell),&lt;br /&gt;
            list::isMember(Cell, PolyLine),&lt;br /&gt;
            !.&lt;br /&gt;
    successfulMove(PolyLine)=Cell:-&lt;br /&gt;
        moveCandidate(PolyLine, PolyLine1, Cell),&lt;br /&gt;
            not(_=successfulMove(PolyLine1)).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    moveCandidate: (game::cell*,game::cell* [out],game::cell [out]) nondeterm.&lt;br /&gt;
clauses&lt;br /&gt;
    moveCandidate([Cell],[Cell,NewCell], NewCell):-&lt;br /&gt;
        game::rule_nd(Cell, NewCell),&lt;br /&gt;
        !.&lt;br /&gt;
    moveCandidate([Left, RestrictingCell | PolyLine],[NewCell,Left, RestrictingCell| PolyLine], NewCell):-&lt;br /&gt;
        NewCell=game::ruleLimited_nd(Left,RestrictingCell).&lt;br /&gt;
    moveCandidate(PolyLine,list::reverse([NewCell,Left, RestrictingCell |PolyLineTail]),NewCell):-&lt;br /&gt;
        [Left, RestrictingCell |PolyLineTail] = list::reverse(PolyLine),&lt;br /&gt;
        NewCell=game::ruleLimited_nd(Left,RestrictingCell).&lt;br /&gt;
&lt;br /&gt;
end implement computer&lt;br /&gt;
&lt;br /&gt;
/******************************************&lt;br /&gt;
  Класс HumanInterface обеспечивает контакт&lt;br /&gt;
  человека с компьютером&lt;br /&gt;
******************************************/&lt;br /&gt;
class humanInterface&lt;br /&gt;
open core&lt;br /&gt;
&lt;br /&gt;
predicates&lt;br /&gt;
    showStage:().&lt;br /&gt;
    showMove:(game::cell,game::moveType_D).&lt;br /&gt;
    getInput:(inputType_D)-&amp;gt;string InputString.&lt;br /&gt;
&lt;br /&gt;
domains&lt;br /&gt;
    inputType_D=&lt;br /&gt;
        playerMove_S;&lt;br /&gt;
        playerTurn_S.&lt;br /&gt;
&lt;br /&gt;
predicates&lt;br /&gt;
    announceStarter:(string Name).&lt;br /&gt;
    announceMovingPlayer:(string Name).&lt;br /&gt;
    announceWin:(string Name).&lt;br /&gt;
    announceError:(string Description).&lt;br /&gt;
    announceError:().&lt;br /&gt;
&lt;br /&gt;
domains&lt;br /&gt;
    choiceError_D=&lt;br /&gt;
        errorMustBeNumber_S;&lt;br /&gt;
        errorPlayerTurn_S.&lt;br /&gt;
predicates&lt;br /&gt;
    announceChoiceError:(choiceError_D).&lt;br /&gt;
&lt;br /&gt;
end class humanInterface&lt;br /&gt;
&lt;br /&gt;
implement humanInterface&lt;br /&gt;
open core&lt;br /&gt;
&lt;br /&gt;
constants&lt;br /&gt;
    cellMarkedOrdinary_C=&amp;quot;*&amp;quot;.&lt;br /&gt;
    cellMarkedWinner_C=&amp;quot;O&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
constants % messages&lt;br /&gt;
    movingPlayer_C=&amp;quot;% думает&amp;quot;.&lt;br /&gt;
    beginner_C=&amp;quot;Первый ход: %&amp;quot;.&lt;br /&gt;
    error_C=&amp;quot;Ошибка, % &amp;quot;.&lt;br /&gt;
    congratulation_C=&amp;quot;Игрок % выиграл!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
    playerMove_C=&amp;quot;Введите координаты клетки как c(X,Y): &amp;quot;.&lt;br /&gt;
    playerTurn_C=&amp;quot;\nКто первый ходит (1-человек, 2-компьютер, Enter-выход)?:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
    errorMustBeNumber_C=&amp;quot;\nДолжен быть номер! Повторите ввод:&amp;quot;.&lt;br /&gt;
    errorPlayerTurn_C=&amp;quot;\nТакого игрока нет! Повторите ввод:&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
constants&lt;br /&gt;
    verticalSpace_C=2.&lt;br /&gt;
    horizontalSpace_C=3.&lt;br /&gt;
    emptyLineLenght_C=80.&lt;br /&gt;
&lt;br /&gt;
constants % Position of Line&lt;br /&gt;
    starterLine_C=1.&lt;br /&gt;
    announceLine_C=starterLine_C+1.&lt;br /&gt;
    actionLine_C=announceLine_C+1.&lt;br /&gt;
    polylineLine_C=actionLine_C+1.&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    getInput(InputType)=Input:-&lt;br /&gt;
        inputInvitation(InputType),&lt;br /&gt;
        Input = console::readLine(),&lt;br /&gt;
        console::clearInput().&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    inputInvitation:(inputType_D).&lt;br /&gt;
clauses&lt;br /&gt;
    inputInvitation(playermove_S):-&lt;br /&gt;
        clearMessageArea(actionLine_C),&lt;br /&gt;
        writeMessage(actionLine_C,&amp;quot;%&amp;quot;,playermove_C).&lt;br /&gt;
    inputInvitation(playerTurn_S):-&lt;br /&gt;
        console::clearOutput(),&lt;br /&gt;
        console::write(playerTurn_C).&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    showStage():-&lt;br /&gt;
        console::clearOutput(),&lt;br /&gt;
        foreach I = std::fromTo(1, game::maxColumn_C) do&lt;br /&gt;
            console::setLocation(console::location(horizontalSpace_C*I, 0)), &lt;br /&gt;
            console::write(I)&lt;br /&gt;
        end foreach,&lt;br /&gt;
        foreach J = std::fromTo(1, game::maxRow_C) do    &lt;br /&gt;
            console::setLocation(console::location(0, verticalSpace_C*J)), &lt;br /&gt;
            console::write(J)&lt;br /&gt;
        end foreach.&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    showMove(game::c(X,Y),_Type):-&lt;br /&gt;
        console::setLocation(console::location(horizontalSpace_C*X, verticalSpace_C*Y)),&lt;br /&gt;
        fail.&lt;br /&gt;
    showMove(_Cell,game::ordinary_S):-&lt;br /&gt;
        console::write(cellMarkedOrdinary_C).&lt;br /&gt;
    showMove(_Cell,game::winner_S):-&lt;br /&gt;
        console::write(cellMarkedWinner_C).&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    announceStarter(Name):-&lt;br /&gt;
        clearMessageArea(starterLine_C),&lt;br /&gt;
        writeMessage(starterLine_C,beginner_C,Name).&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    announceChoiceError(errorMustBeNumber_S):-&lt;br /&gt;
        console::write(errorMustBeNumber_C),&lt;br /&gt;
        _ = console::readLine().&lt;br /&gt;
    announceChoiceError(errorPlayerTurn_S):-&lt;br /&gt;
        console::write(errorPlayerTurn_C),&lt;br /&gt;
        _ = console::readLine().&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    announceError():-&lt;br /&gt;
        announceError(&amp;quot;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
    announceError(ErrorText):-&lt;br /&gt;
        clearMessageArea(announceLine_C),&lt;br /&gt;
        writeMessage(announceLine_C,error_C,ErrorText).&lt;br /&gt;
        &lt;br /&gt;
clauses&lt;br /&gt;
    announceWin(Name):-&lt;br /&gt;
        clearMessageArea(announceLine_C),&lt;br /&gt;
        writeMessage(announceLine_C,congratulation_C,Name),&lt;br /&gt;
        showPolyLine(),&lt;br /&gt;
        _ = console::readLine().&lt;br /&gt;
&lt;br /&gt;
clauses&lt;br /&gt;
    announceMovingPlayer(Name):-&lt;br /&gt;
        clearMessageArea(announceLine_C),&lt;br /&gt;
        clearMessageArea(actionLine_C),&lt;br /&gt;
        writeMessage(actionLine_C,movingPlayer_C,Name).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    showPolyLine:().&lt;br /&gt;
clauses&lt;br /&gt;
    showPolyLine():-&lt;br /&gt;
        clearMessageArea(actionLine_C),&lt;br /&gt;
        writeMessage(polylineLine_C,&amp;quot;%&amp;quot;,toString(game::polyline_P)).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    clearMessageArea:(positive AreaID).&lt;br /&gt;
clauses&lt;br /&gt;
    clearMessageArea(AreaID):-&lt;br /&gt;
        console::setLocation(console::location(0,game::maxRow_C*verticalSpace_C+AreaID)),&lt;br /&gt;
        console::write(string::create(emptyLineLenght_C,&amp;quot; &amp;quot;)).&lt;br /&gt;
&lt;br /&gt;
class predicates&lt;br /&gt;
    writeMessage:(positive AreaID,string FormatString,string ParameterString).&lt;br /&gt;
clauses&lt;br /&gt;
    writeMessage(AreaID,FormatString,ParameterString):-&lt;br /&gt;
        console::setLocation(console::location(0, game::maxRow_C*verticalSpace_C+AreaID)),&lt;br /&gt;
        console::writef(FormatString,ParameterString).&lt;br /&gt;
&lt;br /&gt;
end implement humanInterface&lt;br /&gt;
&amp;lt;/vip&amp;gt;&lt;br /&gt;
==Ссылки==&lt;br /&gt;
[[en:Game Polyline. release 2]]&lt;br /&gt;
[[Category:Примеры]]&lt;br /&gt;
[[Category:Игры]]&lt;/div&gt;</summary>
		<author><name>Victor Yukhtenko</name></author>
	</entry>
</feed>