匯編語(yǔ)言動(dòng)畫(huà)程序的設(shè)計(jì)報(bào)告_第1頁(yè)
匯編語(yǔ)言動(dòng)畫(huà)程序的設(shè)計(jì)報(bào)告_第2頁(yè)
匯編語(yǔ)言動(dòng)畫(huà)程序的設(shè)計(jì)報(bào)告_第3頁(yè)
匯編語(yǔ)言動(dòng)畫(huà)程序的設(shè)計(jì)報(bào)告_第4頁(yè)
匯編語(yǔ)言動(dòng)畫(huà)程序的設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上一、游戲背景介紹隨著信息時(shí)代的發(fā)展,計(jì)算機(jī)已經(jīng)變?yōu)槲覀兩钪胁豢扇鄙俚囊徊糠?,它作為我們了解世界的一個(gè)窗口的同時(shí)還可以讓我們從中以最快的速度查找學(xué)習(xí)資源,休閑之余,更多的人選擇玩小型的益智游戲來(lái)放松,因?yàn)樗粌H達(dá)到了娛樂(lè)的目的,而且對(duì)自己的思維有一定的幫助作用,根據(jù)大多數(shù)人的娛樂(lè)放松需求,我做出了一款動(dòng)畫(huà)游戲可控的汽車與機(jī)器 人。上了一學(xué)期的匯編語(yǔ)言課,讓我對(duì)匯編語(yǔ)言有了一定的認(rèn)識(shí)。這次課程作業(yè)我決定親自動(dòng)手用匯編語(yǔ)言編寫(xiě)一個(gè)型小程序,熟悉計(jì)算機(jī)體系結(jié)構(gòu),加深對(duì)匯編語(yǔ)言的了解。DOS操作系統(tǒng)的功能調(diào)用及BIOS的功能調(diào)用。進(jìn)一步了解匯編語(yǔ)言控制計(jì)算機(jī)硬件的方法,以及如

2、何用匯編語(yǔ)言來(lái)實(shí)現(xiàn)算法, 提高應(yīng)用匯編語(yǔ)言編程的能力,也加深了自己對(duì)一些算法的理解,提高了自己的編程能力。利用匯編語(yǔ)言編寫(xiě)程序,在屏幕上顯示動(dòng)畫(huà),還可以通過(guò)鍵盤(pán)上的輸入來(lái)改變圖片的位置,實(shí)現(xiàn)動(dòng)畫(huà)的運(yùn)動(dòng)。動(dòng)畫(huà)游戲程序設(shè)計(jì)的開(kāi)始屏幕上會(huì)出現(xiàn)一輛小車和一個(gè)機(jī)器人,操作者可自由選擇至少兩個(gè)運(yùn)動(dòng)物體(機(jī)器人和汽車)在屏幕上運(yùn)動(dòng),一開(kāi)始汽車與人分別從左向右、從右向左運(yùn)動(dòng),操作者可以通過(guò)屏幕上方現(xiàn)實(shí)的提示對(duì)機(jī)器人和小車進(jìn)行控制??梢酝ㄟ^(guò)鍵盤(pán)上的W、A、S、D和上下左右的方向鍵來(lái)分別控制運(yùn)動(dòng)機(jī)器人和小車通過(guò)W,A,S,D控制方向,同時(shí)整個(gè)程序包括人機(jī)界面控制臺(tái)和運(yùn)動(dòng)中動(dòng)畫(huà)的暫停(空格鍵控制),開(kāi)始(ENTER

3、鍵控制),退出鍵則由ESC鍵控制,運(yùn)動(dòng)加減速動(dòng)作(“+”控制逐級(jí)加速、“”控制逐級(jí)減速)。程序插圖如圖1:圖1動(dòng)畫(huà)界面示意圖屏幕上方是操作提示,用戶可與根據(jù)提示對(duì)汽車和小人進(jìn)行操控,來(lái)改變他倆的運(yùn)動(dòng)軌跡。起先車和小人都是各自運(yùn)動(dòng)的一個(gè)向左另一個(gè)向右,操作者可以通過(guò)鍵盤(pán)來(lái)改變這兩物體的運(yùn)動(dòng)軌跡,同時(shí)在按鍵盤(pán)上的加號(hào)會(huì)看見(jiàn)物體的運(yùn)動(dòng)速率明顯加快,減號(hào)則反之。二、核心算法思想本程序定義了兩個(gè)圖分別表示(汽車和機(jī)器人),八個(gè)坐標(biāo)變量(汽車清圖坐標(biāo)car_row0 car_col0 汽車畫(huà)圖坐標(biāo)car_row1 car_col1機(jī)器人清圖坐標(biāo)man_row0 man_col0機(jī)器人畫(huà)圖坐標(biāo)man_row

4、1 man_col1),用于控制汽車和機(jī)器人清圖和畫(huà)圖的坐標(biāo)。首先在屏幕上顯示兩個(gè)物體,讓他們按照從左到右和從右到左方式分別運(yùn)動(dòng)。他們的運(yùn)動(dòng)是通過(guò)不斷的修改圖片的坐標(biāo),并清屏,然后根據(jù)新的坐標(biāo)重新繪制畫(huà)面來(lái)實(shí)現(xiàn)的。通過(guò)一大個(gè)循環(huán)對(duì)上面?zhèn)€兩個(gè)坐標(biāo)進(jìn)行改變,每次橫坐標(biāo)加上一個(gè)固定的值,或減去一個(gè)固定的值。再通過(guò)清圖然后重繪實(shí)現(xiàn)物體的移動(dòng)。為人實(shí)現(xiàn)物體能根據(jù)操作者的要求上下左右運(yùn)動(dòng),程序?qū)崿F(xiàn)設(shè)定好了幾個(gè)可以上下左右操控圖片位置的鍵。每當(dāng)操作者按下這幾個(gè)鍵,系統(tǒng)自動(dòng)的,將圖片位置的橫縱坐標(biāo)進(jìn)行加上或減去某個(gè)固定的值,加的多少還取決于操作者按鍵次數(shù)得多少。確定圖片的位置是通過(guò)檢測(cè)用戶的輸入和外層大循環(huán)不

