|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
26.05.2009, 11:39 | #1 |
Регистрация: 26.05.2009
Сообщений: 5
|
Задача о шарике (в виде нуля) – Работа с клавиатурой и экраном (Прерывания)
Надо написать программу по заданию:
«В правом верхнем углу экрана расположен «шарик». При нажатии на пробел, он начинает двигаться вниз, НЕ оставляя за собой на экране след. При достижении шариком края экрана, он меняет своё направление движения на 90 градусов, описывая при своём движении границы видимой области экрана. При нажатии клавиши «Enter», движение шарика можно приостанавливать и продолжать его движение нажатием пробела.» Выполнить по примеру: В центре экрана расположен "шарик". При нажатии любой из 4 клавиш со стрелками он начинает двигаться, оставляя за со¬бой на экране след. Если нажимается другая стрелка - направ¬ление движения изменяется. Если шарик достигает края, он ос¬танавливается. При нажатии пробела цвет оставляемого следа меняется на противоположный. Прежде всего выберем функции для работы с клавиатурой и экраном. Поскольку требуется, чтобы при отсутствии нажатий программа продолжала перемещать шарик в ранее заданном нап¬равлении, необходимо использовать ввод без ожидания. Это мож¬но выполнить с помощью функции DOS 06h. Что же касается выво¬да на экран, то функций DOS здесь будет недостаточно, так как нужно управлять перемещением курсора. Следует использовать прерывание BIOS 10h. Нам будут нужны следующие функции этого прерывания: 02h - для перемещения курсора, 09h - для выдачи символа и 06h - для очистки экрана. Программа использует те¬кущий видеорежим. Текст программы: stck SEGMENT para stack 'STACK' db 100h DUP (?) stck ENDS data SEGMENT para public 'DATA' coord dw ? ; Текущие координаты шарика vyx label word ; Скорости шарика по Y и X vx db ? ; Скорость шарика по X vy db ? ; Скорость шарика по Y attr db ? ; Текущие атрибуты шарика data ENDS code SEGMENT para public 'CODE' ASSUME cs:code, dsata , ss:stck TIME equ 0ffffh ; Величина задержки времени start: mov ax, data mov ds, ax ; Загрузить сегм. адрес данных call clr_scr ; Очистка экрана mov coord,0c28h ; Строка 12, столбец 40 mov vyx,0 ; Скорость движения - 0 по X, 0 по Y mov attr,07h ; Атрибуты - белым по черному lp: mov dl,0ffh ; Начало цикла mov ah,06h ; Номер ф-ции DOS int 21h ; Ввод без ожидания jz newpos ; Если ничего не нажато or al,al ; al=0? jnz asckey ; Если символьная клавиша mov dl,0ffh ; Иначе - вводим расшир. код mov ah,06h int 21h ; Ввод без ожидания cmp al,48h ; Стрелка вверх? jne mm1 mov vyx,0ff00h ; Скорость по Y = -1, по X = 0 jmp newpos mm1: cmp al,50h ; Стрелка вниз? jne mm2 mov vyx,0100h ; Скорость по Y = 1, по X = 0 jmp newpos mm2: cmp al,4bh ; Стрелка влево? jne mm3 mov vyx,00ffh ; Скорость по X = -1, по Y = 0 jmp newpos mm3: cmp al,4dh ; Стрелка вправо? jne newpos mov vyx,0001h ; Скорость по X = 1, по Y = 0 jmp newpos asckey: cmp al,1bh ; Это Esc? je quit ; Выход из программы cmp al," " ; Пробел? jne newpos xor attr,01110111b ; Атрибуты инвертировать newpos: mov bh,0 ; Вычисление позиции курсора. mov dx,coord ; К старым координатам add dh,vy ; прибавляются скорости по Y и X, jge mv1 ; затем проверки, чтобы курсор inc dh ; не вышел за край экрана mv1: cmp dh,25 jl mv2 dec dh mv2: add dl,vx jge mv3 inc dl mv3: cmp dl,80 jl mv4 dec dl mv4: mov coord,dx ; Запомнить новые координаты mov ah,02h int 10h ; Переместить курсор ; Рисование шарика drball: mov ah,09h mov al,"O" ; Шарик mov bh,0 mov bl,attr ; Атрибуты mov cx,1 ; Количество int 10h ; Выдача на экран шарика call delay ; Задержка времени jmp lp ; На повторение цикла ; Конец работы quit: call clr_scr ; Очистка экрана xor al, al ; Код завершения 0 mov ah, 4ch ; int 21h ; Выход в DOS ; Процедура очистки экрана clr_scr PROC near mov cx,0 ; Со строки 0, позиции 0 mov dx,184fh ; По строку 24, позицию 79 mov ax,0619h ; Функция 06h, сдвиг на 25 строк mov bh,07h ; Черный фон для очистки int 10h ; Очистка ret clr_scr ENDP |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с синим экраном | кобрин | Операционные системы общие вопросы | 14 | 07.05.2009 22:20 |
Алгоритм : удалённая работа с клавиатурой | Lime | Общие вопросы Delphi | 2 | 04.04.2009 16:36 |