第7章 程序設(shè)計之?dāng)?shù)字推盤_第1頁
第7章 程序設(shè)計之?dāng)?shù)字推盤_第2頁
第7章 程序設(shè)計之?dāng)?shù)字推盤_第3頁
第7章 程序設(shè)計之?dāng)?shù)字推盤_第4頁
第7章 程序設(shè)計之?dāng)?shù)字推盤_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章程序設(shè)計之?dāng)?shù)字推盤數(shù)字推盤游戲簡介游戲模塊-pygame游戲框架自頂向下的設(shè)計自底向上的實現(xiàn)運行數(shù)字推盤學(xué)習(xí)目標了解掌握熟悉了解了解pygame模塊的框架和基礎(chǔ)函數(shù)12熟悉MVC設(shè)計模式,可熟練劃分項目模塊,設(shè)計數(shù)據(jù)結(jié)構(gòu)與接口了解程序測試原則34掌握自頂向下的程序設(shè)計方式目錄?點擊查看本節(jié)相關(guān)知識點游戲模塊-pygame7.27.1數(shù)字推盤游戲簡介?點擊查看本節(jié)相關(guān)知識點7.3游戲框架7.4自頂向下的設(shè)計目錄運行數(shù)字推盤7.67.5自底向上的實現(xiàn)知識架構(gòu)7.2游戲模塊-pygame1pygame的初始化和退出2創(chuàng)建游戲窗口3游戲循環(huán)與游戲時鐘4圖形和文本繪制5元素位置控制6動態(tài)效果7事件與事件處理知識架構(gòu)1頂層設(shè)計2子層設(shè)計3第三層設(shè)計7.4

自頂向下的設(shè)計4模塊整合7.1數(shù)字推盤游戲簡介數(shù)字推盤游戲簡介數(shù)字推盤是一種益智游戲:載體是內(nèi)嵌了n×n個方塊的凹槽板;凹槽中的方塊均刻有或?qū)懹?~n×n之內(nèi)的不同數(shù)字。7.1數(shù)字推盤游戲簡介數(shù)字推盤游戲程序界面(a)初始化游戲(b)初始化完成(c)移動計數(shù)(d)完成游戲7.1數(shù)字推盤游戲簡介數(shù)字推盤游戲規(guī)則開始移動步數(shù)功能結(jié)束退出窗口初始化游戲初始化鍵盤鼠標重置新游戲自動ESC單擊關(guān)閉按鈕7.2游戲模塊-pygamepygame簡介pygame是為開發(fā)2D游戲而設(shè)計的Python跨平臺模塊。開發(fā)人員利用pygame模塊中定義的接口,可以方便快捷地實現(xiàn)游戲中的一些功能,如:圖形用戶界面創(chuàng)建圖形和圖像的繪制用戶鍵盤和鼠標操作的監(jiān)聽播放音頻安裝pygamepygame的安裝命令:pipinstallpygame7.2游戲模塊-pygamepygame的初始化和退出init():一次性初始化pygame的所有模塊quit():可以寫在所有之前被初始化的pygame模塊init()一次性初始化pygame的所有模塊,如:顯示模塊字體模塊混音器模塊卸載所有之前被初始化的pygame模塊。quit()7.2游戲模塊-pygamepygame的初始化和退出創(chuàng)建程序文件7_pg_test.py,導(dǎo)入pygame模塊,并在主函數(shù)中實現(xiàn)pygame的初始化和退出。示例:importpygame #導(dǎo)入pygamedefmain(): pygame.init() #初始化所有模塊 pygame.quit() #卸載所有模塊if__name__=='__main__': main()7.2游戲模塊-pygame創(chuàng)建游戲窗口pygame通過display子模塊創(chuàng)建圖形界面窗口,該子模塊中與窗口相關(guān)的常用函數(shù)如下:函數(shù)說明set_mode()初始化游戲窗口set_caption()設(shè)置窗口標題update()更新屏幕顯示內(nèi)容7.2游戲模塊-pygame初始化游戲窗口set_mode()函數(shù)聲明如下:set_mode(resolution=(0,0),flags=0,depth=0)->Surfaceresolution:圖形窗口的分辨率。本質(zhì)上是一個元組(寬,高),單位為像素。默認與屏幕大小一致。flags:標志位。用于設(shè)置窗口特性,默認為0。depth:色深。該參數(shù)只取整數(shù),范圍為[8,32]。參數(shù)含義:返回值含義:返回值為Surface對象。可以將Surface對象看作畫布,必須先有畫布,繪制的圖形才能夠被呈現(xiàn)。7.2游戲模塊-pygameset_mode()函數(shù)創(chuàng)建的窗口默認為黑色背景,使用Surface對象的fill()方法可以填充畫布,修改窗口顏色。示例:創(chuàng)建一個窗體,并修改其背景顏色。importpygame WINWIDTH=640 WINHEIGHT=480 DARKTURQUOISE=(3,54,73) BGCOLOR=DARKTURQUOISE defmain(): pygame.init() WINSET=pygame.display.set_mode((WINWIDTH,WINHEIGHT)) WINSET.fill(BGCOLOR) pygame.quit() if__name__=='__main__': main()7.2游戲模塊-pygame設(shè)置窗口標題set_caption()函數(shù)聲明如下:set_caption(title,icontitle=None) ->Nonetitle:用于設(shè)置顯示在窗口標題欄上的標題。icontitle:用于設(shè)置顯示在任務(wù)欄上的程序標題,默認與title一致。參數(shù)含義:示例:修改程序7_pg_test.py中的代碼,在其中調(diào)用set_caption()函數(shù)設(shè)置窗口標題。pygame.display.set_caption('數(shù)字推盤') 7.2游戲模塊-pygame刷新窗口實際上前面代碼中使用fill()方法填充背景后背景顏色卻未改變,正是因為程序中未調(diào)用該函數(shù)對窗口進行刷新。示例:在pygame.quit()語句之前調(diào)用update()函數(shù)。defmain(): pygame.init() WINSET=pygame.display.set_mode((WINWIDTH,WINHEIGHT)) WINSET.fill(BGCOLOR) pygame.display.set_caption('數(shù)字推盤')