5、斷自加某個(gè)數(shù),綜合來(lái)改變下次重繪的坐標(biāo)來(lái)實(shí)現(xiàn)的??傊胛矬w動(dòng)起來(lái)就是通過(guò)不斷地清屏來(lái)清除上次圖片的位置,然后獲取圖片坐標(biāo),這個(gè)坐標(biāo)是不斷地被用戶和系統(tǒng)修改的,并重回新的圖片畫(huà)面,于是用戶可以看見(jiàn)物體在屏幕上不斷的移動(dòng)。以下是讓運(yùn)動(dòng)起來(lái)運(yùn)動(dòng)的邏輯圖:畫(huà)圖(row1,col1)開(kāi)始row1加1col1 加1 清圖(row0,col0)判斷是否有按鍵輸入row1賦給row0col1賦給col0修改row1、col1否是圖2動(dòng)畫(huà)運(yùn)動(dòng)算法示意圖 首先是清理屏幕上的物體將屏幕刷成黑色,然后獲得機(jī)器人和小車新的位置坐標(biāo),根據(jù)這根位置坐標(biāo)繪制出小車的位置。從而實(shí)現(xiàn)小車的運(yùn)動(dòng)。同時(shí)通過(guò)操控設(shè)定好的上下左右鍵可

6、以修改坐標(biāo),形同會(huì)自動(dòng)根據(jù)你按鍵的次數(shù)以及方向鍵物體的橫縱坐標(biāo)加上或減去一個(gè)先前設(shè)定好的固定值。從而實(shí)現(xiàn)了,操作者對(duì)物體運(yùn)動(dòng)?xùn)|方向的控制。三、核心算法流程圖主程序:程序開(kāi)始,設(shè)置顯示方式為80X25 16色圖形方式和提示信息如下:(SPACE-PAUSE,ENTER-BEGAIN,ESC-EXIT,SPEEDUP-+,SLOWDOWN- -) (CAR:UP-W,DOWN-S,LEFT-A,RIGHT-D MAN:UP-8,DOWN-2,LEFT-4,RIGHT-6) 調(diào)用car_disp和man_disp子程序設(shè)置開(kāi)始圖形,起始坐標(biāo)在數(shù)據(jù)定義時(shí)已給出,然后調(diào)用繪圖子程序控制汽車和機(jī)器人的運(yùn)動(dòng)

