Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Звёздочки


Автор: Сый 25.3.2006, 19:10
Написал такой вот код:
Код

ОТДЕЛ Зв+;

ИСПОЛЬЗУЕТ
  Вывод ИЗ "...\Отделы\Обмен\",
  ОС    ИЗ "...\Отделы\Обмен\",
  Матем ИЗ "...\Отделы\Числа\",
  Цепь  ИЗ "...\Отделы\Иное\";

ЗАДАЧА ВывестиЗв();
ПОСТ
  ЦветПоУмолчанию = 7;
ПЕР
  Ху, Ух: ЦЕЛ;
  МинЦепьЗнак: РЯД 2 ИЗ ЗНАК;
ЗАДАЧА Вывести(Знак: ЗНАК);
УКАЗ
    МинЦепьЗнак := "";
    Цепь.ДобавитьЗнак(МинЦепьЗнак, Знак);
    Вывод.ВПрямоуг(Ху, Ух, Ху, Ух, МинЦепьЗнак);
    ОС.Спать(150)
КОН Вывести;
УКАЗ
  Ху := УЗК(ВШИРЦЕЛ(Матем.случ()*79)); Ух := УЗК(ВШИРЦЕЛ(Матем.случ()*24));
  Вывод.Цвет(Ху, Ух, Ху, Ух, (ЦветПоУмолчанию ДЕЛИТЬ 16)+УЗК(ВШИРЦЕЛ(Матем.случ()*15)));
  Вывести(ВЗНАК(95H));
  Вывести(ВЗНАК(2AH));
  Вывести(ВЗНАК(0FH));
  Вывести(" ");
  Вывод.Цвет(Ху, Ух, Ху, Ух, ЦветПоУмолчанию)
КОН ВывестиЗв;


УКАЗ
  КОЛЬЦО ВывестиЗв; ОС.Спать(150) КОН

КОН Зв.

Он выводит на экране командной строки в случайном месте звёздочку случайного цвета, которая увеличивается (в три этапа: точка, '*' и более крупная звёздочка) и исчезает. Чтобы проходило некоторое время между этапами развития звёздочки и между их появлением используется задача ОС.Спать (sleep из WinAPI). А нужно мне, чтобы выводилось сразу несколько этих самых звёздочек на экран - пока одна будет развиваться, другая должна будет появляться.

Автор: maxim1000 25.3.2006, 23:31
ну так в теле цикла выводить не одну звездочку, а несколько
можно сделать массив, который содержит состояния всех звездочек, и:
1. использовать его содержимое для вывода каждой звездочки
2. изменять его при каждом проходе цикла
например, массив может содержать сами символы, которые используются при выводе звездочки

Модератор:
теперь небольшое обращение ко всем, кто собирается тут что-то писать (основано на опыте предыдущих тем): при появлении вопросов (и ответов), которые касаются самого языка Глагол, но не касаются данной задачи, я либо удалю эти сообщения, либо (если вся дискуссия скатится в ту сторону) выкину тему куда-нибудь...

Автор: Сый 26.3.2006, 00:02
Да решение это просто, само собой на ум приходит, да вот задача ОС.Спать известна тем, что прерывает выполнение приложения на указанное время. То есть пока программа спит, ничего произойти в ней не может.
Думаю, тут нужно сделать задачу, которая будет создавать новую звезду и обновлять существующие, и сразу после этого отправлять программу в спячку на 150 мс, например. Естественно, тогда нужно будет использовать ряд (массив) координат каждой звезды. Если это было бы так просто для меня, не обращался бы за помощью smile

Автор: maxim1000 26.3.2006, 00:40
Цитата(Сый @ 25.3.2006, 23:02 Найти цитируемый пост)
Думаю, тут нужно сделать задачу, которая будет создавать новую звезду и обновлять существующие, и сразу после этого отправлять программу в спячку на 150 мс, например. Естественно, тогда нужно будет использовать ряд (массив) координат каждой звезды

именно это я и имел в виду - не связывать паузу с выводом только одной звездочки
только я не понимаю, в чем теперь проблема?
есть массив координат, массив состояний, количество звездочек (т.е. кол-во используемых ячеек в массивах)
делаем цикл
в нем:
1. для каждой звезды (т.е. еще один цикл внутри) выводим ее текущее состояние (координаты и символ берем из массива)
2. все звезды, у которых состояние последнее, удаляем
3. у остальных делаем состояние следующим
4. по какому-то критерию (например, каждые 10 проходов) создаем новую звездочку
5. пауза...

Автор: Сый 26.3.2006, 09:16
Спасибо, попробую осуществить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)