河北聯(lián)合大學匯編課設報告正文(共22頁)_第1頁
河北聯(lián)合大學匯編課設報告正文(共22頁)_第2頁
河北聯(lián)合大學匯編課設報告正文(共22頁)_第3頁
河北聯(lián)合大學匯編課設報告正文(共22頁)_第4頁
河北聯(lián)合大學匯編課設報告正文(共22頁)_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上一、軟件背景介紹1.1背景知識俄羅斯方塊原本是科學家所開發(fā)的教育用,之后開始提供授權給各個游戲公司,造成各平臺上軟件大量發(fā)行的現(xiàn)象。版的俄羅斯方塊在日本賣出424萬套,是Game Boy史上賣最好的游戲。時,也是前線美軍最常拿消磨時間的游戲之一。由于俄羅斯方塊具有的數(shù)學性、動態(tài)性與知名度,也經(jīng)常拿來作為游戲的練習題材。俄羅斯方塊曾經(jīng)造成的轟動與帶來的經(jīng)濟價值,可以說是世界游戲史上的一個奇跡。它看似簡單卻又變化無窮,令人上癮。相信大多數(shù)用戶都還記得為它癡迷得“茶不思飯不想”的那個俄羅斯方塊時代。俄羅斯方塊上手極其簡單,但是要熟練地掌握其中的操作與擺放技巧,難度卻不低。作

2、為老少皆宜的大眾游戲,其普及程度可以說是史上任何一款游戲都無法相比的。俄羅斯方塊(Tetris, 俄文:)是一款風靡全球的電視和掌上游戲機,它由俄羅斯人發(fā)明,故得此名。俄羅斯方塊的基本規(guī)則是移動、旋轉(zhuǎn)和擺放游戲自動輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。由于上手簡單、老少皆宜,從而家喻戶曉,風靡世界。 俄羅斯方塊原名是(英語是Tetris),這個名字來源于希臘語tetra,意思是“四”,而游戲的作者最喜歡(tennis)。于是,他把兩個詞tetra和tennis合而為一,命名為Tetris,這也就是俄羅斯方塊名字的由來。 1.2基本功能部分游戲有單格方塊,可以穿透固定的方塊到達

3、最下層空位。其他的改版中出現(xiàn)更多特別的造型。方塊會從區(qū)域上方開始緩慢繼續(xù)落下。玩家可以做的操作有:以90度為單位旋轉(zhuǎn)方塊,以格子為單位左右移動方塊,讓方塊加速落下。方塊移到區(qū)域最下方或是著地到其他方塊上無法移動時,就會固定在該處,而新的方塊出現(xiàn)在區(qū)域上方開始落下。當區(qū)域中某一列橫向格子全部由方塊填滿,則該列會消失并成為玩家的得分。同時刪除的列數(shù)越多,得分指數(shù)上升。當固定的方塊堆到區(qū)域最上方而無法消除層數(shù)時,則游戲結束。1.3運行截圖圖1 運行截圖圖2 運行截圖圖3 運行截圖二、核心算法思想游戲區(qū)域由許多等面積的小方塊構成,這些區(qū)域狀態(tài)只有滿或空兩種。將空間以靜態(tài)二維數(shù)組實現(xiàn),并預先定義其狀態(tài)值

4、。滿為1,空為0,以此來完成游戲地圖區(qū)域的空間分配。小方塊的實現(xiàn)是由一個4*2的小數(shù)組表示,用四個存儲單位空間存儲當前下墜物的每一個子塊的位置來對整個下墜物件的位置進行標識,每個存儲空間的大小就是一個點的坐標。每個方塊都有其對應的編號,編號按由上到下,由左到右的順序編排。有了這些編號,方塊的變換實現(xiàn)起來就方便多了。再由一個宏去標識下墜物的位置。 游戲進程需要定時器的驅(qū)動,所以很有必要在程序當中加入一個定時器機制。如此對游戲的開始,暫停,結束控制便能夠得到實現(xiàn)。游戲開始后便開始掉落方塊,并且會在游戲區(qū)域上方出現(xiàn)下一個下墜物的形態(tài),因此有隨機物件產(chǎn)生這個操作。此時用戶可根據(jù)需要來變換方塊,向左或向