7、,空格暫停,回車開(kāi)始,ESC退出,實(shí)現(xiàn)動(dòng)畫(huà)的主程序算法圖如圖3。否是是否否判斷是否是ENTER判斷是否是空格判斷輸入是否為ESC開(kāi)始啟用繪圖程序圖片初始化屏幕上顯示提示信息結(jié)束是暫停圖3主程序算法示意圖程序運(yùn)行后除了繪制移動(dòng)的人和車外,還要看是否有暫停,開(kāi)始,和退出的操作。根據(jù)輸入對(duì)程序運(yùn)行進(jìn)行調(diào)整。MOVE子程序:MOVE子程序是整個(gè)程序的核心,通過(guò)鍵盤(pán)操作控制汽車和機(jī)器人的運(yùn)動(dòng),首先檢測(cè)鍵盤(pán),若無(wú)鍵盤(pán)操作,運(yùn)行主程序??刂莆矬w移動(dòng)算法圖如圖4:NYYYNNYYYNNYYYNNYYNNN6?-?+?4?2?8?D?S?開(kāi)始W?鍵盤(pán)檢測(cè)合法字符?A?結(jié)束主程序機(jī)器人下移動(dòng)一個(gè)單位機(jī)器人左移動(dòng)一

8、個(gè)單位機(jī)器人上移動(dòng)一個(gè)單位汽車向右移動(dòng)一個(gè)單位汽車向下移動(dòng)一個(gè)單位汽車向左移動(dòng)一個(gè)單位加速機(jī)器人右移動(dòng)一個(gè)單位減速汽車向上移動(dòng)一個(gè)單位物體移動(dòng)圖4操控物體算法示意圖加號(hào)和減號(hào)分別控制加速和減速,原本主程序會(huì)每隔一段時(shí)間自動(dòng)把汽車橫坐標(biāo)加一,人的橫坐標(biāo)減一重復(fù)操作,若有鍵盤(pán)響應(yīng),則實(shí)現(xiàn)自動(dòng)運(yùn)動(dòng),則通過(guò)比較鍵盤(pán)掃描碼來(lái)確定執(zhí)行何種操作, “+”按一次速度加快一級(jí),“”按一次速度減慢一級(jí),WASD控制汽車的上左下右移動(dòng),方向鍵和8、6、2、4都能控制機(jī)器人的運(yùn)動(dòng)方向,DISP繪圖程序:DISP輸出圖形子程序該程序的主要功能是根據(jù)定義的圖形表畫(huà)出圖形,過(guò)程如下:N結(jié)束主程序cx=0?si+4 cx-1

9、字符行列坐標(biāo)存入dh,dl初始化cx開(kāi)始si指向圖形表的第一個(gè)字符顯示當(dāng)前si指向的字符Y圖5根據(jù)自定義圖形繪圖算法示意圖首先獲得存放自定義圖形字符串?dāng)?shù)組,進(jìn)行初始化,再根據(jù)坐標(biāo)獲得物體的酒氣體坐標(biāo)然后繪制物體。汽車和機(jī)器人畫(huà)圖子程序:當(dāng)汽車和小人運(yùn)動(dòng)到邊界時(shí)就會(huì)消失,于是我另外寫(xiě)了兩個(gè)子程序讓運(yùn)動(dòng)到邊界的物體自此回到界面,這里我讓從左邊出去的物體從右邊出現(xiàn),從右邊出去的的物體從左邊出現(xiàn),這樣就像地球是圓的一樣,當(dāng)讓當(dāng)你控制物體從上方或者下方出去時(shí),也會(huì)出現(xiàn)在相反反向。car_disp,man_disp子程序分別用于用于處理汽車和小人運(yùn)動(dòng)到屏幕邊界的情況,顯示圖形以及設(shè)置坐標(biāo)。以汽車為例:si

10、指向汽車圖形表的第一個(gè)字符,當(dāng)行數(shù)(car_row1)大于20,跳到第4行,行數(shù)(car_row1)小于4,跳到第20行列數(shù)(car_col1)小于3,跳到第70列,列數(shù)car_col1)大于70,跳到第3列,實(shí)現(xiàn)邊界設(shè)置,再將row1賦給row0,col1賦給col0,即把現(xiàn)在的坐標(biāo)保留,作為下次清屏的坐標(biāo),然后把car_row1賦給dh,car_col1賦給dl,然后在調(diào)用DISP畫(huà)出汽車圖形,這樣汽車就會(huì)從另一個(gè)方向冒出來(lái)??傊?,這里也是通過(guò)修改物體的左邊來(lái)實(shí)現(xiàn)這樣的效果的。清圖子程序: 這部分程序主要負(fù)責(zé)清理上一次繪圖留下來(lái)的畫(huà)面為下一步的重繪做準(zhǔn)備,實(shí)現(xiàn)物體的移動(dòng)效果,否則會(huì)出現(xiàn)物體

