Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Описание алгоритма программы. Функции GetSym(xl,yl), GetAtr(xl,yl) читают непосредственно из видеопамяти дисплея символ и. Текст программы
Основная функция main() проверяет, был ли в командной строке дополнительный параметр. Если нет, программа не очищает старый экран. Если какой-нибудь параметр был, то экран очищается и выводится инструкция по управлению программой. Далее в основной программе выполняется бесконечный цикл, в котором обрабатываются коды нажатых клавиш и, в зависимости от них, вызываются вспомогательные функции. Выход из цикла - по клавише Esc. Функции GetSym(xl,yl), GetAtr(xl,yl) читают непосредственно из видеопамяти дисплея символ и атрибут соответственно. Функции PutSym(xl,yl,sym), PutAtr(xl,yl,atr) выводят непосредственно в видеопамять дисплея символ и атрибут соответственно. Во всех этих четырех функциях координаты задаются в квадрате 79х24 символов (нумерация начинается с нуля). Функция Invert(xl ,уl) использует функции GetAtr и PutAtr для инверсии прямоугольника экрана размером 10х5 по маске 0x7f, при этом независимо выполняется инверсия фона и цвета символа. Функция Change(x,y) обменивает содержимое текущего участка с содержимым левого верхнего участка путем последовательного побайтного обмену атрибутов и символов. Она использует функции GetSym, GetAtr, PutSym, PutAtr. Функция RandText(void) - псевдослучайным образом перетасовывает все участки на экране, при этом она в цикле увеличивает на единицу локальные в данной функции координаты текущегo участка xk , yk и обращается к функции Change. Таким образом достигается эффект перемешивания. Функция работает, пока не будет нажата любая клавиша.
Текст программы /* --------------------------Лабораторная работа ---------------------*/ /* -----------------------Управление видеоадаптером------------------*/ #include <dos.h>
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> /*----------------------Константы------------------------------------*/ #define VSEG 0хЬ800 /* Сегментный адрес видеопамяти */ #define byte unsigned char #define word unsigned int #define Esc 27 #define Spase 32 #define Enter 13 #define Up 0х48 #define Down 0х50 #define Left 0х4h #define Right 0x4d #define Ноmе 0х47 int xk, yk; /*----------------------Чтение символа из видеопамяти --------------*/ byte GetSym(x1,y1) int х1, у1; { return(peekb(VSEG,y1*160+x1*2)); } /*-------------------Чтение атрибута из видеопамяти ----------------*/ byte GetAtr(x1,y1) int х1, у1 ; { return(peekb(VSEG,y1*160+x1*2+1)); } /*-------------------3апись символа в видеопамять ------------------*/ void PutSym(x1,y1,sym) int х1, у1 ; byte sym; { pokeb(VSEG,y1*160+x1*2,sym); } /*--------------------3апись атрибута в видеопамять ----------------*/ void PutAtr(x1,y1,atr) int х1, у1 ; byte atr; { pokeb(VSEG,y1*160+x1*2+1,atr); } /*---------------------Инверсия квадрата на экране ------------------*/ void Invert(x1,y1) int х1, у1; { byte b; int i,j; for (j=0;j<5;j++) for (i=0;i<10;i++) { b=GetAtr(x1*10+i,y1*5+j); PutAtr(x1*10+i,y1*5+j, (b-0x7f)); } } /*--------------3амена текущего квадрата на левый верхний------*/ void Change(x,y) byte х, у; { int i, j ; byte bа, bs; if ((x!=0)||(y!=0)) for (j=0;j<5;j++) for (i=0;i<10;i++) { bs=GetSym(x*10+i,y*5+j); ba=GetAtr(x*10+i,y*5+j); PutSym(x*10+i,y*5+j,GetSym(i,j)); PutAtr(x*10+i,y*5+j,GetAtr(i,j)); PutSym(i, j , bs); PutAtr(i,j,ba); } } /*-------Перемешивание квадратов до нажатия клавиши----------*/ void RandText(void) { Invert(xk, yk); xk=5; yk=1 ; while(! kbhit()) { Change(xk, yk); xk++; I if (xk>7) xk=0; yk++; if (yk>4) yk=0; } Invert(xk, yk); } /*----------------------------Начало основной программы-------------*/ mаin(int argn,char *argc[]) { int i;
xk=0; yk=0; if (argn>1){} else /* Если параметров нет, вывод инструкции */ { textattr(10); clrscr(); cprintf(“------------------------------“); cprintf(“-------- Лабораторная работа------------------“); cprintf(“------------------------------“); cprintf(“------------------------------“); cprintf(“ Управление видеоадаптером.”) cprintf(“------------------------------“); textattr( 15); gotoxy(23, 4); срrintf(“Демонстрация работы с видеопамятью."); textattr(12); gotoxy(30,6);cprintf(“« М О 3 А И К А »”); textattr(14); gotoxy(30, 8); cprintf (“Клавиши управления: “); gotoxy(7, 10); cprintf(“< Left, Right, Up, Down> - “); cprintf( “управление выделенным квадратом. “); gotoxy(7, 11);cprintf(“<Spase Ваr> - Обмен содержимым “); cprintf( “между выделенным квадратом”); gotoxy(7, 12);cprintf(“ и левым верхним”); cprintf(“ квадратом. “); gotoxy(7, 13); cprintf(“<Enter> - перемешивание квадратов"); cprintf( “ до нажатия любой клавиши. “); gotoxy(7,14);cprintf("<Esc> - выход.”); textattr( 11); gotoxy(28, 16);срrintf(“З А Д А Ч А И Г Р Ы :”); gotoxy(14, 17);срrintf(“Собрать при помощи клавиш “); срrintf(“управления начальный экран. “); textattr(12); gotoxy(27, 19);срrintf(“Ж е л а е м у с п е х а ,”-); textattr(7); gоtоху(1,21);срrintf(“Примечание: При запуске с”); срrintf(“параметром <->”); gotoxy( 1 3,22); cprintf( “начальным экраном для игры “); cprintf( “является текущий. “); } Invert(xk, yk); for(i=0;i= =0; ) switch(getch() ) { /* Обработка нажатых клавиш */ case Esc: i++; break; case Enter:RandText();break; case Spase:Invert(xk,yk);
Change(xk, yk); Invert(xk, yk); break; case 0: switch (getch()) { case Left:Invert(xk,yk); xk--; if(xk<0) xk=7; Invert(xk, yk); break; case Right:Invert(xk,yk); xk++; if (xk> 7) xk=0; Invert(xk, yk); break; case Up:Invert(xk,yk); yk--; if(yk<0) yk=4; Invert(xk, yk); break; case Down:Invert(xk,yk); yk++; if (yk>4) yk=0; Invert(xk, yk); break; } Invert(xk, yk); } |
Последнее изменение этой страницы: 2019-05-08; Просмотров: 174; Нарушение авторского права страницы