pygame.display.update() pygame.quit() 7.2游戲模塊-pygame游戲循環(huán)游戲啟動后一般由玩家手動關(guān)閉。若要使游戲保持運行,需要在程序中添加一個無限循環(huán)。示例:whileTrue: pass7.2游戲模塊-pygame游戲時鐘游戲時鐘用于控制幀率,利用視覺暫留現(xiàn)象形成動畫。幀率>60幀/s,就能實現(xiàn)連續(xù)、高品質(zhì)動畫效果。游戲時鐘用于解決幀率過高的問題。Clock類與tick()方法通過Clock類的tick()方法可以方便地設(shè)置游戲循環(huán)的執(zhí)行頻率,具體操作如下:FPSCLOCK=pygame.time.Clock() #創(chuàng)建Clock對象FPSCLOCK.tick(FPS) #為Clock對象設(shè)置幀率示例:修改程序7_pg_test.py中的代碼,為其添加幀率控制語句。7.2游戲模塊-pygame圖形化窗口是繪制文本和圖形的前提,創(chuàng)建窗口之后方可在其中繪制文本、圖形等元素。通過前面的講解可知,pygame中的圖形窗口是一個Surface對象,在窗口中進行繪制實質(zhì)上就是在Surface對象之上進行繪制。圖形和文本繪制圖形繪制加載圖片繪制圖片7.2游戲模塊-pygame加載圖片即將圖片讀取到程序中。通過pygame中image類的load()方法可以向程序中加載圖片,生成Surface對象。1.加載圖片load()方法參數(shù)filename。被加載的文件名。返回值Surface。load()方法返回一個Surface對象。load(filename)->Surface方法說明:示例:使用load()方法加載名為“bg.jpg”的圖片。7.2游戲模塊-pygame繪制圖像即將一個Surface對象疊加在另一個Surface對象之上。通過Surface對象的blit()方法可以實現(xiàn)圖像繪制。2.繪制圖片blit()方法source。接收被繪制的Surface對象。dest。接收一個表示位置的元組(left,top),或接收一個表示矩形的元組(left,top,width,height),將矩形的位置作為繪制的位置。area。是一個可選參數(shù),通過該參數(shù)可設(shè)置矩形區(qū)域。若設(shè)置的矩形區(qū)域小于source所設(shè)置Surface對象的區(qū)域,那么僅繪制Surface對象的部分內(nèi)容。special_flags。標志位。blit(source,dest,area=None,special_flags=0)->Rect參數(shù)說明:7.2游戲模塊-pygame示例:使用blit()方法將加載生成的imgSurf對象繪制到窗口WINSET中。2.繪制圖片7.2游戲模塊-pygame文本繪制創(chuàng)建字體對象渲染文本內(nèi)容,生成一張圖像將生成的圖像繪制到游戲主窗口中文本繪制實際上也是圖片的疊加,只是在繪制之前需要先結(jié)合字體,將文本內(nèi)容制作成圖片。7.2游戲模塊-pygame1.創(chuàng)建字體對象調(diào)用font模塊的Font()函數(shù)可以創(chuàng)建一個字體對象,F(xiàn)ont()函數(shù)的聲明如下:Font(filename,size)->Fontfilename。用于設(shè)置字體對象的字體。size。用于設(shè)置字體對象的大小。參數(shù)說明:示例:BASICFONT=pygame.font.Font('STKAITI.TTF',25)Font()函數(shù)7.2游戲模塊-pygame1.創(chuàng)建字體對象調(diào)用font模塊的SysFont()函數(shù)可以創(chuàng)建一個字體對象,SysFont()函數(shù)的聲明如下:SysFont(name,size,bold=False,italic=False)->Fontname:系統(tǒng)字體的名稱??梢栽O(shè)置的字體與操作系統(tǒng)有關(guān),通過pygame.font.get_fonts()函數(shù)可以獲取當(dāng)前系統(tǒng)的所有可用字體列表。該參數(shù)亦可接收字體路徑名。size:字體大小。bold:是否設(shè)置為粗體,默認為否。italic:是否設(shè)置為斜體,默認為否。參數(shù)說明:SysFont()函數(shù)7.2游戲模塊-pygame1.創(chuàng)建字體對象SysFont()對系統(tǒng)依賴度較高,F(xiàn)ont()則可以在設(shè)置字體時將字體文件存儲到程序路徑中,使用自定義的字體。Font()函數(shù)更加靈活,也更利于游戲程序的打包和移植。Font和SysFont()函數(shù)的區(qū)別7.2游戲模塊-pygame2.渲染文本內(nèi)容pygame模塊中可通過字體對象的render()方法進行渲染,該方法的聲明如下:render(text,antialias,color,background=None)->Surfacetext參數(shù):文字內(nèi)容。antialias參數(shù):是否抗鋸齒(抗鋸齒效果會讓繪制的文字看起來更加平滑)。color參數(shù):文字顏色。background參數(shù):背景顏色,默認為None,表示無顏色。參數(shù)說明:示例:以調(diào)用Font()函數(shù)生成的字體對象BASICFONT為例,通過render()方法渲染文本內(nèi)容。YELLOW=(255,255,193) #顏色預(yù)設(shè)MSGCOLOR=DARKTURQUOISE #設(shè)置字體顏色MSGBGCOLOR=YELLOW #按鈕背景顏色msgSurf=BASICFONT.render('初始化...',True,MSGCOLOR,MSGBGCOLOR)render()方法7.2游戲模塊-pygame2.渲染文本內(nèi)容通過image類的save()方法可以將渲染生成的Surface對象作為圖片存儲到本地,save()方法的語法格式如下:示例:使用save()方法將msgSurf對象保存到本地,并命名為msg.png。save()方法save(Surface,filename)->None設(shè)置透明背景通過image類的save()方法可以將渲染生成的Surface對象作為圖片存儲到本地,save()方法的語法格式如下:msgSurf=BASICFONT.render('初始化...',True,MSGCOLOR,None)pygame.image.save(msgSurf,'msg.png')7.2游戲模塊-pygame3.繪制渲染結(jié)果示例:將創(chuàng)建的文本對象msgSurf繪制到WINSET的(0,0)位置。7.2游戲模塊-pygame元素位置控制要點pygame圖形窗口的坐標體系pygame的Rect類位置控制1.