11、在上次基礎(chǔ)上重繪,變成物體推著尾巴。影響動(dòng)畫(huà)效果。這部分的代碼樣式為:car_clearproc near ;汽車清圖子程序 clear_car car_row0,car_col0 ;調(diào)用汽車清圖宏ret ;返回car_clearendp該程序的主要功能就是調(diào)用宏來(lái)清圖。因?yàn)樽映绦虿荒軅鬟f參數(shù),所以選擇用宏定義來(lái)實(shí)現(xiàn)參數(shù)(坐標(biāo))的傳遞,但是宏展開(kāi)使得代碼很長(zhǎng),而且該子程序調(diào)用頻繁,以致超過(guò)條件轉(zhuǎn)移的范圍,系統(tǒng)報(bào)錯(cuò),用子程序就可以解決。延時(shí)子程序DLY: 主要功能使控制延時(shí),通過(guò)這個(gè)子程序就那個(gè)能夠控制物體運(yùn)動(dòng)的速度。延時(shí)的時(shí)間越長(zhǎng),物體運(yùn)動(dòng)的速度就越慢,相反延時(shí)時(shí)間越短,就相當(dāng)于物體運(yùn)動(dòng)的頻率

12、加快這樣物體運(yùn)動(dòng)就加快了。我采用的是控制延時(shí)時(shí)間的的長(zhǎng)短,從而實(shí)現(xiàn)加速和減速。通過(guò)宏定義來(lái)實(shí)現(xiàn)參數(shù)(dlay1)的傳遞,用“+”“”來(lái)改變dlay1的值,控制延時(shí),因?yàn)槲医o時(shí)間設(shè)定了幾個(gè)值于是當(dāng)用戶按加號(hào)是就不斷自加加到最大之時(shí)再自加就變成最小值,減號(hào)則反之,所以會(huì)看到很快的物體瞬間變慢。四、源代碼整個(gè)程序?qū)崿F(xiàn)的源代碼如下:datasegment ;定義數(shù)據(jù)段CAR0 DB 7 ;汽車的字符圖形表DB 0DBH,1,0,0DB 0DBH,1,0,1DB 0DBH,7,0,1DB 0DBH,7,0,1DB 4FH,6,1,0DB 4FH,6,0,-3DB 2,6,-2,1;-MANU DB 11

13、 ;機(jī)器人的圖形表 DB 0DBH,09H,0,0 DB 0DBH,09H,0,1 DB 0DBH,09H,0,1 DB 0DBH,09H,0,1 DB 0DBH,09H,0,1 DB 02H,09H,-1,-2 DB 03H,0CH,2,0 DB 0DBH,09H,1,-1 DB 0DBH,09H,0,2 DB 0DBH,09H,1,-3DB 0DBH,09H,0,4;-畫(huà)圖與清圖坐標(biāo)-car_row0 db 10 ;汽車清圖坐標(biāo)car_col0 db 10car_row1 db 10 ;汽車畫(huà)圖坐標(biāo)car_col1 db 10man_row0 db 15 ;機(jī)器人清圖坐標(biāo)man_col0

14、db 60man_row1 db 15 ;機(jī)器人畫(huà)圖坐標(biāo)man_col1 db 60;延時(shí)時(shí)間間隔dlay1 dw 10000 ;控制延時(shí)變量,即控制速度的變量;-輸出提示-INFO1 DB 0DH,0AH,' (SPACE-PAUSE,ENTER-BEGAIN,ESC-EXIT,SPEEDUP- +,SLOWDOWN- - )$' ;動(dòng)畫(huà)控制提示信息,空格暫停,回車開(kāi)始,ESC退出,; “+”按一次速度加快一級(jí),“”按一次速度減慢一級(jí)INFO2 DB 0DH,0AH,' (CAR:UP-W,DOWN-S,LEFT-A,RIGHT-D MAN:UP-8,DOWN-2,L

15、EFT-4,RIGHT-6)$' ;動(dòng)畫(huà)控制提示信息,WASD控制汽車的上左下右移動(dòng),方向鍵控制機(jī)器人的運(yùn)動(dòng)方向;-汽車宏定義-clear_car macro row,col ;宏定義汽車清圖push bxmov ax,0600Hmov ch,rowdec ch,1mov cl,colmov dh,chmov dl,cladd dh,3;坐標(biāo)加3add dl,4;坐標(biāo)加4mov bh,7int 10hpop bxendm;- 宏定義機(jī)器人-clear_man macro row,col ;宏定義機(jī)器人清圖push bxmov ax,0600H mov ch,row dec ch,1mo

