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

下載本文檔

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

文檔簡(jiǎn)介

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

自頂向下的設(shè)計(jì)4模塊整合7.1數(shù)字推盤游戲簡(jiǎn)介數(shù)字推盤游戲簡(jiǎn)介數(shù)字推盤是一種益智游戲:載體是內(nèi)嵌了n×n個(gè)方塊的凹槽板;凹槽中的方塊均刻有或?qū)懹?~n×n之內(nèi)的不同數(shù)字。7.1數(shù)字推盤游戲簡(jiǎn)介數(shù)字推盤游戲程序界面(a)初始化游戲(b)初始化完成(c)移動(dòng)計(jì)數(shù)(d)完成游戲7.1數(shù)字推盤游戲簡(jiǎn)介數(shù)字推盤游戲規(guī)則開始移動(dòng)步數(shù)功能結(jié)束退出窗口初始化游戲初始化鍵盤鼠標(biāo)重置新游戲自動(dòng)ESC單擊關(guān)閉按鈕7.2游戲模塊-pygamepygame簡(jiǎn)介pygame是為開發(fā)2D游戲而設(shè)計(jì)的Python跨平臺(tái)模塊。開發(fā)人員利用pygame模塊中定義的接口,可以方便快捷地實(shí)現(xiàn)游戲中的一些功能,如:圖形用戶界面創(chuàng)建圖形和圖像的繪制用戶鍵盤和鼠標(biāo)操作的監(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ù)中實(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è)置窗口標(biāo)題update()更新屏幕顯示內(nèi)容7.2游戲模塊-pygame初始化游戲窗口set_mode()函數(shù)聲明如下:set_mode(resolution=(0,0),flags=0,depth=0)->Surfaceresolution:圖形窗口的分辨率。本質(zhì)上是一個(gè)元組(寬,高),單位為像素。默認(rèn)與屏幕大小一致。flags:標(biāo)志位。用于設(shè)置窗口特性,默認(rèn)為0。depth:色深。該參數(shù)只取整數(shù),范圍為[8,32]。參數(shù)含義:返回值含義:返回值為Surface對(duì)象??梢詫urface對(duì)象看作畫布,必須先有畫布,繪制的圖形才能夠被呈現(xiàn)。7.2游戲模塊-pygameset_mode()函數(shù)創(chuàng)建的窗口默認(rèn)為黑色背景,使用Surface對(duì)象的fill()方法可以填充畫布,修改窗口顏色。示例:創(chuàng)建一個(gè)窗體,并修改其背景顏色。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è)置窗口標(biāo)題set_caption()函數(shù)聲明如下:set_caption(title,icontitle=None) ->Nonetitle:用于設(shè)置顯示在窗口標(biāo)題欄上的標(biāo)題。icontitle:用于設(shè)置顯示在任務(wù)欄上的程序標(biāo)題,默認(rèn)與title一致。參數(shù)含義:示例:修改程序7_pg_test.py中的代碼,在其中調(diào)用set_caption()函數(shù)設(shè)置窗口標(biāo)題。pygame.display.set_caption('數(shù)字推盤') 7.2游戲模塊-pygame刷新窗口實(shí)際上前面代碼中使用fill()方法填充背景后背景顏色卻未改變,正是因?yàn)槌绦蛑形凑{(diào)用該函數(shù)對(duì)窗口進(jìn)行刷新。示例:在pygame.quit()語(yǔ)句之前調(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)游戲啟動(dòng)后一般由玩家手動(dòng)關(guān)閉。若要使游戲保持運(yùn)行,需要在程序中添加一個(gè)無(wú)限循環(huán)。示例:whileTrue: pass7.2游戲模塊-pygame游戲時(shí)鐘游戲時(shí)鐘用于控制幀率,利用視覺暫留現(xiàn)象形成動(dòng)畫。幀率>60幀/s,就能實(shí)現(xiàn)連續(xù)、高品質(zhì)動(dòng)畫效果。游戲時(shí)鐘用于解決幀率過高的問題。Clock類與tick()方法通過Clock類的tick()方法可以方便地設(shè)置游戲循環(huán)的執(zhí)行頻率,具體操作如下:FPSCLOCK=pygame.time.Clock() #創(chuàng)建Clock對(duì)象FPSCLOCK.tick(FPS) #為Clock對(duì)象設(shè)置幀率示例:修改程序7_pg_test.py中的代碼,為其添加幀率控制語(yǔ)句。7.2游戲模塊-pygame圖形化窗口是繪制文本和圖形的前提,創(chuàng)建窗口之后方可在其中繪制文本、圖形等元素。通過前面的講解可知,pygame中的圖形窗口是一個(gè)Surface對(duì)象,在窗口中進(jìn)行繪制實(shí)質(zhì)上就是在Surface對(duì)象之上進(jìn)行繪制。圖形和文本繪制圖形繪制加載圖片繪制圖片7.2游戲模塊-pygame加載圖片即將圖片讀取到程序中。通過pygame中image類的load()方法可以向程序中加載圖片,生成Surface對(duì)象。1.加載圖片load()方法參數(shù)filename。被加載的文件名。返回值Surface。load()方法返回一個(gè)Surface對(duì)象。load(filename)->Surface方法說明:示例:使用load()方法加載名為“bg.jpg”的圖片。7.2游戲模塊-pygame繪制圖像即將一個(gè)Surface對(duì)象疊加在另一個(gè)Surface對(duì)象之上。通過Surface對(duì)象的blit()方法可以實(shí)現(xiàn)圖像繪制。2.繪制圖片blit()方法source。接收被繪制的Surface對(duì)象。dest。接收一個(gè)表示位置的元組(left,top),或接收一個(gè)表示矩形的元組(left,top,width,height),將矩形的位置作為繪制的位置。area。是一個(gè)可選參數(shù),通過該參數(shù)可設(shè)置矩形區(qū)域。若設(shè)置的矩形區(qū)域小于source所設(shè)置Surface對(duì)象的區(qū)域,那么僅繪制Surface對(duì)象的部分內(nèi)容。special_flags。標(biāo)志位。blit(source,dest,area=None,special_flags=0)->Rect參數(shù)說明:7.2游戲模塊-pygame示例:使用blit()方法將加載生成的imgSurf對(duì)象繪制到窗口WINSET中。2.繪制圖片7.2游戲模塊-pygame文本繪制創(chuàng)建字體對(duì)象渲染文本內(nèi)容,生成一張圖像將生成的圖像繪制到游戲主窗口中文本繪制實(shí)際上也是圖片的疊加,只是在繪制之前需要先結(jié)合字體,將文本內(nèi)容制作成圖片。7.2游戲模塊-pygame1.創(chuàng)建字體對(duì)象調(diào)用font模塊的Font()函數(shù)可以創(chuàng)建一個(gè)字體對(duì)象,F(xiàn)ont()函數(shù)的聲明如下:Font(filename,size)->Fontfilename。用于設(shè)置字體對(duì)象的字體。size。用于設(shè)置字體對(duì)象的大小。參數(shù)說明:示例:BASICFONT=pygame.font.Font('STKAITI.TTF',25)Font()函數(shù)7.2游戲模塊-pygame1.創(chuàng)建字體對(duì)象調(diào)用font模塊的SysFont()函數(shù)可以創(chuàng)建一個(gè)字體對(duì)象,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è)置為粗體,默認(rèn)為否。italic:是否設(shè)置為斜體,默認(rèn)為否。參數(shù)說明:SysFont()函數(shù)7.2游戲模塊-pygame1.創(chuàng)建字體對(duì)象SysFont()對(duì)系統(tǒng)依賴度較高,F(xiàn)ont()則可以在設(shè)置字體時(shí)將字體文件存儲(chǔ)到程序路徑中,使用自定義的字體。Font()函數(shù)更加靈活,也更利于游戲程序的打包和移植。Font和SysFont()函數(shù)的區(qū)別7.2游戲模塊-pygame2.渲染文本內(nèi)容pygame模塊中可通過字體對(duì)象的render()方法進(jìn)行渲染,該方法的聲明如下:render(text,antialias,color,background=None)->Surfacetext參數(shù):文字內(nèi)容。antialias參數(shù):是否抗鋸齒(抗鋸齒效果會(huì)讓繪制的文字看起來(lái)更加平滑)。color參數(shù):文字顏色。background參數(shù):背景顏色,默認(rèn)為None,表示無(wú)顏色。參數(shù)說明:示例:以調(diào)用Font()函數(shù)生成的字體對(duì)象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對(duì)象作為圖片存儲(chǔ)到本地,save()方法的語(yǔ)法格式如下:示例:使用save()方法將msgSurf對(duì)象保存到本地,并命名為msg.png。save()方法save(Surface,filename)->None設(shè)置透明背景通過image類的save()方法可以將渲染生成的Surface對(duì)象作為圖片存儲(chǔ)到本地,save()方法的語(yǔ)法格式如下:msgSurf=BASICFONT.render('初始化...',True,MSGCOLOR,None)pygame.image.save(msgSurf,'msg.png')7.2游戲模塊-pygame3.繪制渲染結(jié)果示例:將創(chuàng)建的文本對(duì)象msgSurf繪制到WINSET的(0,0)位置。7.2游戲模塊-pygame元素位置控制要點(diǎn)pygame圖形窗口的坐標(biāo)體系pygame的Rect類位置控制1.

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

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

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

userInput=getInput(mainBoard) #獲取輸入

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論