Задание на лабораторную работу
Разработать, написать и отладить программу управления перемещением символа (например, "*") в пределах заданного на экране окна. Для управления использовать функциональные клавиши F9, F10. Для ввода использовать стандартные функции языка C++ (getch, getche, kbhit, bioskey). Сохранить отлаженную программу.
Изменить программу, заменив стандартные функции библиотеки C++(getch, getche, kbhit, bioskey) своими. Для написания функций использовать заданное прерывание INT 16h. Если его возможностей не достаточно, то заменить его по своему усмотрению. Сохранить отлаженную программу.
Две отлаженные программы предъявить преподавателю.
Алгоритмы и тексты отлаженных программ
Функция Direction (рисунок 1), определяющая направление движения символа в зависимости от нажатой клавиши.
Рисунок 1 - функция Direction
Функция main (рисунок 2). Задает окно и начальное положение символа, после чего постоянно перемещает «?» до тех пор, пока не будет нажата клавиша Escape или символ не дойдет до границы окна.
Рисунок 2 – функция main
Функция Our_Getch (рисунок 3). Является аналогом встроенной функции getch из функций С++.
Рисунок 3 – функция Our_Getch
Функция Our_Kbhit (рисунок 4). Является аналогом встроенной функции kbhit из функций С++.
Рисунок 4 – функция Our_Kbhit
Функция Direction для второй версии программы с использованием написанных функций (рисунок 5), определяющая направление движения символа в зависимости от нажатой клавиши.
Рисунок 5 – функция Direction
Функция main для второй версии программы (рисунок 6). Задает окно и начальное положение символа, после чего постоянно перемещает «?» до тех пор, пока не будет нажата клавиша Escape или символ не дойдет до границы окна.
Рисунок 6 – функция main
Текст программы 1 с использованием стандартных функций:
#include <stdio.h>
#include <conio.h>
#include <bios.h>
#include <dos.h>
#define ESCAPE 27
#define UP 67
#define DOWN 68
#define X1 20
#define X2 60
#define Y1 12
#define Y2 23
int Direction(int& direction)
{
char ch;
if (kbhit()) {
int ch = getch();
if (ch == ESCAPE) direction = 3;
if (ch == 0 || ch == 224) {
switch (getch()) {
case DOWN:
direction = 2;
break;
case UP:
direction = 1;
break;
}
return 1;
}
}
}
int main()
{
int x, y;
int direction = 0;
x = 20;
y = 7;
window(X1, Y1, X2, Y2);
textbackground(9);
textcolor(11);
_setcursortype(_NOCURSOR);
clrscr();
gotoxy(x, y);
printf("?");
do {
Direction(direction);
if (direction == 1) {
clrscr();
y--;
if (y <= 1) {
y = 1;
}
gotoxy(x, y);
printf("?");
}
else if (direction == 2) {
clrscr();
y++;
if (y >= (Y2 - Y1 + 1)) {
y = Y2 - Y1 + 1;
}
gotoxy(x, y);
printf("?");
}
delay(100);
} while (direction != 3);
return 0;
}
Текст программы 2 с использованием написанных функций:
#include <stdio.h>
#include <conio.h>
#include <bios.h>
#include <dos.h>
#define ESC 27
#define UP 67
#define DOWN 68
#define X1 20
#define X2 60
#define Y1 12
#define Y2 23
char Our_Getch() {
union REGS in, out;
in.h.ah = 0x10;
int86(0x16, &in, &out);
if (out.h.al == 0) {
return out.h.ah + 256;
}
return out.h.al;
}
int Our_Kbhit() {
union REGS in, out;
in.h.ah = 0x01;
int86(0x16, &in, &out);
return !(out.x.flags & 0x40);
}
int Direction(int& direction)
{
int ch;
if (Our_Kbhit()) {
ch = Our_Getch();
switch (ch) {
case DOWN:
direction = 2;
break;
case UP:
direction = 1;
break;
case ESC:
direction = 3;
break;
default:
break;
}
}
}
int main()
{
int x, y;
int direction = 0; // 0 - не движется, 1 - вверх, 2 - вниз
x = 20;
y = 7;
window(X1, Y1, X2, Y2);
textbackground(9);
textcolor(11);
_setcursortype(_NOCURSOR);
clrscr();
do {
Direction(direction);
clrscr();
gotoxy(x, y);
putch('?');
delay(100);
if (direction == 1) {
y--;
if (y <= 1) y = 1;
}
else if (direction == 2) {
y++;
if (y >= (Y2 - Y1 + 1)) y = Y2 - Y1 + 1;
}
} while (direction != 3);
return 0;
}
