Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Описание алгоритма программы. Функции 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; Просмотров: 172; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.022 с.)
Главная | Случайная страница | Обратная связь