16、v cl,coldec cl,0mov dh,chmov dl,cladd dh,5;坐標(biāo)加5add dl,5;坐標(biāo)加5 mov bh,7 int 10Hpop bx endm;-;主要功能使控制延時(shí),我采用的是控制空制令執(zhí)行的條數(shù)來(lái);控制延時(shí)的長(zhǎng)短,從而實(shí)現(xiàn)加速和減速。通過(guò)宏定義來(lái)實(shí)現(xiàn);參數(shù)(dlay1)的傳遞,用“+”“”來(lái)改變dlay1的值,控制延時(shí)。;- 延時(shí)程序-d macrodlay1 ;宏定義延時(shí)程序 push cx push dx mov dx,dlay1dl1: mov cx,6801dl2: loop dl2 dec dx jnz dl1 pop dx pop cx end

17、m;-codesegment ;定義代碼段mainproc far ;主函數(shù) assume cs:code,ds:datastart: push dsmov ax,0push axmov ax,datamov ds,ax mov al,3 ;設(shè)置顯示方式為80*25 16色圖形方式 mov ah,0 int 10H lea dx,info1 ;在顯示器上顯示字符串提示信息 mov ah,9 int 21h lea dx,info2 ;在顯示器上顯示字符串提示信息 mov ah,9 int 21hcall car_disp ;初始汽車的位置call man_disp ;初始機(jī)器人的位置call

18、MOVEretmain endp;-disp proc near ;輸出圖形子程序 push ax push bx push cx push dx push si sub ch,ch mov cl,si inc si next: add dh,si+2 ;改變行列坐標(biāo) add dl,si+3mov ah,2 ;置光標(biāo)位置DH為行、DL為列 int 10hmov al,si ;取字符值mov bl,si+1 ;取字符屬性 push cxmov cx,1 mov AH,9 ;顯示字符int 10Hpop cxadd si,4 ;SI指向下一個(gè)字符loop nextpop sipop dxpop c

19、xpop bxpop axretdisp endp;-car_dispproc near ;汽車畫(huà)圖子程序push silea si,CAR0 ;取汽車的圖cmp car_row1,20 ;設(shè)置汽車運(yùn)動(dòng)的邊界ja c0 ;行數(shù)大于20,跳到第4行cmp car_row1,4 ;行數(shù)小于4,跳到第20行jb c1cmp car_col1,3 ;列數(shù)小于3,跳到第70列jb c2cmp car_col1,70 ;列數(shù)大于70,跳到第3列ja c3jmp cnc0:mov car_row1,4jmp cnc1:mov car_row1,20jmp cnc2:mov car_col1,70jmp cn

20、c3:mov car_col0,3mov car_col1,3jmp cncn: mov bh,0 ;row1賦給row0,col1賦給col0,即把現(xiàn)在的坐標(biāo)保留,作為下次清屏的坐標(biāo) mov bl,car_row1 mov car_row0,bl mov bl,car_col1 mov car_col0,bl mov dh,car_row1 mov dl,car_col1 call disp ;調(diào)用DISP畫(huà)出汽車圖形 pop siretcar_dispendp;-car_clearproc near ;汽車清圖子程序clear_car car_row0,car_col0 ;調(diào)用汽車清圖宏r

21、et ;返回car_clearendp;-man_dispproc near ;機(jī)器人畫(huà)圖子程序push silea si,MANU ;取機(jī)器人的圖 cmp man_row1,20 ;設(shè)置機(jī)器人運(yùn)動(dòng)的邊界 ja n0 ;行數(shù)大于20,跳到第4行 cmp man_row1,4 ;行數(shù)小于4,跳到第20行 jb n1 cmp man_col1,3 ;列數(shù)小于3,跳到第70列 jb n2 cmp man_col1,70 ;列數(shù)大于70,跳到第3列 ja n3 jmp nnn0:mov man_row1,4jmp nnn1:mov man_row1,20jmp nnn2:mov man_col1,70

22、jmp nnn3:mov man_col0,3mov man_col1,3jmp nnnn:push bx ;row1賦給row0,col1賦給col0,即把現(xiàn)在的坐標(biāo)保留,作為下次清屏的坐標(biāo)mov bh,0mov bl,man_row1mov man_row0,blmov bl,man_col1mov man_col0,blpop bxmov dh,man_row1mov dl,man_col1call disp ;調(diào)用DISP畫(huà)出機(jī)器人圖形pop siretman_dispendp;-man_clearproc near ;機(jī)器人清圖子程序clear_man man_row0,man_co

23、l0 ;調(diào)用機(jī)器人清圖宏ret ;返回man_clearendp;-moveprocnear ;控制汽車和機(jī)器人的運(yùn)動(dòng)push axpush bx;- 取鍵盤(pán)操作-next1:mov ah,01H ;取鍵盤(pán)緩沖區(qū)狀態(tài)int 16hjnz next2 ;緩沖區(qū)無(wú)按鍵,等待DLY dlay1 call car_clear ;汽車一直向右運(yùn)動(dòng)inc car_col1 call car_dispcall man_clear ;機(jī)器人一直向左運(yùn)動(dòng)dec man_col1call man_dispjmp next1next2:mov ah,0 ;從鍵盤(pán)讀字符int 16h;-DISP proc near

24、;輸出圖形子程序 push ax push bx push cx push dx push si sub ch,ch mov cl,si inc si next: add dh,si+2 ;改變行列坐標(biāo) add dl,si+3mov ah,2 ;置光標(biāo)位置DH為行、DL為列 int 10hmov al,si ;取字符值mov bl,si+1 ;取字符屬性 push cxmov cx,1 mov AH,9 ;顯示字符int 10Hpop cxadd si,4 ;SI指向下一個(gè)字符loop nextpop sipop dxpop cxpop bxpop axretdisp endp;-根據(jù)鍵盤(pán)輸入

25、判斷選擇-up: ;W 汽車向上運(yùn)動(dòng)cmp ah,11hjnz downcall car_cleardec car_row1call car_dispjmp next1down: ;S 汽車向下運(yùn)動(dòng)cmp ah,1Fhjnz leftcall car_clearinc car_row1call car_dispjmp next1left: ;A 汽車向左運(yùn)動(dòng)cmp ah,1Ehjnz rightcall car_cleardec car_col1call car_dispjmp next1right: ;D 汽車向右運(yùn)動(dòng)cmp ah,20hjnz up1call car_clearinc ca

26、r_col1call car_dispjmp next1up1: ;機(jī)器人向上運(yùn)動(dòng)cmp ah,48hjnz down1call man_cleardec man_row1call man_dispjmp next1down1: ;機(jī)器人向下運(yùn)動(dòng)cmp ah,50hjnz left1call man_clearinc man_row1call man_dispjmp next1left1: ;機(jī)器人向左運(yùn)動(dòng)cmp ah,4bhjnz right1call man_cleardec man_col1call man_dispjmp next1right1: ;機(jī)器人向右運(yùn)動(dòng)cmp ah,4dhj

27、nz speedup1call man_clearinc man_col1call man_dispjmp next1speedup1:;主鍵盤(pán)加號(hào)cmp ah,0dh ;"+"加速運(yùn)動(dòng)jnz speedup2sub dlay1,1000jmp next1speedup2:; ;小鍵盤(pán)加號(hào)cmp ah,4Eh ;"+"(小鍵盤(pán))加速運(yùn)動(dòng)jnz speeddown1sub dlay1,1000jmp next1speeddown1:;主鍵盤(pán)減號(hào)cmp ah,0ch ;"-"減速運(yùn)動(dòng)jnz speeddown2add dlay1,1000

28、jmp next1speeddown2:;小鍵盤(pán)減號(hào)cmp ah,4Ah ;"-"減速運(yùn)動(dòng)jnz space1add dlay1,1000jmp next1space1:cmp ah,39h ;SPACE暫停運(yùn)動(dòng)jnz exit1space:mov ah,0 ;從鍵盤(pán)讀字符,AL=字符碼,AH=掃描碼int 16hcmp ah,1ch ;回車返回next1,否則繼續(xù)等待從鍵盤(pán)讀字符,實(shí)現(xiàn)暫停jnz spacejmp next1exit1:cmp ah,01h ;ESC退出jnz otherspop bxpop ax ret ;返回主程序others: ;按其他鍵,無(wú)效,繼續(xù)

29、運(yùn)行jmp next1MOVE ENDP;-code ends end start 五、心得體會(huì) 選題的時(shí)候我以為動(dòng)畫(huà)程序的實(shí)現(xiàn)應(yīng)該使非常容易實(shí)現(xiàn)的,就是不停的清屏,重新在下一個(gè)位置畫(huà)圖,從而實(shí)現(xiàn)動(dòng)畫(huà)。但通過(guò)本次匯編作業(yè),我才真正懂得了動(dòng)畫(huà)的實(shí)現(xiàn)其實(shí)沒(méi)有我想象的那么簡(jiǎn)單。剛開(kāi)始我做了一個(gè)圖形,繼而由一個(gè)圖形做成兩個(gè),在這個(gè)過(guò)程中我碰到了很多難題,比如如何畫(huà)圖,如何實(shí)現(xiàn)圖形的運(yùn)動(dòng),如何在一個(gè)屏幕上顯示兩個(gè)圖形,如何分別控制兩個(gè)圖形的運(yùn)動(dòng),為了解決這些問(wèn)題我試了很多方法,最后我選擇了坐標(biāo)控制運(yùn)動(dòng),局部清屏,我覺(jué)得這是我能想到的最好的方法了,雖然做的過(guò)程很累,整天都在想問(wèn)題的解決方法,但當(dāng)你解決一個(gè)

30、問(wèn)題之后,那種感覺(jué)真的很享受,當(dāng)整個(gè)程序完成的時(shí)候我很興奮。當(dāng)然這個(gè)程序還有一些不足的地方,比如說(shuō)當(dāng)倆物體運(yùn)動(dòng)到一起時(shí)沒(méi)有碰撞效果,還有就是程序的界面不夠友好。通過(guò)這次作業(yè),也讓我熟悉了很多以前都不熟悉的一些指令,并利用這些指令去實(shí)現(xiàn)一些操作。同時(shí)也讓我更加了解了匯編程序的結(jié)構(gòu)和流程,對(duì)編程也有了更深的體會(huì)。過(guò)程中我還學(xué)會(huì)了一些處理問(wèn)題的方法:理論與實(shí)踐相結(jié)合,不懂的地方應(yīng)勤問(wèn)老師勤問(wèn)同學(xué),直到把它搞懂為止。源代碼:(修正后)datasegment ;定義數(shù)據(jù)段CAR0 DB 7 ;汽車的字符圖形表 DB 0DBH,1,0,0 DB 0DBH,1,0,1 DB 0DBH,7,0,1 DB 0D

31、BH,7,0,1 DB 4FH,6,1,0 DB 4FH,6,0,-3DB 2,6,-2,1MANU DB 11 ;機(jī)器人的圖形表 DB 0DBH,09H,0,0 DB 0DBH,09H,0,1 DB 0DBH,09H,0,1 DB 0DBH,09H,0,1 DB 0DBH,09H,0,1 DB 02H,09H,-1,-2 DB 03H,0CH,2,0 DB 0DBH,09H,1,-1 DB 0DBH,09H,0,2 DB 0DBH,09H,1,-3 DB 0DBH,09H,0,4car_row0 db 10 ;汽車清圖坐標(biāo)car_col0 db 10car_row1 db 10 ;汽車畫(huà)圖坐

32、標(biāo)car_col1 db 10man_row0 db 15 ;機(jī)器人清圖坐標(biāo)man_col0 db 60man_row1 db 15 ;機(jī)器人畫(huà)圖坐標(biāo)man_col1 db 60dlay1 dw 10000 ;控制延時(shí)變量,即控制速度的變量INFO1 DB 0DH,0AH,' (SPACE-PAUSE,ENTER-BEGAIN,ESC-EXIT,SPEEDUP- +,SLOWDOWN- - )$' ;動(dòng)畫(huà)控制提示信息,空格暫停,回車開(kāi)始,ESC退出,“+”按一次速度加快一級(jí),“”按一次速度減慢一級(jí)INFO2 DB 0DH,0AH,' (CAR:UP-W,DOWN-S,L

33、EFT-A,RIGHT-D MAN:UP-8,DOWN-2,LEFT-4,RIGHT-6)$' ;動(dòng)畫(huà)控制提示信息,WASD控制汽車的上左下右移動(dòng),方向鍵控制機(jī)器人的運(yùn)動(dòng)方向;-clear_car macro row,col ;宏定義汽車清圖push bxMOV AX,0600H MOV Ch,rowdec ch,1mov cl,colmov dh,chmov dl,cladd dh,3add dl,4 MOV BH,7 INT 10Hpop bxendm;-clear_man macro row,col ;宏定義機(jī)器人清圖push bxMOV AX,0600H MOV Ch,row

