• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Графическая задача на Паскале

  • Автор темы Автор темы Altana
  • Дата начала Дата начала

Altana

Новые
Регистрация
12 Апр 2012
Сообщения
28
Реакции
0
Баллы
0
Графическая задача на Паскале

Через процедуру сделать мигающий квадрат.. Т.е в центре экрана появляется квадрат, затем исчезает, затем появляется другой, но уже другого цвета и другого размера, затем исчезает, затем другой и т.д. Это продолжается, пока пользователь не нажмет Esc.
:tehnari_ru_837:
 
Какой Паскаль - ABC? Free? Turbo? Когда речь о графике, это принципиальнейший момент! Пока подскажу простейший алгоритм. В цикле:
1. Задаем цвет.
2. Рисуем квадрат.
3. Меняем цвет на фоновый.
4. Рисуем тот же квадрат.
5. Переходим к п.1.
 
Turbo Pascal.
п.3 - нельзя ли просто сделать отчистку экрана с помощью ClrScr?
 
п.3 - нельзя ли просто сделать отчистку экрана с помощью ClrScr?
Можно и так. Просто дольше.
Фу, прошу прощения - поторопился. Не ClrScr (это текстовая CRT-шная команда), а ее графическим аналогом ClearDevice.
 
Даже нарисовал программку - самому интересно стало:
Код:
Uses CRT, Graph;
Var
 A:Word;
 C:Char;
Begin
 InitGraph(..); [COLOR=Red][B]{ТУТ САМОСТОЯТЕЛЬНО}[/B][/COLOR]
 Randomize;
 SetLineStyle(SolidLn,0,ThickWidth);
 Repeat
  A:=(Round(GetMaxY*0.1)+Random(Round(GetMaxY*0.9))) div 2;
  SetColor(1+Random(15));
  Rectangle((GetMaxX div 2)-A,(GetMaxY div 2)+A,
            (GetMaxX div 2)+A,(GetMaxY div 2)-A);
  Delay(100);
  SetColor(GetBkColor);
  Rectangle((GetMaxX div 2)-A,(GetMaxY div 2)+A,
            (GetMaxX div 2)+A,(GetMaxY div 2)-A);
  If KeyPressed then C:=ReadKey;
 Until C=#27;
 CloseGraph;
End.
 
чорд.. мне тут вообще ничего не понятно, неизвестные команды(
 
чорд.. мне тут вообще ничего не понятно, неизвестные команды(
Конкретнее? А вообще-то это самые обычные команды Borland-графики (модуль Graph). Установить толщину линии, выбрать цвет, нарисовать квадрат... да и всё вроде.
 
честно эти команды впервые вижу, мне бы уровень 10 класса) ну там циклы, условия и т.п)
иии..что такое "GetMахХ"? И для чего вводится переменная "А"?
 
что такое "GetMахХ"? И для чего вводится переменная "А"?
GetMaxX - это функция, возвращающая максимальное значение (в пикселах) горизонтальной координаты графического экрана. Поскольку я работаю в DOS VGA моде, то у меня это 640. Соответственно GetMaxY - то же для вертикальной координаты (у меня - 480). При этом не забываем, что отсчет вертикалей ведется сверху вниз, т.е. точка с координатами 0,0 - это левый верхний угол экрана.
A - это половина стороны квадрата. В программе сделано так: если H - полная высота экрана, то полная длина стороны квадрата выбирается случайным образом из диапазона (0.1*Н)..(0.9*Н).
 
А впрочем, ладно - попробую объяснить смысл каждой из команд.

Код:
Uses CRT, Graph; [COLOR=SeaGreen][B]{Подключаем дополнительные модули}[/B][/COLOR]
Var [COLOR=SeaGreen][B]{Объявляем переменные}[/B][/COLOR]
 A:Word;
 C:Char;
Begin
 InitGraph(..); [COLOR=Red][B]{ТУТ САМОСТОЯТЕЛЬНО}[/B][/COLOR] [COLOR=SeaGreen][B]{Конфигурируем процедуру запуска графического режима и запускаем его}[/B][/COLOR]
 Randomize; [COLOR=SeaGreen][B]{Включаем генератор случайных чисел}[/B][/COLOR]
 SetLineStyle(SolidLn,0,ThickWidth); [COLOR=SeaGreen][B]{Устанавливаем стиль рисования линий - сплошная, жирная}[/B]
 [/COLOR]Repeat [COLOR=SeaGreen][B]{Открываем цикл рисования квадратов}[/B][/COLOR]
  A:=(Round(GetMaxY*0.1)+Random(Round(GetMaxY*0.9))) div 2; [COLOR=SeaGreen][B]{Случайным образом выбираем значение половины стороны квадрата от 0.05*Н до 0.45*Н, где Н - полная высота экрана в пикселах}[/B][/COLOR]
  SetColor(1+Random(15)); [COLOR=SeaGreen][B]{Случайным образом выбираем цвет квадрата; нумерация цветов на картинке внизу}[/B][/COLOR]
  Rectangle((GetMaxX div 2)-A,(GetMaxY div 2)+A,
            (GetMaxX div 2)+A,(GetMaxY div 2)-A); [COLOR=SeaGreen][B]{Рисуем квадрат, указывая координаты левого нижнего и правого верхнего углов}[/B][/COLOR]
  Delay(100); [COLOR=SeaGreen][B]{Даем задержку в 0.1 секунды, иначе никаких квадратов разглядеть будет просто невозможно}
  [/B][/COLOR]SetColor(GetBkColor); [COLOR=SeaGreen][B]{Устанавливаем цвет, равный цвету фона} 
  [/B][/COLOR]Rectangle((GetMaxX div 2)-A,(GetMaxY div 2)+A,
            (GetMaxX div 2)+A,(GetMaxY div 2)-A); [COLOR=SeaGreen][B]{Снова рисуем тот же квадрат, но уже фоновым цветом, в результате чего нарисованный квадрат исчезает}[/B][/COLOR]
  If KeyPressed then C:=ReadKey; [COLOR=SeaGreen][B]{Проверяем, не нажата ли какая-нибудь клавиша, а если нажата, то ее мнемокод передаем переменной С}[/B][/COLOR]
 Until C=#27; [COLOR=SeaGreen][B]{Если нажатая клавиша - это клавиша Esc, то завершаем цикл}[/B][/COLOR]
 CloseGraph; [COLOR=SeaGreen][B]{Отменяем графический режим. Команда необязательная, но желательная}[/B][/COLOR]
End.
 

Вложения

  • BGIDEMO.webp
    BGIDEMO.webp
    7.8 KB · Просмотры: 272
Вот теперь всё понятно, спасибо большое!! tehno011
 
Спасибо большое))
 
Ага, пробовала) всё круто, всё работает) аж завораживает)
 
Назад
Сверху