5、右移動來調(diào)整方塊位置,然后通過按下使方塊加速下落。這就涉及到了四個主要操作。當方塊向左或向右移動時,需要判定方塊是否達到了游戲區(qū)域的邊界;當方塊下落時需要判定方塊是否到了游戲區(qū)域的底部,或是碰到了別的方塊。這樣游戲內(nèi)部便引入眾多相關函數(shù)。對這些函數(shù)進行實現(xiàn)和細化之前,需要對整個游戲運行期間的概要流程有所了解。本游戲界面簡潔明了,沒有什么花哨的東西。菜單欄功能并不復雜,僅有游戲控制和選項設置兩項。進入游戲后的窗口背景是黑色調(diào),游戲區(qū)域是灰色調(diào),這些都可以通過選項進行調(diào)整。游戲區(qū)域有20列,10行,這樣設計是為了讓方框有足夠的高度,可以讓玩家有充足的反應時間來處理掉落的方塊。游戲開始后默認的方塊是

6、具有立體感的紅色方塊,其顏色和質(zhì)感都是經(jīng)過精心設計的。而在上方會顯示將要落下的方塊,讓玩家做好迎接挑戰(zhàn)的心理準備,下方則顯示分數(shù)。游戲的操作主要由鼠標和鍵盤來完成。鼠標點擊開始后便可用鍵盤上的“上下左右”來對方塊進行操作。方塊的實現(xiàn)七種下墜物都有一個共同點,就是它們占據(jù)的空間一樣,都是由四個等面積的小方塊構成,因此用一個整型的數(shù)組來存儲每個下墜物的四個小方塊的坐標位置。每個下墜物中的方塊都有編號,編號按從左到右,從上到下的順序排列。從代碼中可以看出程序首先獲取了當前下墜物的四個小方塊坐標,然后所有縱坐標遞減一格,由函數(shù)計算出改變數(shù)據(jù)的區(qū)域。這樣便可完成左移命令。右移和下移的道理也是一樣。但是這

7、里涉及到一個問題,就是要對移動是否到達游戲區(qū)域的邊界做出判斷。左、右移的限制原理是一樣的,只是方向和坐標數(shù)據(jù)有點區(qū)別。根據(jù)各種不同形態(tài)的下墜物最左邊的小方塊的正左(右)方區(qū)域是否為非被占用狀態(tài)來判斷它是否可以移動。而下移的限制涉及到消行判斷,這些將在后面做具體分析。方塊的旋轉(zhuǎn)操作需要考慮到兩個問題,一個是如何實現(xiàn)旋轉(zhuǎn),另一個是判斷能否旋轉(zhuǎn)。為了實現(xiàn)旋轉(zhuǎn),首先獲取當前下墜物的四個小方塊的坐標位置。由于每種方塊變形后的狀態(tài)都不同,因此需要對下墜物的不同形態(tài)進行編號。3、 核心算法流程圖進入程序后先進行屏幕初始化,之后顯示調(diào)用顯示邊框函數(shù),再顯示新方塊。檢測按鍵狀態(tài),之后再度檢測鍵盤狀態(tài)。 圖4 流

8、程控制算法流程圖為了保證整個程序結構性能良好,不會出現(xiàn)與其他函數(shù)體同時用一個寄存器而使得程序跑飛。在進入程序后先將幾個主要寄存器推入堆棧,當程序退出時,又將寄存器值從堆棧中送回。堆棧采用的是先進后出的算法,所以應當注意順序。這樣接口,便于向后兼容,使用起來方便。 圖5 流程控制算法流程圖四、源代碼下面給出的是用俄羅斯游戲?qū)崿F(xiàn)程序的源代碼:;游戲狀態(tài) GS_RUNNING equ 0 GS_PAUSED equ 1 GS_OVER equ 2 ;最高可達到的關數(shù) LEVEL_LIMITT equ 15 ;游戲區(qū)域起始位置及大小 GM_LEFT equ 25 GM_TOP equ 4 GM_WID

9、TH equ 12 GM_HEIGHT equ 20 GM_MASK equ (1 SHL GM_WIDTH-1) ;功能鍵掃描碼 KEY_ESC equ 1h ;ESC KEY_LEFT equ 4bh ;LEFT KEY_RIGHT equ 4dh ;RIGHT KEY_ROLATE equ 48h ;UP KEY_DOWN equ 50h ;DOWN KEY_QUICKLY equ 3dh ;F3 KEY_SLOW_DOWN equ 3ch ;F2 KEY_TURN equ 4fh ;End KEY_PAUSE equ 53h ;Delete KEY_CHANG_MODE equ 3bh

10、 ;F1 CHAR_CLEAR equ ' '擦除字符,ascii CHAR_BRICK equ 2 ;方塊外形,ascii ;0黑 1深藍 2綠 3藍 4紅 5紫 6黃 7灰白,最高位置1則高亮顯示 COLOR_CLEAR equ 0h COLOR_DIED_BRICK equ 08h COLOR_TITTLE equ 7; COLOR_NUMBER equ 3 or 8 ;屏幕上各說明文字或裝飾物的坐標,皆為相對游戲場地左上角 X_NEXT_BRICK equ -5 Y_NEXT_BRICK equ 3 Y_LBOUND_CHAR equ 17 Y_RBOUND_CHAR

11、equ 16 Y_BOUND_COLOR equ 2 or 8;blue X_UBOUND_CHAR equ 15 X_DBOUND_CHAR equ 15 X_BOUND_COLOR equ 2 or 8;green X_START equ (GM_WIDTH-1)/2 Y_START equ -1 X_SCORE_STR equ -10 X_LEVEL_STR equ X_SCORE_STR X_adjustLevelDelt_STR equ X_SCORE_STR-4 X_MODE_STR equ X_SCORE_STR-4 Y_SCORE_STR equ 5 Y_LEVEL_STR e

12、qu Y_SCORE_STR+2 Y_adjustLevelDelt_STR equ Y_LEVEL_STR+2 Y_MODE_STR equ Y_adjustLevelDelt_STR+2 X_SCORE_POS equ -3 X_LEVEL_POS equ X_SCORE_POS X_adjustLevelDelt_POS equ X_SCORE_POS X_MODE_POS equ X_SCORE_POS Y_SCORE_POS equ Y_SCORE_STR+1 Y_LEVEL_POS equ Y_LEVEL_STR+1 Y_adjustLevelDelt_POS equ Y_adju

13、stLevelDelt_STR+1 Y_MODE_POS equ Y_MODE_STR+1 X_GAME_OVER equ -10 X_JUDGE_STR equ X_GAME_OVER+5 X_GAME_NAME equ GM_WIDTH/2-4 Y_GAME_NAME equ -1 Y_GAME_OVER equ -3 Y_JUDGE_STR equ Y_GAME_OVER+1 ;判斷游戲區(qū)域(dl,dh)位置是否為空 ;in : dl->x, dh->y ;out : flag register isPosNotEmpty proc push dx push bx push

14、ax push cx push di push si mov si,curMB mov si,(ManyBrick ptr si).mb_bCnt ;ax-mask,第dl位置1 mov ax,1 mov cl,dl shl ax,cl lea di,game.ga_map ;map+2*dh xor bh,bh mov bl,dh shl bl,1 only_one_brick: and ax,bx+di je is_pos_empty_out cmp si,1 jne is_pos_empty_out cmp bx,(2*GM_HEIGHT-2) je is_pos_empty_out_p