34、dec ch,1mov cl,coldec cl,0mov dh,chmov dl,cladd dh,5add dl,5 MOV BH,7 INT 10Hpop bx endm;-DLY macrodlay1 ;宏定義延時(shí)程序 PUSH CX PUSH DX MOV DX,dlay1DL1: MOV CX,6801DL2: LOOP DL2 DEC DX JNZ DL1 POP DX POP CX endm;-codesegment ;定義代碼段mainproc far ;主函數(shù) assume cs:code,ds:datastart: push dsmov ax,0push axmov ax

35、,datamov ds,ax mov al,3 ;設(shè)置顯示方式為80*25 16色圖形方式 mov ah,0 int 10H lea dx,info1 ;在顯示器上顯示字符串提示信息 mov ah,9 int 21h lea dx,info2 ;在顯示器上顯示字符串提示信息 mov ah,9 int 21hcall car_disp ;初始汽車的位置call man_disp ;初始機(jī)器人的位置call MOVEretmain endp;-DISP PROC NEAR ;輸出圖形子程序 PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI SUB CH,CH MOV

36、CL,SI INC SI NEXT: ADD DH,SI+2 ;改變行列坐標(biāo) ADD DL,SI+3 MOV AH,2 ;置光標(biāo)位置DH為行、DL為列 INT 10H MOV AL,SI ;取字符值 MOV BL,SI+1 ;取字符屬性 PUSH CX MOV CX,1 MOV AH,9 ;顯示字符 INT 10H POP CX ADD SI,4 ;SI指向下一個(gè)字符 LOOP NEXT POP SI POP DX POP CX POP BX POP AX RETDISP ENDP;-car_dispproc near ;汽車畫(huà)圖子程序push si lea si,CAR0 ;取汽車的圖cmp

37、 car_row1,20 ;設(shè)置汽車運(yùn)動(dòng)的邊界ja c0 ;行數(shù)大于20,跳到第4行cmp car_row1,4 ;行數(shù)小于4,跳到第20行jb c1cmp car_col1,3 ;列數(shù)小于3,跳到第70列jb c2cmp car_col1,70 ;列數(shù)大于70,跳到第3列ja c3jmp cnc0:mov car_row1,4jmp cnc1:mov car_row1,20jmp cnc2:mov car_col1,70jmp cnc3:mov car_col0,3mov car_col1,3jmp cncn: mov bh,0 ;row1賦給row0,col1賦給col0,即把現(xiàn)在的坐標(biāo)保

38、留,作為下次清屏的坐標(biāo)mov bl,car_row1mov car_row0,blmov bl,car_col1mov car_col0,blmov dh,car_row1mov dl,car_col1 CALL DISP ;調(diào)用DISP畫(huà)出汽車圖形pop siretcar_dispendp;-car_clearproc near ;汽車清圖子程序 clear_car car_row0,car_col0 ;調(diào)用汽車清圖宏ret ;返回car_clearendp;-man_dispproc near ;機(jī)器人畫(huà)圖子程序push si lea si,MANU ;取機(jī)器人的圖cmp man_row1

39、,20 ;設(shè)置機(jī)器人運(yùn)動(dòng)的邊界ja n0 ;行數(shù)大于20,跳到第4行cmp man_row1,4 ;行數(shù)小于4,跳到第20行jb n1cmp man_col1,3 ;列數(shù)小于3,跳到第70列jb n2cmp man_col1,70 ;列數(shù)大于70,跳到第3列ja n3jmp nnn0:mov man_row1,4jmp nnn1:mov man_row1,20jmp nnn2:mov man_col1,70jmp nnn3:mov man_col0,3mov man_col1,3jmp nnnn:push bx ;row1賦給row0,col1賦給col0,即把現(xiàn)在的坐標(biāo)保留,作為下次清屏的坐標(biāo)mov bh,0mov bl,man_row1mov man_row0,blmov bl,man_col1mov man_col0,blpop bxmov dh,man_row1mov dl,man_col1 CALL DISP ;調(diào)用DISP畫(huà)出機(jī)器人圖形pop siretman_dispendp;-man_clearproc near ;機(jī)器人清圖子程序 clear_man man_row0,man_col0 ;調(diào)用機(jī)器人清圖

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論