Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт дек 15, 2017 17:45

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: [BF] TETRIS
СообщениеДобавлено: Вс июн 03, 2007 19:42 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
первое реальное приложение для ФортОС (BF), игрушка, графика монохромная для портабельности на разное железо, управление с клавы или джойстика, тоже отображенного на клаву

я уже публиковал на форуме исходник для старой версии движка, нужно только сделать рефакторинг, что-то выкинуть, попытаться упростить код для понимания

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 03, 2007 20:13 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6100
Благодарил (а): 14 раз.
Поблагодарили: 96 раз.
/me вчувствуется в термин "рефакторинг тетриса" :shuffle;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 03, 2007 20:35 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Ну чего там, всё нуно рефакторизовать, даже тетрис, автор имеет право после такой работы.

_________________
понимаю некоторую бестолковость некоторых вопросов


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 03, 2007 20:41 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6100
Благодарил (а): 14 раз.
Поблагодарили: 96 раз.
Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 04, 2007 00:12 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Хищник писал(а):
Я вот думаю, имеет ли смысл рефакторизовать лабораторные работы по основам программирования?

Да, в качестве следующей лабораторной работы... ;)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:00 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
ну например версия движка (а) -- тупая однозадачка, а версия (б) умеет нити: вот и получается что для (б) лучше раализовать тот же ТЕТРИС в виде нескольких параллельных нитей, код получается понимабельнее, проще и красивше
тот же пример для движка (1) который умеет только точки выводить и (2) 2D с поддержкой векторных примитивов
или версия (йо) с цветными анимашками, свистелками и перделками зачищается и получается симулятор китайского брелка
вполне себе рефакторинг

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:02 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код:
10 CONSTANT _w   _w const w      \ ширина стакана
20 CONSTANT _h   _h const h      \ высота стакана

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:03 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
для повышения читабельности кода применил макросы

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


Код:
: ]]
\ макрос конца цикла по 2м координатам
      loop
   loop
;

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:08 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код:
_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!      \ запись элемента
}

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:12 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
блин, поползло все форматирование в нотепаде сделанное 8-\

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:18 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код:
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 )
}

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:22 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
вспомогательные переменные и макросы, используются при отрисовке клеток стакана

Код:
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
;

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:24 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код:
{ 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 ]]      \ цикл отрисовки стакана
}

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:26 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
вот этот ^^^ кусок -- иллюстрация как пользоваться выше определенными макросами
тут главное не переусердствовать, а то получится как тот пример шахмат на Си, написанный целиком на макросах 8-)

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 14, 2007 23:28 
Не в сети

Зарегистрирован: Сб май 06, 2006 18:43
Сообщения: 400
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Для запуска программы в текущем состоянии нужно слово, которое бы случайно заполняло стакан, чтобы видеть как работает перерисовка (и что она вообще работает). В конечной программе тоже будет аналогичное слово, но заполняться будет только нижняя половина стакана -- при рестарте игры и когда выбито сколько-то линий и становится скушно заполнять стакан почти со дна.
Код:
{ POOLRANDFILL ( -- )
\ слово нужно для демонстрации работы REDRAW
\ выполняется перед перерисовкой экрана, заполняет стакан случайным образом
   w[h[   1 # rnd ( value ) i j pool!   ]]
}

_________________
http://akps.ssau.ru/forth/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

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


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

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