Assembler: Задача о шарике (в виде нуля)

Тема в разделе "Другие", создана пользователем JoeQueer, 26 май 2009.

Статус темы:
Закрыта.
  1. JoeQueer

    JoeQueer Гость

    Надо написать программу по заданию:
    «В правом верхнем углу экрана расположен «шарик». При нажатии на пробел, он начинает двигаться вниз, НЕ оставляя за собой на экране след. При достижении шариком края экрана, он меняет своё направление движения на 90 градусов, описывая при своём движении границы видимой области экрана. При нажатии клавиши «Enter», движение шарика можно приостанавливать и продолжать его движение нажатием пробела.»

    Выполнить по примеру:
    В центре экрана расположен "шарик". При нажатии любой из 4 клавиш со стрелками он начинает двигаться, оставляя за со¬бой на экране след. Если нажимается другая стрелка - направ¬ление движения изменяется. Если шарик достигает края, он ос¬танавливается. При нажатии пробела цвет оставляемого следа меняется на противоположный.
    Прежде всего выберем функции для работы с клавиатурой и экраном. Поскольку требуется, чтобы при отсутствии нажатий программа продолжала перемещать шарик в ранее заданном нап¬равлении, необходимо использовать ввод без ожидания. Это мож¬но выполнить с помощью функции DOS 06h. Что же касается выво¬да на экран, то функций DOS здесь будет недостаточно, так как нужно управлять перемещением курсора. Следует использовать прерывание BIOS 10h. Нам будут нужны следующие функции этого прерывания: 02h - для перемещения курсора, 09h - для выдачи символа и 06h - для очистки экрана. Программа использует те¬кущий видеорежим.
    Текст программы:
    [codebox]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, ds:data , 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
    [/codebox]
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей