<?xml version="1.0" encoding="windows-1251" ?>
  <rss version="2.0">
	<channel>
	  <title>mrand's blog</title>
	  <link>http://www.sapnet.ru//weblog.php?w=20</link>
	  <webMaster>admin@sapnet.ru</webMaster>
	  <lastBuildDate>Sun, 07 Jun 2026 16:14:36 GMT</lastBuildDate>
	  <generator>The Blog Mod 0.2.4 by Hyperion</generator>
	  <item>
	    <title>ABAP Minesweeper</title>
	    <link>http://www.sapnet.ru//weblog_entry.php?e=41</link>
	    <description>01.04.2009  На сапфоруме иногда упоминается контрол CL_GUI_HTML_VIEWER, про который известно, что с ним можно преодолеть все юзер-интерфейсные ограничения абапа, и что на практике делать этого не следует, так как получится нестандартно, да ещё и пользователей разбалуешь.&lt;br /&gt;
&lt;br /&gt;
И  есть одна область, где такие недостатки являются достоинствами, это абап-игры. Зачем вообще браться за игры, каждый решает сам, но если уж делать, то делать хорошо. В общем, я сделал абап-игрушку на CL_GUI_HTML_VIEWER. (Судя по гуглу, впервые в sap-сообществе?)&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: darkred&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;&lt;span style=&quot;font-size: 18px; line-height: normal&quot;&gt;ABAP Minesweeper&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Исходный код: &lt;a href=&quot;r.cgi?r=http://sapnet.ru/viewtopic.php?t=3185&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;здесь&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
Аналоги: &lt;a href=&quot;r.cgi?r=https://www.sdn.sap.com/irj/scn/wiki?path=/display/Snippets/Minehunt%252b-%252bGame%252bin%252bABAP&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;раз&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;r.cgi?r=http://www.tricktresor.de/content/index.php?navID=403&amp;amp;amp;aID=290&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;два&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.sapnet.ru/weblogs/upload/20/150587712549d27e3e74871.gif&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Итак, &lt;span style=&quot;color: darkred&quot;&gt;игра с HTML-интерфейсом&lt;/span&gt;. HTML-оформление сильно выигрывает у ABAP-List. Причём связка HTML и JavaScript  сама по себе настолько достаточна для игры, что ABAP там уже и не особо нужен. Но ABAP - это наше всё по определению, поэтому вся логика в Minesweeper сделана именно в ABAP, а в HTML вынесено только представление. Для иллюстрации такого устройства программы, в игре есть 2 режима отображения: и новомодный HTML, и через старые добрые WRITE-ы. В ходе игры доступно «горячее» переключение между двумя режимами.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: darkred&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;Спрайты&lt;/span&gt;&lt;/span&gt;. GIF-изображения хранятся прямо в ABAP-коде. Это хорошо, так как не потребуется  инсталляция картинок на сервер/клиент. И это плохо, потому что нетекстовые данные в коде программы вызывают настороженность.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: darkred&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;Взаимодействие ABAP и HTML&lt;/span&gt;&lt;/span&gt;. Каждая клетка поля имеет свой ID. Клик  мышкой на клетке посылает из HTML в ABAP событие SAPEVENT со значением ID.  ABAP-обработчик формирует в ответ массив «что надо перекрасить» из пар {ID, новое_значение}, и отправляет его в HTML на отрисовку.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: darkred&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;Новые возможности HTML&lt;/span&gt;&lt;/span&gt; ввода/вывода по сравнению с ABAP-List:&lt;br /&gt;
&lt;ul&gt;1.	клавиатура – все клавиши (в ABAP - только F1-F12), &lt;br /&gt;
2.	мышь -  все кнопки (в ABAP  - только дабл-клик левой кнопкой). &lt;br /&gt;
3.	скорость - частота обновления экрана ограничена лишь скоростью сети между сервером и клиентом  (в ABAP обновление экрана – не чаще чем 1 раз в секунду). &lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
И ещё, не весь какое &lt;span style=&quot;color: darkred&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;усовершенствование&lt;/span&gt;&lt;/span&gt;, но у других не видел: &lt;span style=&quot;color: darkred&quot;&gt;&lt;span style=&quot;font-weight: bold&quot;&gt;представление игрового поля в программе&lt;/span&gt;&lt;/span&gt; для простых board-based games, &lt;br /&gt;
&lt;br /&gt;
вместо использования itab-ов со столбцами {X,Y,Value}, я нахожу более удобным использовать просто непрерывную область памяти, и немного поиграться c адресной арифметикой. Казалось бы, манипулировать такими данным будет непросто? Посмотрим:&lt;br /&gt;
&lt;img src=&quot;http://www.sapnet.ru/weblogs/upload/20/4403510549d27e5681204.gif&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;
На рисунке показано игровое поле размером 8 на 8, имеющее дополнительный бортик снаружи, который можно не показывать пользователю. В клетки бортика записано значение, не встречающееся на поле игры, что позволяет не делать унылые проверки границ вида IF (x LT 0) OR (x GT cols) OR (y LT 0) OR (y GT rows).&lt;br /&gt;
&lt;br /&gt;
Игра 8*8 удобна при отладке, так как клетка в строке 5 столбец 2 имеет индекс 52   (ID = индекс).&lt;br /&gt;
&lt;br /&gt;
Пример 1: Печать поля без бортика&lt;br /&gt;
&amp;lt;pre&amp;gt;ofs = min.&amp;lt;br&amp;gt;&lt;span style=&quot;color: #0000FF&quot;&gt;DO&lt;/span&gt; rows TIMES.&amp;lt;br&amp;gt;  &lt;span style=&quot;color: #0000FF&quot;&gt;NEW-LINE&lt;/span&gt;.&amp;lt;br&amp;gt;  &lt;span style=&quot;color: #0000FF&quot;&gt;DO&lt;/span&gt; cols TIMES.&amp;lt;br&amp;gt;       &lt;span style=&quot;color: #0000FF&quot;&gt;WRITE&lt;/span&gt; board+ofs(&lt;span style=&quot;color: #3399FF&quot;&gt;1&lt;/span&gt;).&amp;lt;br&amp;gt;       ofs = ofs + &lt;span style=&quot;color: #3399FF&quot;&gt;1&lt;/span&gt;.&amp;lt;br&amp;gt;  &lt;span style=&quot;color: #0000FF&quot;&gt;ENDDO&lt;/span&gt;.&amp;lt;br&amp;gt;  ofs = ofs + &lt;span style=&quot;color: #3399FF&quot;&gt;2&lt;/span&gt;.&amp;lt;br&amp;gt;&lt;span style=&quot;color: #0000FF&quot;&gt;ENDDO&lt;/span&gt;.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример 2: Закраска непрерывной области одного цвета&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;amp;quot;eight_directions = [-11, -10, -09,  -1, 1,  09, 10, 11] &lt;/span&gt;&amp;lt;br&amp;gt;&lt;span style=&quot;color: #0000FF&quot;&gt;FORM&lt;/span&gt; cell_floodfill USING&amp;lt;br&amp;gt;     start_ofs TYPE i&amp;lt;br&amp;gt;     color1    TYPE c&amp;lt;br&amp;gt;     color2    TYPE c.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;  &lt;span style=&quot;color: #0000FF&quot;&gt;DATA&lt;/span&gt;: floodfill TYPE TABLE OF i.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;  board+star_ofst(&lt;span style=&quot;color: #3399FF&quot;&gt;1&lt;/span&gt;) = color2.&amp;lt;br&amp;gt;  &lt;span style=&quot;color: #0000FF&quot;&gt;APPEND&lt;/span&gt; start_ofs TO floodfill.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;  &lt;span style=&quot;color: #0000FF&quot;&gt;LOOP&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;AT&lt;/span&gt; floodfill INTO ofs.&amp;lt;br&amp;gt;    &lt;span style=&quot;color: #0000FF&quot;&gt;LOOP&lt;/span&gt; &lt;span style=&quot;color: #0000FF&quot;&gt;AT&lt;/span&gt; eight_directions INTO dir.&amp;lt;br&amp;gt;      i = ofs + dir.&amp;lt;br&amp;gt;      &lt;span style=&quot;color: #0000FF&quot;&gt;if&lt;/span&gt; board+i(&lt;span style=&quot;color: #3399FF&quot;&gt;1&lt;/span&gt;) = color1.&amp;lt;br&amp;gt;         board+i(&lt;span style=&quot;color: #3399FF&quot;&gt;1&lt;/span&gt;) = color2.&amp;lt;br&amp;gt;         &lt;span style=&quot;color: #0000FF&quot;&gt;APPEND&lt;/span&gt; i TO floodfill.&amp;lt;br&amp;gt;      &lt;span style=&quot;color: #0000FF&quot;&gt;ENDIF&lt;/span&gt;.&amp;lt;br&amp;gt;    &lt;span style=&quot;color: #0000FF&quot;&gt;ENDLOOP&lt;/span&gt;.&amp;lt;br&amp;gt;  &lt;span style=&quot;color: #0000FF&quot;&gt;ENDLOOP&lt;/span&gt;.&amp;lt;br&amp;gt;&lt;span style=&quot;color: #0000FF&quot;&gt;ENDFORM&lt;/span&gt;.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Возможна быстрая и наглядная обработка всего поля операторами SEARCH, REPLACE, TRANSLATE.</description>
	    <author>mrand </author>
	    <pubDate>Tue, 31 Mar 2009 21:28:33 GMT</pubDate>
	  </item>
	</channel>
  </rss>
