《硬件趣學(xué)Python編程》 2048游戲_第1頁
《硬件趣學(xué)Python編程》 2048游戲_第2頁
《硬件趣學(xué)Python編程》 2048游戲_第3頁
《硬件趣學(xué)Python編程》 2048游戲_第4頁
《硬件趣學(xué)Python編程》 2048游戲_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

+硬件趣學(xué)Python編程

數(shù)字游戲通通過,2048的游戲制作牛艾科技目錄ContentsSuccessWords2第二部分全局變量和局部變量第三部分模塊的導(dǎo)入第四部分游戲基本設(shè)計思路第五部分2048的代碼分析第一部分認(rèn)識函數(shù)目錄ContentsSuccessWords3第一部分認(rèn)識函數(shù)4認(rèn)識函數(shù)函數(shù)是一段具有特定功能的、可重用的語句組,用函數(shù)名來表示并通過函數(shù)名完成功能調(diào)用。函數(shù)也可以看作一段具有名字的子程序,可以在需要的地方調(diào)用執(zhí)行,不需要在每個執(zhí)行地方重復(fù)編寫這些語句。每次使用函數(shù)可以提供不同的參數(shù)作為輸入,以實現(xiàn)對不同數(shù)據(jù)的處理;函數(shù)執(zhí)行后,還可以反饋相應(yīng)的結(jié)果。函數(shù)能夠完成特定功能,與黑盒類似,對函數(shù)的使用不需要了解函數(shù)內(nèi)部實現(xiàn)原理,只要了解函數(shù)的輸入輸出方式即可。嚴(yán)格說,函數(shù)是一種功能抽象。

5認(rèn)識函數(shù)使用函數(shù)主要有兩個目的:降低編程難度和代碼重用。函數(shù)是一種功能抽象,利用它可以將一個復(fù)雜的大問題分解成一系列簡單的小問題,然后將小問題繼續(xù)劃分成更小的問題,當(dāng)問題細(xì)化為足夠簡單時,就可以分而治之函數(shù)可以在一個程序中多個位置使用,也可以用于多個程序,當(dāng)需要修改代碼時,只需要在函數(shù)中修改一次,所有調(diào)用位置的功能都更新了,這種代碼重用降低了代碼行數(shù)和代碼維護(hù)難度。

Python定義一個函數(shù)使用def保留字語法形式如下:def<函數(shù)名>(<參數(shù)列表>):<函數(shù)體>return<返回值列表>

6認(rèn)識函數(shù)函數(shù)調(diào)用和執(zhí)行的一般形式是:

<函數(shù)名>(<參數(shù)列表>)此時,參數(shù)列表中給出要傳進(jìn)入函數(shù)內(nèi)部的參數(shù),這類參數(shù)稱為實際參數(shù),簡稱為“實參”。

7認(rèn)識函數(shù)程序調(diào)用一個函數(shù)需要執(zhí)行以下四個步驟:(1)調(diào)用程序在調(diào)用處暫停執(zhí)行;(2)在調(diào)用時將實參復(fù)制給函數(shù)的形參;(3)執(zhí)行函數(shù)體語句;(4)函數(shù)調(diào)用結(jié)束給出返回值,程序回到調(diào)用前的暫停處繼續(xù)執(zhí)行。8認(rèn)識函數(shù)在定義函數(shù)時,如果有些參數(shù)存在默認(rèn)值,即部分參數(shù)不一定需要調(diào)用程序輸入,可以在定義函數(shù)時直接為這些參數(shù)指定默認(rèn)值。當(dāng)函數(shù)被調(diào)用時,如果沒有傳入對應(yīng)的參數(shù)值,則使用函數(shù)定義時的默認(rèn)值替代,例如:9認(rèn)識函數(shù)在函數(shù)定義時,也可以設(shè)計可變數(shù)量參數(shù),通過參數(shù)前增加星號(*)實現(xiàn)。帶有星號的可變參數(shù)只能出現(xiàn)在參數(shù)列表的最后。調(diào)用時,這些參數(shù)被當(dāng)作元組類型傳遞到函數(shù)中,實例如下:vfunc()函數(shù)定義了可變參數(shù)b,調(diào)用vfunc()函數(shù)時輸入的(2,3,4,5)被當(dāng)作元組傳遞給b,與a累加后輸出。第6.1節(jié)將詳細(xì)介紹元組類型,這里請讀者將元組理解為一組元素。10認(rèn)識函數(shù)Python提供了按照形參名稱輸入實參的方式,函數(shù)調(diào)用如下:

