Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн апр 23, 2018 09:51

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - [BF] TETRIS
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
Полный текст программы (текущей версии) см. подпись и далее по ссылкам, бинарный дистрибутив BF.dos16.rar уже пересобран, но достаточно скачать только отдельные изменившиеся файлы dos16.bat , TC.4th и TETRIS.4th и обновить старый бинарный дистрибутив

Запустив программку, можно приблизительно оценить скорость работы железки, движка и графического драйвера.

На моем дуал-турике в DOS-задаче вполне шустро работает, надо как нибудь запустить http://bochs.sf.net и посмотреть как оно в симуляторе под чистым DOSом будет шевелится
Сообщение Добавлено: Чт июн 14, 2007 23:41
  Заголовок сообщения:   Ответить с цитатой
чуть не забыл -- в коде используется слово ~* (при определении константы ~poolsz ), оно задано в коде целевого компилятора TC.4th

Код:
: ~* * ;     0x32 0op *


словами: сохраняем стандартное слово умножения под новым именем, а потом переопределяем его словом целевого компилятора.

по идее тут нужно пользоваться словарями, слова ЦК совать в словарь TC, порядок поиска задать TC потом FORTH, а при необходимости придумать слова скажем [F] и [T] которые будет переключать порядок поиска соответвенно FORTH,TC и наоборот TC,FORTH
Сообщение Добавлено: Чт июн 14, 2007 23:36
  Заголовок сообщения:   Ответить с цитатой
и наконец последнее слово и сейв байт-кода:
Код:
{ TETRIS
   gr/on
   CALCULATE_c
   begin
      POOLRANDFILL
      REDRAW
   gr/?key until gr/key drop
   gr/off bye
}

Код:
save" TETRIS"
Сообщение Добавлено: Чт июн 14, 2007 23:29
  Заголовок сообщения:   Ответить с цитатой
