%include "rw32-2015.inc" %include "termkeys.inc" section .data ; bludiste width db 17 height db 17 start_x db 1 start_y db 1 goal_x db 16 goal_y db 15 maze_map db "+---+--------+--+" db "|@ | | |" db "| --+-+ --- -++ |" db "| | | |" db "+-- +-+ ----+ |" db "| | | | --+" db "| | +---+ | |" db "+-+ --+ | +-+ |" db "| | +-+ | | |" db "+---- | | | |" db "| | | -++ | |" db "| ----+ | | |" db "| +-+- | +- |" db "| | | | | | |" db "| | | | +- | +--+" db "| | | | " db "+---+---+--+-----" section .text main: call TermInit mov bl,[start_x] ; bl = pozice x mov cl,[start_y] ; cl = pozice y mov dl,[width] ; dl = sirka pro vypocet indexu .game_loop: ; vynulujeme registry posuvu xor bh,bh xor ch,ch ; vykreslime aktualni stav call TermClear call TermRefresh call DrawMaze ; ziskame stisk klavesy call TermGetKey ; ukol 3: doplnte logiku stisku klavesy ; sipky = posun, escape = konec ; ; switch(eax) { ; case KEY_UP: ; ch = -1; ; break; ; case KEY_DOWN: ; ch = 1; ; break; ; case KEY_LEFT: ; bh = -1; ; break; ; case KEY_RIGHT: ; bh = 1; ; break; ; case KEY_ESC: ; goto .game_over; ; default: ; goto .game_loop; ; } ; ; zde doplnte vas kod .move: ; zjistime, ci je dany tah mozny - nove policko je mezera mov al,cl ; al = pozice y add al,ch ; al = nova pozice y mul dl ; ax = offset radku movzx di,bl ; di = pozice x add ax,di ; ax = offset radek + aktualni sloupec movsx di,bh ; di = posun v x add ax,di ; ax = offset nove pozice movzx eax,ax ; eax = offset nove pozice lea esi,[maze_map + eax] ; esi = adresa znaku mov al,[esi] cmp al,' ' jne .game_loop ; neni mezera - tah neni mozny ; zaktualizujeme pozici - 1. na novou pozici zapiseme "panacka" mov al,'@' mov [esi],al ; na aktualni pozici zapiseme mezeru mov al,cl ; al = pozice y mul dl ; ax = offset radku movzx di,bl ; di = pozice x add ax,di ; ax = offset pozice movzx eax,ax ; eax = offset pozice lea esi,[maze_map + eax] ; esi = adresa znaku mov al,' ' mov [esi],al ; vykoname upravu pozice add bl,bh add cl,ch ; ukol 2: zjistete, zda jste nedorazili do cile ; (ukoncovaci podminka .game_loop) ; ; if (bl != *goal_x || cl != *goal_y) ; goto .game_loop; ; ; zde doplnte vas kod .game_over: call TermDeinit xor eax,eax ret ; funkce ktera vykresli bludiste z pole maze_map o velikosti width x height ; neprijima a nevraci zadne parametry DrawMaze: pushad ; ukol 1: doplnte telo funkce vykreslujici bludiste ; ; for (dl = *height, esi = maze_map; dl > 0; dl--) { ; for (cl = *width; cl > 0; cl--) { ; al = *esi; ; WriteChar(); ; esi++; ; } ; al = 13 ; WriteChar() ; al = 10 ; WriteChar() ; } ; ; zde doplnte vas kod popad ret