result=func(x2=4,y2=5,z2=6,x1=1,y1=2,z1=3)由于調(diào)用函數(shù)時指定了參數(shù)名稱,所以參數(shù)之間的順序可以任意調(diào)整。return語句用來退出函數(shù)并將程序返回到函數(shù)被調(diào)用的位置繼續(xù)執(zhí)行。return語句同時可以將0個、1個或多個函數(shù)運(yùn)算完的結(jié)果返回給函數(shù)被調(diào)用處的變量,例如。目錄ContentsSuccessWords11第二部分全局變量和局部變量12全局變量和局部變量一個程序中的變量包括兩類:全局變量和局部變量。全局變量指在函數(shù)之外定義的變量,一般沒有縮進(jìn),在程序執(zhí)行全過程有效。局部變量指在函數(shù)內(nèi)部使用的變量,僅在函數(shù)內(nèi)部有效,當(dāng)函數(shù)退出時變量將不存在。例子如下。13全局變量和局部變量這個例子說明,當(dāng)函數(shù)執(zhí)行完退出后,其內(nèi)部變量將被釋放。如果函數(shù)內(nèi)部使用了全局變量呢?例子如下如果希望讓func()函數(shù)將n當(dāng)作全局變量,需要在變量n使用前顯式聲明該變量為全局變量,代碼如下14全局變量和局部變量簡單數(shù)據(jù)類型變量無論是否與全局變量重名,僅在函數(shù)內(nèi)部創(chuàng)建和使用,函數(shù)退出后變量被釋放,如有全局同名變量,其值不變;簡單數(shù)據(jù)類型變量在用global保留字聲明后,作為全局變量使用,函數(shù)退出后該變量保留且值被函數(shù)改變;目錄ContentsSuccessWords15第三部分模塊的導(dǎo)入16模塊的導(dǎo)入模塊是Python中的最高級別組織單元,它將程序代碼和數(shù)據(jù)封裝起來以便重用Python源代碼文件:*.py一個py文件是一個模塊(module)多個模塊可以組成一個包(package)模塊1函數(shù)類模塊2函數(shù)類包17模塊的導(dǎo)入導(dǎo)入從本質(zhì)上講,就是在一個文件中載入另一個文件,并且能夠讀取那個文件的內(nèi)容。一個模塊內(nèi)的內(nèi)容通過這樣的方法其屬性(object,attribute)能夠被外界使用模塊的方式非常簡單,在"import"后加上"模塊名稱"就可以了。通過這一句,計算機(jī)就在指定的位置找到了"numpy.py"文件,并準(zhǔn)備好該文件擁有的之后會用到的函數(shù)和屬性。在導(dǎo)入"numpy"后,我們就可以通過點符號"."連接模塊名稱和函數(shù)名,使用該模塊中的函數(shù)和屬性。18模塊的導(dǎo)入指定的方式是采用"import模塊名稱as別名"。我們可以將"numpy"簡記為"np",并且在調(diào)用時,直接使用"np"就可以:目錄ContentsSuccessWords19第四部分游戲基本設(shè)計思路20游戲基本設(shè)計思路畫背景棋盤

2048的棋盤是一個4*4的網(wǎng)格,網(wǎng)格內(nèi)放置數(shù)字,下面應(yīng)該有一個記分統(tǒng)計。

20200160000320000128游戲得分:18021游戲基本設(shè)計思路數(shù)字矩陣-右移202001681603232000012800040168160006400012822游戲基本設(shè)計思路數(shù)字矩陣-左移202001681603232000012840001681606400012800023游戲基本設(shè)計思路數(shù)字矩陣-上移21620016320003200001282322128006400000000024游戲基本設(shè)計思路數(shù)字矩陣-下移21620016320003200001280000000000202326412825游戲基本設(shè)計思路隨機(jī)產(chǎn)生數(shù)字2和4

