Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
Полный текст программы (текущей версии) см. подпись и далее по ссылкам, бинарный дистрибутив BF.dos16.rar уже пересобран, но достаточно скачать только отдельные изменившиеся файлы dos16.bat , TC.4th и TETRIS.4th и обновить старый бинарный дистрибутив
Запустив программку, можно приблизительно оценить скорость работы железки, движка и графического драйвера.
На моем дуал-турике в DOS-задаче вполне шустро работает, надо как нибудь запустить http://bochs.sf.net и посмотреть как оно в симуляторе под чистым DOSом будет шевелится
Полный текст программы (текущей версии) см. подпись и далее по ссылкам, бинарный дистрибутив BF.dos16.rar уже пересобран, но достаточно скачать только отдельные изменившиеся файлы dos16.bat , TC.4th и TETRIS.4th и обновить старый бинарный дистрибутив
Запустив программку, можно приблизительно оценить скорость работы железки, движка и графического драйвера.
На моем дуал-турике в DOS-задаче вполне шустро работает, надо как нибудь запустить [url]http://bochs.sf.net[/url] и посмотреть как оно в симуляторе под чистым DOSом будет шевелится
|
|
|
|
Добавлено: Чт июн 14, 2007 23:41 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
чуть не забыл -- в коде используется слово ~* (при определении константы ~poolsz ), оно задано в коде целевого компилятора TC.4th
Код: : ~* * ; 0x32 0op *
словами: сохраняем стандартное слово умножения под новым именем, а потом переопределяем его словом целевого компилятора.
по идее тут нужно пользоваться словарями, слова ЦК совать в словарь TC, порядок поиска задать TC потом FORTH, а при необходимости придумать слова скажем [F] и [T] которые будет переключать порядок поиска соответвенно FORTH,TC и наоборот TC,FORTH
чуть не забыл -- в коде используется слово ~* (при определении константы ~poolsz ), оно задано в коде целевого компилятора TC.4th
[code] : ~* * ; 0x32 0op * [/code]
словами: сохраняем стандартное слово умножения под новым именем, а потом переопределяем его словом целевого компилятора.
по идее тут нужно пользоваться словарями, слова ЦК совать в словарь 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"
и наконец последнее слово и сейв байт-кода:
[code] { TETRIS gr/on CALCULATE_c begin POOLRANDFILL REDRAW gr/?key until gr/key drop gr/off bye } [/code] [code] save" TETRIS" [/code]
|
|
|
|
Добавлено: Чт июн 14, 2007 23:29 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Для запуска программы в текущем состоянии нужно слово, которое бы случайно заполняло стакан, чтобы видеть как работает перерисовка (и что она вообще работает). В конечной программе тоже будет аналогичное слово, но заполняться будет только нижняя половина стакана -- при рестарте игры и когда выбито сколько-то линий и становится скушно заполнять стакан почти со дна.
Код: { POOLRANDFILL ( -- ) \ слово нужно для демонстрации работы REDRAW \ выполняется перед перерисовкой экрана, заполняет стакан случайным образом w[h[ 1 # rnd ( value ) i j pool! ]] }
Для запуска программы в текущем состоянии нужно слово, которое бы случайно заполняло стакан, чтобы видеть как работает перерисовка (и что она вообще работает). В конечной программе тоже будет аналогичное слово, но заполняться будет только нижняя половина стакана -- при рестарте игры и когда выбито сколько-то линий и становится скушно заполнять стакан почти со дна.
[code] { POOLRANDFILL ( -- ) \ слово нужно для демонстрации работы REDRAW \ выполняется перед перерисовкой экрана, заполняет стакан случайным образом w[h[ 1 # rnd ( value ) i j pool! ]] } [/code]
|
|
|
|
Добавлено: Чт июн 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 ]] \ цикл отрисовки стакана }
[code] { 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 } [/code] [code] { REDRAW ( -- ) \ перерисовка экрана w[h[ i j pool/draw ]] \ цикл отрисовки стакана } [/code]
|
|
|
|
Добавлено: Чт июн 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 ;
вспомогательные переменные и макросы, используются при отрисовке клеток стакана
[code] 0 var cell/x \ \ экранные координаты угла элемента 0 var cell/y \ / [/code] [code] : x1 cell/x @ ; : x2 x1 c + ; : y1 cell/y @ ; : y2 y1 c + ; [/code] [code] : x[y[ \ макрос заголовка цикла по 2м координатам y2 y1 do x2 x1 do ; [/code]
|
|
|
|
Добавлено: Чт июн 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 ) }
[code] 0 var (c) : c (c) @ ; \ размер элемента стакана в пикселах [/code] [code] : CALCULATE_c ( -- ) \ определение размера элемента в пикселах \ по размерам экрана и размерам стакана \ слово вызывается после старта графического драйвера gr/Xsz w / ( Xsz/w ) gr/Ysz h / ( Ysz/h ) min ( cvalue ) (c) ! ; [/code]
Если размеры экрана (граф.окна) могут меняться в процессе работы программы, нужно переписать слово c так, чтобы оно проверяло что размеры экрана изменились, и выводило требуемый размер ячейки в зависимости от новых размеров экрана:
[code] { c ( -- sz ) \ вариант с отслеживанием динамически меняющегося размера графического окна \ без кеширования -- движок шустрый, операции деления дешевы, вычисляем с каждый \ раз заново, не сравнивая предыдущие и текущие значения Xsz Ysz gr/Xsz w / ( Xsz/w ) gr/Ysz h / ( Ysz/h ) min ( cvalue ) } [/code]
|
|
|
|
Добавлено: Чт июн 14, 2007 23:18 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
блин, поползло все форматирование в нотепаде сделанное 8-\
блин, поползло все форматирование в нотепаде сделанное 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! \ запись элемента }
[code] _w _h ~* CONSTANT ~poolsz \ \ размер буфера стакана ~poolsz const poolsz \ / [/code] [code] ~poolsz buffer pool \ буфер стакана [/code] [code] : pool[] ( x y -- offset=y*w+x ) \ пересчет кооржинат в стакане в смещение от начала буфера ( y ) w * ( x ) + ; [/code] [code] { pool@ ( x y -- value ) \ чтение состояния элемента ( x y ) pool[] \ координаты --> смещение от начала буфера ( offset ) pool + \ смещение --> адрес памяти ( addr ) c@ \ элемент стакана кодируется байтом } [/code] [code] { pool! ( value x y -- ) \ запись элемента стакана ( x y ) pool[] \ смещение ( offset ) pool + \ адрес ( value addr ) c! \ запись элемента } [/code]
|
|
|
|
Добавлено: Чт июн 14, 2007 23:08 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
для повышения читабельности кода применил макросы
Код: : w[h[ \ макрос начала цикла по стакану h 0 # ( h 0 ) do w 0 # ( w 0 ) do ;
Код: : ]] \ макрос конца цикла по 2м координатам loop loop ;
для повышения читабельности кода применил макросы
[code] : w[h[ \ макрос начала цикла по стакану h 0 # ( h 0 ) do w 0 # ( w 0 ) do ; [/code]
[code] : ]] \ макрос конца цикла по 2м координатам loop loop ; [/code]
|
|
|
|
Добавлено: Чт июн 14, 2007 23:03 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Код: 10 CONSTANT _w _w const w \ ширина стакана 20 CONSTANT _h _h const h \ высота стакана
[code] 10 CONSTANT _w _w const w \ ширина стакана 20 CONSTANT _h _h const h \ высота стакана [/code]
|
|
|
|
Добавлено: Чт июн 14, 2007 23:02 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
ну например версия движка (а) -- тупая однозадачка, а версия (б) умеет нити: вот и получается что для (б) лучше раализовать тот же ТЕТРИС в виде нескольких параллельных нитей, код получается понимабельнее, проще и красивше
тот же пример для движка (1) который умеет только точки выводить и (2) 2D с поддержкой векторных примитивов
или версия (йо) с цветными анимашками, свистелками и перделками зачищается и получается симулятор китайского брелка
вполне себе рефакторинг
ну например версия движка (а) -- тупая однозадачка, а версия (б) умеет нити: вот и получается что для (б) лучше раализовать тот же ТЕТРИС в виде нескольких параллельных нитей, код получается понимабельнее, проще и красивше
тот же пример для движка (1) который умеет только точки выводить и (2) 2D с поддержкой векторных примитивов
или версия (йо) с цветными анимашками, свистелками и перделками зачищается и получается симулятор китайского брелка
вполне себе рефакторинг
|
|
|
|
Добавлено: Чт июн 14, 2007 23:00 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?
Да, в качестве следующей лабораторной работы...
[quote="Хищник"]Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?[/quote]
Да, в качестве следующей лабораторной работы... ;)
|
|
|
|
Добавлено: Пн июн 04, 2007 00:12 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?
Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?
|
|
|
|
Добавлено: Вс июн 03, 2007 20:41 |
|
|
|
|