15、re add bx,2 jmp only_one_brick ;ensure the result is correct is_pos_empty_out_pre: cmp bx,0 is_pos_empty_out: pop si pop di pop cx pop ax pop bx pop dx ret isPosNotEmpty endp ;判斷游戲是否結束 isGameOver proc push bx mov bx,curMB cmp (ManyBrick ptr bx).mb_sPos.pos_bY,Y_START jne still_alive ;游戲的確結束了 mov gam

16、e.ga_state,GS_OVER call doGameOver still_alive: pop bx ret isGameOver endp ;游戲結束后,調(diào)用此過程,顯示一些提示信息,待等用戶下一步指示,重玩或退出 doGameOver proc call clrScreen call moreBeautiful mov si,offset gameOverStr mov cx,45 mov dl,X_GAME_OVER ;x mov dh,Y_GAME_OVER ;y call showStr mov ax,game.ga_score mov cx,43 call AXModCX

17、and ax,3 mov di,ax shl di,1 mov cx,judgeCntdi mov si,judgeTabledi mov dl,X_JUDGE_STR mov dh,Y_JUDGE_STR call showStr mov al,CHAR_BRICK wait_for_restart: call randomDraw call delay jmp wait_for_restart ret doGameOver endp ;in : ax-ax0, cx-cx0 ;out: ax=ax0/cx0, cx=ax0%cx0 AXModCX proc push dx xor dx,d

18、x div cx mov cx,dx pop dx ret AXModCX endp randomDraw proc push dx push bx push ax call getRand mov cx,GM_WIDTH call AXModCX mov dl,cl call getRand mov cx,GM_HEIGHT call AXModCX mov dh,cl call getRand and al,7 or al,8 mov bl,al pop ax call drawBrick pop bx pop dx ret randomDraw endp ;游戲暫停時調(diào)用此過程,顯示提示

19、信息,按任意鍵繼續(xù) doGamePaused proc push si push cx push dx push ax mov si,offset gamePausedStr mov cx,46 ;46 chars mov dl,0 ;x mov dh,GM_HEIGHT/2;y call showStr call waitForKeyPress mov game.ga_state,GS_RUNNING mov dl,0 mov dh,GM_HEIGHT/2 mov al,CHAR_CLEAR mov cx,46 ;46 chars erase_paused_words: mov bl,COL

20、OR_CLEAR call drawBrick inc dl loop erase_paused_words call moreBeautiful call drawMap call ManyBrick_drawSelf pop ax pop dx pop cx pop si ret doGamePaused endp ;clear the screen clrScreen proc push ax mov ah,00h mov al,03h int 10h pop ax ret clrScreen endp ;游戲完成時跳轉(zhuǎn)到此,表示對極富耐心者的景仰_,并退出游戲 doGameFinish

21、ed: call clrScreen call moreBeautiful mov si,offset gameFinishedStr mov cx,58 ;58 chars mov dl,-GM_LEFT+5 mov dh,-2 call showStr dGF_keybuf_empty: call getRand call randomDraw mov ah,1 int 16h jz dGF_keybuf_empty jmp main_quit ;等待直到有鍵被按下 waitForKeyPress proc push ax key_buf_empty: mov ah,1 int 16h j

22、z key_buf_empty ;ignore the key just press mov ah,0 int 16h pop ax ret waitForKeyPress endp ;方塊下落停止時,設置當前下落方塊所占用的地圖位置,并消除滿行 lastBattle proc call ManyBrick_setMap call checkFull ret lastBattle endp ;若map數(shù)組相應為置位 則在相應位置顯示一個方塊 drawMap proc push ax push dx push bx push cx push si push di lea si,game.ga_m

23、ap mov cx,GM_HEIGHT xor dh,dh drawMap_outer: push cx mov cx,GM_WIDTH xor dl,dl mov di,1 push si mov si,si mov ah,3 drawMap_inner: mov bl,3 sub bl,ah mov ah,bl test si,di jz clear_it ;draw a brick mov al,CHAR_BRICK mov bl,COLOR_DIED_BRICK jmp draw_map_over clear_it: cmp mode,2 jne ignor_background mo

24、v al,'|' mov bl,ah jmp draw_map_over ignor_background: mov al,CHAR_CLEAR mov bl,COLOR_CLEAR draw_map_over: call drawBrick inc dl shl di,1 loop drawMap_inner pop si pop cx add si,2 inc dh loop drawMap_outer pop di pop si pop cx pop bx pop dx pop ax ret drawMap endp ;檢查是否有滿行的情況,滿則消除,并增加得分. che

25、ckFull proc push ax push bx push cx push dx xor dx,dx ;此次能消除的行數(shù) lea bx,game.ga_map add bx,2*(GM_HEIGHT-1) mov cx,GM_HEIGHT check_full_again: mov ax,bx cmp ax,GM_MASK jne brick_not_full inc dx call mapScrollDown loop check_full_again brick_not_full: sub bx,2 loop check_full_again test dx,dx jz get_ze

26、ro_score ;此次得分:2*行數(shù)-1 shl dx,1 dec dx add game.ga_score,dx call calcLevel call showScore get_zero_score: pop dx pop cx pop bx pop ax ret checkFull endp ;根據(jù)得分計算當前關數(shù) calcLevel proc push ax push bx push cx mov bx,offset levelScoreLast xor ah,ah mov cx,LEVEL_LIMITT add_level_again: mov al,bx cmp game.ga

27、_score,ax jae calc_level_out dec bx loop add_level_again calc_level_out: mov level,cx cmp level,LEVEL_LIMITT jb game_unfinished add sp,6 jmp doGameFinished game_unfinished: call showLevel pop cx pop bx pop ax ret calcLevel endp ;顯示當前關 showLevel proc push dx push bx push ax mov bl,COLOR_NUMBER mov dl

28、,X_LEVEL_POS mov dh,Y_LEVEL_POS mov ax,level call showInt pop ax pop bx pop dx ret showLevel endp ;顯示當前得分 showScore proc push dx push bx push ax mov bl,COLOR_NUMBER mov dl,X_SCORE_POS mov dh,Y_SCORE_POS mov ax,game.ga_score call showInt pop ax pop bx pop dx ret showScore endp ;顯示當前自動提升的關數(shù) showAdjust

29、LevelDelt proc push dx push bx push ax mov bl,COLOR_NUMBER mov dl,X_adjustLevelDelt_POS mov dh,Y_adjustLevelDelt_POS mov ax,challenge call showInt pop ax pop bx pop dx ret showAdjustLevelDelt endp showMode proc push dx push bx push ax mov bl,COLOR_NUMBER mov dl,X_MODE_POS mov dh,Y_MODE_POS mov ax,mo

30、de call showInt call drawMap pop ax pop bx pop dx ret ret showMode endp ;在(dl,dh)為起始的位置顯示ax中的一個整數(shù) ;in : ax-the integer to be show ; dl-x , dh-y; showInt proc push cx push si push di xor di,di mov cx,10 show_int_again: inc di push dx xor dx,dx ;dx:ax /cx, ax ,dx div cx mov si,ax mov al,dl pop dx add

31、al,30h call drawBrick dec dl mov ax,si cmp ax,0 jnz show_int_again cmp di,1 jne no_need_to_clear mov al,CHAR_CLEAR push bx mov bl,COLOR_CLEAR call drawBrick pop bx no_need_to_clear: pop di pop si pop cx ret showInt endp ;在(X_NEXT_BRICK,Y_NEXT_BRICK)處顯示下一個將要下落的方塊s drawNextBrick proc push bx push dx ;

32、first clear the last draw mov bx,curMB mov dx,WORD ptr (ManyBrick ptr bx).mb_sPos.pos_bX mov (ManyBrick ptr bx).mb_sPos.pos_bX ,X_NEXT_BRICK mov (ManyBrick ptr bx).mb_sPos.pos_bY ,Y_NEXT_BRICK call ManyBrick_clearCur mov WORD ptr (ManyBrick ptr bx).mb_sPos.pos_bX,dx ;second draw the next-brick mov b

33、x,nextMB mov dx,WORD ptr (ManyBrick ptr bx).mb_sPos.pos_bX mov (ManyBrick ptr bx).mb_sPos.pos_bX ,X_NEXT_BRICK mov (ManyBrick ptr bx).mb_sPos.pos_bY ,Y_NEXT_BRICK xchg bx,curMB call ManyBrick_drawSelf xchg curMB,bx mov WORD ptr (ManyBrick ptr bx).mb_sPos.pos_bX,dx pop dx pop bx ret drawNextBrick end

34、p ;游戲區(qū)域?qū)猰ap數(shù)組在bx行處下卷,即清除bx所在行 ;in: bx -the line to be clear mapScrollDown proc push bx push ax push cx dec cx je scroll_over push si push di mov di,bx lea si,di-2 std rep movsw pop di pop si scroll_over: mov game.ga_map,0 call drawMap pop cx pop ax pop bx ret mapScrollDown endp ;根據(jù)當前下落的方塊所在位置設置游戲區(qū)域

35、所代表的map數(shù)組 ManyBrick_setMap proc push ax push bx push cx push dx push si push di push bp lea di,game.ga_map mov bx,curMB mov cx,(ManyBrick ptr bx ).mb_bCnt lea si,(ManyBrick ptr bx ).mb_sBrick lea bp,(ManyBrick ptr bx).mb_sPos setMap_again: mov dh,(Brick ptr si).b_sPos.pos_bY add dh,ds:(Pos ptrbp).po

36、s_bY mov dl,(Brick ptr si).b_sPos.pos_bX add dl,ds:(Pos ptrbp).pos_bX call isPosLeagel js setMap_ignore cmp dh,0 js setMap_ignore ;mapdh mov bl,dh shl bl,1 xor bh,bh ;bx-&mapdh lea bx,bx+di mov ax,1 push cx mov cl,dl shl ax,cl pop cx or bx,ax setMap_ignore: add si,size Brick loop setMap_again cm

37、p mode,0 jz color_stay call drawMap color_stay: pop bp pop di pop si pop dx pop cx pop bx pop ax ret ManyBrick_setMap endp ;接受用戶輸入,并轉(zhuǎn)化為內(nèi)部數(shù)據(jù),有的立即響應,如:ESC退出 processUserInput proc push ax push bx push cx mov ah,1 int 16h jz just_ignore cmp game.ga_state,GS_OVER jnz no_need_to_restart jmp restart_the_ga

38、me no_need_to_restart: mov ah,0 int 16h cmp ah,KEY_ESC jnz gameCont ;quit the game jmp main_quit gameCont: cmp ah,KEY_PAUSE jz away_for_a_while cmp ah,KEY_QUICKLY jz go_quickly cmp ah,KEY_SLOW_DOWN jz go_slow_down cmp ah,KEY_LEFT jz set_dir_left cmp ah,KEY_RIGHT jz set_dir_right cmp ah,KEY_DOWN jz s

39、et_dir_down cmp ah,KEY_TURN jz set_dir_turn cmp ah,KEY_CHANG_MODE jz set_mode cmp ah,KEY_ROLATE jnz just_ignore set_dir_rolate: mov dir,DIR_ROTATE jmp just_ignore set_dir_left: mov dir,DIR_LEFT jmp just_ignore set_dir_right: mov dir,DIR_RIGHT jmp just_ignore set_dir_turn: mov dir,DIR_TURN jmp just_i

40、gnore set_mode: inc mode mov ax,mode mov cx,3 call AXModCX mov mode,cx call showMode jmp just_ignore go_slow_down: dec challenge jmp adjustLevelDelt_adjust go_quickly: inc challenge adjustLevelDelt_adjust: and challenge,0fh call showadjustLevelDelt jmp just_ignore away_for_a_while: mov game.ga_state,GS_PAUSED call doGamePaused jmp j

溫馨提示

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

評論

0/150

提交評論