在移動的同時在值為0的位置上隨機(jī)的產(chǎn)生數(shù)字2和數(shù)字4例如:下移的同時隨機(jī)產(chǎn)生2和421620016320003200001280020400000202326412826游戲基本設(shè)計思路勝利條件(可選)1、當(dāng)出現(xiàn)2048這個數(shù)字時游戲勝利并結(jié)束

2、沒有勝利終止條件,只看成績分值失敗條件

棋盤填滿數(shù)字,無法再進(jìn)行變換,也就是變換之后的矩陣和變換前的相同,則游戲結(jié)束目錄ContentsSuccessWords27第五部分2048代碼分析28貪吃蛇的代碼分析畫背景網(wǎng)格

主要使用方法:

1、渲染背景顏色display.fill(color)#參數(shù)為背景顏色

2、畫矩形邊框display.fill_cell(x,y,w,h,color))

#x:左上角頂點橫坐標(biāo),y:左上角頂點縱坐標(biāo),w:寬度,h:高度,color:顏色

3、輸出文本display.text(text,x,y,colorf,colorb)

#text:文本,x:左上角頂點橫坐標(biāo),y:左上角頂點縱坐標(biāo),colorf:前景顏色,colorb:背景顏色29貪吃蛇的代碼分析畫背景網(wǎng)格def__init__(self,x=10,y=10,w=222,h=222):self.x=xself.y=yself.w=wself.h=hself.width=w//55-1self.height=h//55-1self.bg=color565(0x00,0x00,0x00)display.fill(self.bg)self.initial()初始化參數(shù)初始背景顏色渲染背景顏色調(diào)用函數(shù)渲染每個網(wǎng)格30貪吃蛇的代碼分析畫背景網(wǎng)格definitial(self):foriinrange(0,4):forjinrange(0,4):x=i*55+self.x+1y=j*55+self.y+1display.fill_cell(x,y,55,55,color565(0xff,0xff,0xff))雙重循環(huán)渲染4*4的網(wǎng)格defdraw(self,pos,color,text):x=pos[0]*55+self.x+20y=pos[1]*55+self.y+20display.fill_rectangle(x,y,30,30,color565(0x00,0x00,0x00))display.text(text,x,y,color,color565(0x00,0x00,0x00))將網(wǎng)格坐標(biāo)轉(zhuǎn)換為實際坐標(biāo)31貪吃蛇的代碼分析畫背景網(wǎng)格defprintscore(self,text,score):display.text(text,50,250,color565(0xff,0x00,0x00),color565(0x00,0x00,0x00))display.text(str(score),150,255,color565(0xff,0x00,0x00),color565(0x00,0x00,0x00))輸出網(wǎng)格下面的文字,在(50,250)輸出文字在(150,255)輸出成績32貪吃蛇的代碼分析數(shù)字矩陣類class

Matrix(object):def__init__(self,grid):self.grid=gridself.matrix=[[0foriinrange(4)]foriinrange(4)]self.matrix_o=[[0foriinrange(4)]foriinrange(4)]self.vacancy=[]self.gamewin=False#使用一個字典將數(shù)字與其對應(yīng)的顏色存放起來self.color={0:color565(0xff,0xff,0xff),2:color565(0x00,0x00,0xff),4:color565(0x00,0xff,0x00),8:color565(0xff,0x00,0x00),16:color565(0xff,0xff,0x00),32:color565(0xff,0x00,0xff),64:color565(0x00,0xff,0xff),128:color565(0xff,0x00,0x00),256:color565(0xff,0x00,0x00),512:color565(0xff,0x00,0x00),1024:color565(0xff,0x00,0x00),2048:color565(0xff,0x00,0x00)}聲明了兩列表,matrix表示當(dāng)前的矩陣,matrix_o表示變換前的矩陣vacancy列表用來存值為0的點color元祖用來存各種數(shù)字對應(yīng)的顏色33貪吃蛇的代碼分析數(shù)字矩陣類defvoid(self):self.vacancy=[]forxinrange(0,4):foryinrange(0,4):ifself.matrix[x][y]==0:self.vacancy.append((x,y))returnlen(self.vacancy)defgenerate(self):pos=choice(self.vacancy)ifrandint(0,5)==4:self.matrix[pos[0]][pos[1]]=4else:self.matrix[pos[0]][pos[1]]=2delself.vacancy[self.vacancy.index((pos[0],pos[1]))]雙重循環(huán)遍歷矩陣,當(dāng)發(fā)現(xiàn)值為0的點時將坐標(biāo)加到vacancy列表中vacancy列表刪除新生成的點的坐標(biāo)在vacancy列表中取隨機(jī)的點,并根據(jù)隨機(jī)數(shù)的值來判斷生成的是2還是434貪吃蛇的代碼分析矩陣上移defup(self):ss=0foriinrange(0,4):forjinrange(0,3):s=0ifnotself.matrix[i][j]==0:forkinrange(j+1,4):ifnotself.matrix[i][k]==0:ifself.matrix[i][j]==self.matrix[i][k]:ss=ss+self.matrix[i][k]self.matrix[i][j]=self.matrix[i][j]*2ifself.matrix[i][j]==2048:self.gamewin=Trueself.matrix[i][k]=0s=1breakelse:breakifs==1:breakforiinrange(0,4):s=0forjinrange(0,3):ifself.matrix[i][j-s]==0:self.matrix[i].pop(j-s)self.matrix[i].append(0)s=s+1returnss循環(huán)遍歷所有的點,s為判斷標(biāo)志重新調(diào)整將,將矩陣上移,并將值為0的點刪除,在尾部添加補(bǔ)全發(fā)現(xiàn)某個位置的值不為0時,循環(huán)遍歷這列當(dāng)前節(jié)點之下的所有位置當(dāng)發(fā)現(xiàn)臨近的點的值和當(dāng)前的值相等時則翻倍當(dāng)?shù)竭_(dá)2048時則結(jié)束游戲35貪吃蛇的代碼分析矩陣上移2322000640000000012823221280064000000000循環(huán)遍歷非零值遇到相同的累加不同的非零值則結(jié)束這一列的遍歷最后調(diào)整整個矩陣,將值全部上移后面的補(bǔ)036貪吃蛇的代碼分析矩陣左移defleft(self):ss=0foriinrange(0,4):forjinrange(0,3):s=0ifnotself.matrix[j][i]==0:forkinrange(j+1,4):ifnotself.matrix[k][i]==0:ifself.matrix[j][i]==self.matrix[k][i]:ss=ss+self.matrix[k][i]self.matrix[j][i]=self.matrix[j][i]*2ifself.matrix[j][i]==2048:self.gamewin=Trueself.matrix[k][i]=0s=1breakelse:breakifs==1:breakforiinrange(0,4):s=0forjinrange(0,3):ifself.matrix[j-s][i]==0:forkinrange(j-s,3):self.matrix[k][i]=self.matrix[k+1][i]self.matrix[3][i]=0s=s+1returnss循環(huán)遍歷所有的點,s為判斷標(biāo)志重新調(diào)整將,將矩陣左移,并將值為0的點刪除,在尾部添加補(bǔ)全發(fā)現(xiàn)某個位置的值不為0時,循環(huán)遍歷這行當(dāng)前節(jié)點右邊的所有位置當(dāng)發(fā)現(xiàn)非零值和當(dāng)前的值相等時則翻倍,發(fā)現(xiàn)不相等的非零值則結(jié)束循環(huán)當(dāng)?shù)竭_(dá)2048時則結(jié)束游戲37貪吃蛇的代碼分析下移和右移代碼與上面相似游戲控制defkey_release(self,key):keymatch=["Down","Left","Up","Right"]ifkeymatch[key]=="Up":ss=self.matrix.up()self.run(ss)elifkeymatch[key]=="Down":ss=self.matrix.down()self.run(ss)elifkeymatch[key]=="Left":ss=self.matrix.left()self.run(ss)elifkeymatch[key]=="Right":ss=self.matrix.right()self.run(ss)defrun(self,ss):ifnotself.matrix.matrix==self.matrix.matrix_o:self.score=self.score+int(ss)self.grid.printscore("成績?yōu)椋?,self.score)i

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論