pygame圖形窗口的坐標體系pygame圖形窗口坐標體系的定義如下:坐標原點在游戲窗口的左上角。x軸與水平方向平行,以向右為正。y軸與垂直方向平行,以向下為正。7.2游戲模塊-pygame示例:將分辨率為160×120的矩形放置在分辨率為640×480的pygame窗口的(80,160)位置。7.2游戲模塊-pygame2.Rect類Rect類用于描述、控制可見對象(文本、圖片等)在pygame窗口中的位置,該類定義在pygame模塊之中,它的構(gòu)造函數(shù)如下:Rect(x,y,width,height)->Rect示例:創(chuàng)建坐標為(80,160)、分辨率為160×120的矩形對象。7.2游戲模塊-pygame2.Rect類除坐標、寬、高之外,矩形還具有許多用于描述與坐標系相對關(guān)系的屬性,下面將給出矩形對象的常見屬性,并以矩形rect=Rect(10,80,168,50)為例對這些屬性進行說明,具體如表所示。屬性說明示例x、left水平方向和Y軸的距離rect.x=10、rect.left=10y、top垂直方向和X軸的距離rect.y=80、rect.top=80width、w寬度rect.width=168、rect.w=168height、h高度rect.height=50、rect.h=50right右側(cè)=

x+wrect.right=178bottom底部=

y+hrect.bottom=130size尺寸

(w,h)rect.size=(168,50)topleft(x,y)rect.topleft=(10,80)bottomleft(x,bottom)rect.bottomleft=(10,130)topright(right,y)rect.topright=(178,80)bottomright(right,bottom)rect.bottomright=(178,130)centerx中心點x=

x+0.5*wrect.centerx=94centery中心點y=

y+0.5*hrect.centery=105center(centerx,centery)rect.center=(94,105)midtop(centerx,y)rect.midtop=(94,80)midleft(x,centery)rect.midleft=(10,105)midbottom(centerx,bottom)rect.midbottom=(94,130)midright(right,centery)rect.midright=(178,105)7.2游戲模塊-pygame2.Rect類矩形屬性示意圖如圖所示。7.2游戲模塊-pygame3.位置控制方式1:將Surface對象繪制到窗口時,以元組(x,y)的形式將坐標傳遞給參數(shù)dest。方式2:使用get_rect()方法獲取Surface對象的矩形屬性,重置矩形橫縱坐標后,再將矩形屬性傳遞給參數(shù)dest以設(shè)置繪制位置。位置控制方式示例:以繪制數(shù)字推盤右下角的功能按鈕“自動”為例,使用第二種位置控制方式在窗口中繪制文本。7.2游戲模塊-pygame動態(tài)效果原理動態(tài)效果分類文本/圖片的更換位置的改變屏幕的刷新移動。多次修改Surface對象繪制的位置并連續(xù)繪制刷新。動畫。在同一位置繪制不同的Surface對象。移動的動畫。連續(xù)繪制不同Surface對象的同時,修改繪制的位置。7.2游戲模塊-pygame動態(tài)效果分類移動動畫移動的動畫7.2游戲模塊-pygame想一想:數(shù)字推盤中的方塊移動需要哪些操作?繪制矩形方塊1繪制數(shù)字25移動移動繪有數(shù)字的方塊37.2游戲模塊-pygame1.繪制矩形方塊Surface,接收一個Surface對象。color,用于設(shè)置矩形顏色。Rect,接收一個矩形對象,以設(shè)置矩形繪制的位置和區(qū)域。width,用于設(shè)置外沿的厚度,默認為0。Pygame子draw模塊中的rect()函數(shù)用于在Surface對象上的指定位置繪制矩形,該函數(shù)的聲明如下:rect(Surface,color,Rect,width=0)->Rect參數(shù)介紹:返回值:rect()函數(shù)被調(diào)用后返回一個矩形對象。7.2游戲模塊-pygame示例:在窗體Surface對象WINSET的中心位置繪制分辨率為60×60的黃色矩形。7.2游戲模塊-pygame2.繪制數(shù)字方塊上的數(shù)字應(yīng)位于方塊的中心矩形對象的左上角坐標代表矩形的位置numRect.x=blockRect.x+0.5*(BLOCKSIZE-numRect.width)numRect.y=blockRect.y+0.5*(BLOCKSIZE-numRect.heigh)數(shù)字矩形對象位置:示例:在窗體黃色矩形的中心繪制數(shù)字5。7.2游戲模塊-pygame3.移動方塊推盤中的方塊由方塊圖像和數(shù)字圖像組成實現(xiàn)推盤方塊的移動需同步移動方塊圖像和數(shù)字圖像示例:方塊的連續(xù)移動。7.2游戲模塊-pygame想一想:為何移動效果不符合預(yù)期?因為推盤方塊的移動包含方塊的消失與重繪兩個步驟,但以上的代碼在繪制新方塊之前,未能使之前的方塊消失。pygame的Surface類中定義了copy()方法,使用該方法可以拷貝Surface對象,實現(xiàn)方塊的消失。7.2游戲模塊-pygamecopy()方法pygame的Surface類中定義了copy()方法,使用該方法可以拷貝Surface對象,實現(xiàn)方塊的消失。實現(xiàn)步驟step1step2在初次向窗口對象WINSET上繪制方塊之前,先調(diào)用copy()方法創(chuàng)建WINSET的備份。在第二次繪制方塊之前,將備份覆蓋到WINSET之上。7.2游戲模塊-pygame事件程序開發(fā)中將玩家會對游戲進行的操作稱為事件(Event),根據(jù)輸入媒介的不同,游戲中的事件分為:鍵盤事件鼠標事件手柄事件7.2游戲模塊-pygamepygame常見事件列表事件產(chǎn)生途徑參數(shù)KEYDOWN鍵盤被按下unicode,key,modKEYUP鍵盤被放開key,modMOUSEMOTION鼠標移動pos,rel,buttonMOUSEBUTTONDOWN鼠標按下pos,buttonMOUSEBUTTONUP鼠標放開pos,button鍵盤事件pygame在子模塊locals中對事件進行了更加細致的定義,鍵盤事件、鼠標事件及其產(chǎn)生途徑和參數(shù)如表所示。KEYDOWNKEYUPunicode:記錄按鍵的Unicode值。key:按下或放開的鍵的鍵值(K_xx)。mod:包含組合鍵信息參數(shù)介紹7.2游戲模塊-pygame鼠標事件MOUSEMOTIONMOUSEBUTTONUPMOUSEBUTTONDOWNpos:鼠標操作的位置(x,y)。rel:當(dāng)前位置與上次產(chǎn)生鼠標事件時鼠標位置間的距離。buttons:一個含有三個數(shù)字的元組,元組中數(shù)字的取值只能為0或1,三個數(shù)字依次表示左鍵、滾輪和右鍵。button:整型數(shù)值,表示具體操作。事件參數(shù)介紹事件相關(guān)屬性與函數(shù)pygame.event.type——判斷事件類型pygame.event.get()——獲取當(dāng)前時刻產(chǎn)生的所有事件的列表示例:程序7_pg_test.py中添加事件處理代碼。7.3游戲框架MVC設(shè)計模式MVC全稱為Model-View-Controller,即模型-視圖-控制器。MVC設(shè)計模式將應(yīng)用程序的輸入、處理和輸出分開,分成模型、視圖和控制器這三個核心部分。應(yīng)用程序核心用于處理應(yīng)用程序的數(shù)據(jù)邏輯部分模型-Model顯示應(yīng)用程序中的數(shù)據(jù)通常根據(jù)模型數(shù)據(jù)創(chuàng)建視圖-View處理用戶交互從視圖讀取數(shù)據(jù)根據(jù)用戶輸入修改數(shù)據(jù)將數(shù)據(jù)發(fā)送給模型控制器-Controller7.3游戲框架MVC設(shè)計模式框架7.3游戲框架數(shù)字推盤游戲框架數(shù)字推盤M(模型)V(視圖)C(控制器)數(shù)據(jù)模塊界面處理模塊游戲控制模塊7.4自頂向下的設(shè)計自頂向下設(shè)計思想將總問題劃分為較小的問題;繼續(xù)劃分子問題,直到問題足夠細小,可以輕松解決;拼接所有小塊,得到完整程序。7.4自頂向下的設(shè)計頂層設(shè)計數(shù)字推盤游戲分析模型視圖控制器以推盤序列為基礎(chǔ)接收用戶輸入以修改推盤序列修改后的推盤序列被重新繪制在窗口之中靜態(tài)(功能按鈕)動態(tài)(推盤、提示信息)模型修改程序流程控制7.4自頂向下的設(shè)計頂層設(shè)計數(shù)字推盤游戲功能為了降低理解與實現(xiàn)的難度,此處僅實現(xiàn)數(shù)字推盤游戲的基礎(chǔ)功能,具體功能如下:包含以下提示信息:初始化使用鼠標移動方塊。完成!提示信息部分僅支持通過鼠標操作移動方塊推盤部分僅保留“新游戲”功能按鍵部分7.4自頂向下的設(shè)計頂層設(shè)計數(shù)字推盤游戲模塊設(shè)計結(jié)合MVC設(shè)計模式對數(shù)字推盤游戲進行劃分,該游戲的各個部分又可劃分為多個模塊,具體如圖所示。數(shù)字推盤M(模型)V(視圖)C(控制器)數(shù)據(jù)模塊界面處理模塊游戲控制模塊生成推盤序列靜態(tài)界面繪制動態(tài)界面繪制接收輸入輸入處理終止初始化7.4自頂向下的設(shè)計頂層設(shè)計1.數(shù)據(jù)模塊數(shù)字推盤是一個存儲了“行×列”個元素的序列使用二級列表記錄推盤序列,以體現(xiàn)推盤中方塊間的關(guān)系二級列表中的每個元素也是列表,用于記錄推盤的一列數(shù)據(jù)推盤中的空格記錄為NonedefgetStartingBoaed(row,col)->initBoard7.4自頂向下的設(shè)計頂層設(shè)計2.界面處理模塊接收數(shù)據(jù)模塊返回的推盤序列繪制推盤分為靜態(tài)界面繪制和動態(tài)界面繪制兩部分defdrawStaticWin() ->SurfacedefdrawBoard(mainBoard,msg)推盤序列提示信息7.4自頂向下的設(shè)計頂層設(shè)計3.游戲控制模塊游戲控制模塊分為初始化、接收輸入、輸入處理和終止四個功能數(shù)字推盤游戲的初始化實際上是生成一個亂序推盤序列、開始一局新游戲接收輸入是返回用戶的操作輸入處理是根據(jù)用戶操作修改推盤序列、生成新的推盤和提示信息defgenerateNewPuzzle() ->mainBoarddefgetInput() ->userInputdefprocessing(userInput,mainBoard,msg)->mainBoard,msgdefcheckForQuit() ->None用戶輸入7.4自頂向下的設(shè)計頂層設(shè)計3.游戲控制模塊importpygamedefmain(): WINSET=darwStaticWin() initBoard=getStartingBoard() mainBoard=generateNewPuzzle() whileTrue: drawBoard(initBoard,msg) #動態(tài)界面繪制

pygame.display.update() checkForQuit() #判斷是否終止游戲

userInput=getInput(mainBoard) #獲取輸入

mainBoard,msg=processing(userInput,mainBoard,msg) #輸入處理7.4自頂向下的設(shè)計頂層設(shè)計main()函數(shù)主要應(yīng)具備的功能實現(xiàn)這些功能時應(yīng)重點關(guān)注的數(shù)據(jù)(參數(shù)和返回值)頂層設(shè)計一般設(shè)計如下內(nèi)容:7.4自頂向下的設(shè)計子層設(shè)計子層設(shè)計是對頂層中每一個模塊重復(fù)使用自頂向下設(shè)計方法,發(fā)現(xiàn)有用抽象的過程。1.數(shù)據(jù)模塊就getStartingBoard()函數(shù)而言,它根據(jù)設(shè)定的推盤規(guī)模生成推盤序列,此功能比較單一,無需再劃分子層,可直接實現(xiàn)。將行和列分別定義為全局變量ROW和COL將空格定義為全局常量BLANK(定義全局變量可方便對程序中該變量的全局修改;定義常量可提高程序的可讀性。后續(xù)內(nèi)容中會依此原則,將表示某種含義的數(shù)值定義為全局常量)。7.4自頂向下的設(shè)計子層設(shè)計2.界面處理模塊(1)靜態(tài)界面繪制創(chuàng)建窗口繪制游戲靜態(tài)部分界面(游戲按鈕)考慮到后續(xù)動態(tài)界面繪制部分也會使用到繪制文本的代碼,這里將文本對象的創(chuàng)建封裝成了一個函數(shù)——makeText(),該函數(shù):接收文本、文本顏色、底色繪制位置返回一個由Surface對象和Rect對象組成的元組7.4自頂向下的設(shè)計子層設(shè)計2.界面處理模塊(2)動態(tài)界面繪制頂層設(shè)計中通過drawBoard()函數(shù)調(diào)用動態(tài)界面繪制功能drawBoard函數(shù)在靜態(tài)界面的基礎(chǔ)上繪制界面的動態(tài)部分(提示信息和推盤)以上代碼在靜態(tài)界面STATICSURF的基礎(chǔ)上繪制了提示信息和推盤因為推盤由多個相似的方塊組成,所以函數(shù)中將繪制方塊的代碼封裝到了函數(shù)drawTile()中,該函數(shù)接收方塊在序列中的行、列和值,根據(jù)這些數(shù)據(jù)在窗口中繪制方塊為精簡代碼,此處將計算方塊距離窗口原點橫縱坐標距離的代碼封裝到了函數(shù)getLeftTopOfLeft()中。7.4自頂向下的設(shè)計子層設(shè)計2.界面處理模塊(2)動態(tài)界面繪制這里暫不考慮如何實現(xiàn)drawTile()函數(shù)和getLeftTopOfTile()函數(shù),但可知此時界面處理模塊的結(jié)構(gòu)應(yīng)如圖所示。7.4自頂向下的設(shè)計子層設(shè)計3.游戲控制模塊游戲控制模塊的子層分為:接收輸入初始化輸入處理退出生成一個亂序推盤序列接收用戶鼠標輸入1234方向處理功能處理退出游戲隨機移動數(shù)據(jù)的變動界面的更新處理用戶輸入7.4自頂向下的設(shè)計子層設(shè)計3.游戲控制模塊此時游戲控制模塊的結(jié)構(gòu)如圖所示。7.4自頂向下的設(shè)計第三層設(shè)計界面處理模塊未實現(xiàn)的功能函數(shù)有:用于創(chuàng)建字體Surface對象和Rect對象的函數(shù)makeText()用于繪制方塊的函數(shù)drawTile()用于計算方塊距離窗口頂部和左側(cè)位置的函數(shù)getLeftTopOfTile()1.界面處理模塊7.4自頂向下的設(shè)計(1)makeText()makeText()函數(shù)的功能為:接收與字體、顏色和位置相關(guān)的信息;返回字體的Surface對象和Rect對象。注意到以上代碼中創(chuàng)建的字體對象BASICFONT放在makeText()函數(shù)外,這是因為程序中諸多函數(shù)需要使用該對象,若該對象在函數(shù)中創(chuàng)建,其它函數(shù)在使用該對象時會產(chǎn)生錯誤。第三層設(shè)計——界面處理模塊7.4自頂向下的設(shè)計(2)drawTile()drawTile()函數(shù)的功能為:接收方塊的坐標和方塊上的文本;繪制方塊。第三層設(shè)計——界面處理模塊7.4自頂向下的設(shè)計(3)getLeftTopOfTile()getLeftTopOfTile()函數(shù)將推盤中的全部方塊視為整體,具體功能為:計算推盤距離窗口上、左邊緣的距離,以上述距離為基礎(chǔ),計算推盤中各個方塊在窗口中的位置。第三層設(shè)計——界面處理模塊7.4自頂向下的設(shè)計游戲控制模塊第三層設(shè)計未實現(xiàn)的功能函數(shù)如下:getRandomMove()。用于隨機獲取本次移動方向。slideAnimation()。用于實現(xiàn)將一個方塊從一個位置移動到空格位置的動畫。makeMove()。用于更新空格和被移動方塊在序列中的位置。getSpotClicked()。獲取被點擊方塊在序列中的行號和列號。terminate()。釋放資源并退出游戲。第三層設(shè)計——游戲控制模塊7.4自頂向下的設(shè)計方塊的移動方向分為UP、DOWN、LEFT、RIGHT四種,但在一些情況下,向某些方向的移動會被判定為無效移動,具體情況如下:空格在第一行時,DOWN為無效移動??崭裨诘谝涣袝r,RIGHT為無效移動??崭裨谧詈笠恍袝r,UP為無效移動??崭裨谧詈笠涣袝r,LEFT為無效移動。(1)getRandomMove()根據(jù)以上分析,方向集合中的元素與移動是否有效相關(guān),此處假設(shè)isValidMove()函數(shù)用于實現(xiàn)判斷功能,且規(guī)定移動時不可撤銷上一次操作。第三層設(shè)計——游戲控制模塊7.4自頂向下的設(shè)計sli

溫馨提示

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

最新文檔

評論

0/150

提交評論