Для запуска программы в текущем состоянии нужно слово, которое бы случайно заполняло стакан, чтобы видеть как работает перерисовка (и что она вообще работает). В конечной программе тоже будет аналогичное слово, но заполняться будет только нижняя половина стакана -- при рестарте игры и когда выбито сколько-то линий и становится скушно заполнять стакан почти со дна.
Код:
{ POOLRANDFILL ( -- )
\ слово нужно для демонстрации работы REDRAW
\ выполняется перед перерисовкой экрана, заполняет стакан случайным образом
   w[h[   1 # rnd ( value ) i j pool!   ]]
}
Сообщение Добавлено: Чт июн 14, 2007 23:28
  Заголовок сообщения:   Ответить с цитатой
вот этот ^^^ кусок -- иллюстрация как пользоваться выше определенными макросами
тут главное не переусердствовать, а то получится как тот пример шахмат на Си, написанный целиком на макросах 8-)
Сообщение Добавлено: Чт июн 14, 2007 23:26
  Заголовок сообщения:   Ответить с цитатой
Код:
{ pool/draw ( x y -- )
\ отрисовка x;y элемента стакана
   over ( x ) c * cell/x !      \ экранная координата X элемента
   dup  ( y ) c * cell/y !      \ экранная координата Y элемента
   ( x y )
   pool@ if         \ чтение состояния элемента стакана
      x[y[ i j gr/set ]]
   else
      x[y[ i j gr/clr ]]
   endif
}

Код:
{ REDRAW ( -- )
\ перерисовка экрана
   w[h[ i j pool/draw ]]      \ цикл отрисовки стакана
}
Сообщение Добавлено: Чт июн 14, 2007 23:24
  Заголовок сообщения:   Ответить с цитатой
вспомогательные переменные и макросы, используются при отрисовке клеток стакана

Код:
0 var cell/x            \ \ экранные координаты угла элемента
0 var cell/y            \ /

Код:
: x1   cell/x @ ;   : x2   x1 c +     ;
: y1   cell/y @ ;   : y2   y1 c +    ;

Код:
: x[y[
\ макрос заголовка цикла по 2м координатам
   y2 y1 do
      x2 x1 do
;
Сообщение Добавлено: Чт июн 14, 2007 23:22
  Заголовок сообщения:   Ответить с цитатой
Код:
0 var (c)   : c (c) @ ;      \ размер элемента стакана в пикселах

Код:
: CALCULATE_c ( -- )
\ определение размера элемента в пикселах
\ по размерам экрана и размерам стакана
\ слово вызывается после старта графического драйвера
   gr/Xsz w / ( Xsz/w )
   gr/Ysz h / ( Ysz/h )
          min ( cvalue ) (c) !
;


Если размеры экрана (граф.окна) могут меняться в процессе работы программы, нужно переписать слово c так, чтобы оно проверяло что размеры экрана изменились, и выводило требуемый размер ячейки в зависимости от новых размеров экрана:

Код:
{ c ( -- sz )
\ вариант с отслеживанием динамически меняющегося размера графического окна
\ без кеширования -- движок шустрый, операции деления дешевы, вычисляем с каждый
\ раз заново, не сравнивая предыдущие и текущие значения Xsz Ysz
     gr/Xsz w / ( Xsz/w ) gr/Ysz h / ( Ysz/h ) min ( cvalue )
}
Сообщение Добавлено: Чт июн 14, 2007 23:18
  Заголовок сообщения:   Ответить с цитатой
блин, поползло все форматирование в нотепаде сделанное 8-\
Сообщение Добавлено: Чт июн 14, 2007 23:12
  Заголовок сообщения:   Ответить с цитатой
Код:
_w _h ~* CONSTANT ~poolsz      \ \ размер буфера стакана
~poolsz const poolsz         \ /

Код:
~poolsz buffer pool         \ буфер стакана

Код:
: pool[] ( x y -- offset=y*w+x )
\ пересчет кооржинат в стакане в смещение от начала буфера
   ( y ) w * ( x ) +
;

Код:
{ pool@ ( x y -- value )
\ чтение состояния элемента
   ( x y )    pool[]       \ координаты --> смещение от начала буфера
   ( offset ) pool +       \ смещение --> адрес памяти
   ( addr )   c@          \ элемент стакана кодируется байтом
}

Код:
{ pool! ( value x y -- )
\ запись элемента стакана
   ( x y )          pool[]      \ смещение
   ( offset )     pool +      \ адрес
   ( value addr ) c!      \ запись элемента
}
Сообщение Добавлено: Чт июн 14, 2007 23:08
  Заголовок сообщения:   Ответить с цитатой
для повышения читабельности кода применил макросы

Код:
: w[h[
\ макрос начала цикла по стакану
   h 0 # ( h 0 ) do
      w 0 # ( w 0 ) do
;


Код:
: ]]
\ макрос конца цикла по 2м координатам
      loop
   loop
;
Сообщение Добавлено: Чт июн 14, 2007 23:03
  Заголовок сообщения:   Ответить с цитатой
Код:
10 CONSTANT _w   _w const w      \ ширина стакана
20 CONSTANT _h   _h const h      \ высота стакана
Сообщение Добавлено: Чт июн 14, 2007 23:02
  Заголовок сообщения:   Ответить с цитатой
ну например версия движка (а) -- тупая однозадачка, а версия (б) умеет нити: вот и получается что для (б) лучше раализовать тот же ТЕТРИС в виде нескольких параллельных нитей, код получается понимабельнее, проще и красивше
тот же пример для движка (1) который умеет только точки выводить и (2) 2D с поддержкой векторных примитивов
или версия (йо) с цветными анимашками, свистелками и перделками зачищается и получается симулятор китайского брелка
вполне себе рефакторинг
Сообщение Добавлено: Чт июн 14, 2007 23:00
  Заголовок сообщения:   Ответить с цитатой
Хищник писал(а):
Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?

Да, в качестве следующей лабораторной работы... ;)
Сообщение Добавлено: Пн июн 04, 2007 00:12
  Заголовок сообщения:   Ответить с цитатой
Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?
Сообщение Добавлено: Вс июн 03, 2007 20:41

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB