Python程序設(shè)計基礎(chǔ)項目化教程 實訓指導書 30綜合案例-制作2048小游戲_第1頁
Python程序設(shè)計基礎(chǔ)項目化教程 實訓指導書 30綜合案例-制作2048小游戲_第2頁
Python程序設(shè)計基礎(chǔ)項目化教程 實訓指導書 30綜合案例-制作2048小游戲_第3頁
Python程序設(shè)計基礎(chǔ)項目化教程 實訓指導書 30綜合案例-制作2048小游戲_第4頁
Python程序設(shè)計基礎(chǔ)項目化教程 實訓指導書 30綜合案例-制作2048小游戲_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《Python語言程序設(shè)計》實訓指導書制作2048小游戲任務(wù)背景:Python是一種計算機程序設(shè)計語言。對于初學者和完成普通任務(wù),Python語言是非常簡單易用的。Python可以幫助我們做日常任務(wù),可以做網(wǎng)站,例如YouTube就是Python寫的;可以做網(wǎng)絡(luò)游戲的后臺,很多在線游戲的后臺都是Python開發(fā)的。任務(wù)需求:綜合學習利用Python相關(guān)知識、技巧,制作2048小游戲任務(wù)分析:任務(wù)步驟:1.借用Pycharm工具,建立Python3項目2.設(shè)置游戲相關(guān)參數(shù)等全局變量3.定義游戲的合并規(guī)則UpdateNew類、操作方法類、初始化方法GameInit類4.定義游戲的主行為程序任務(wù)結(jié)果:做一個可以通過上下左右控制的2048小游戲任務(wù)實施過程:1 制作2048小游戲?qū)嶒災康?)制作2048小游戲2)綜合學習利用Python相關(guān)知識、技巧實驗環(huán)境OracleLinux7.4Python3.6.5Pycharm2017.2實驗步驟1)打開IDE,配置解釋器(如已完成解釋器配置,可跳過解釋器配置步驟)點擊桌面pycharm圖標打開IDE在打開的窗口中選擇Configure選項,接著在彈出的下拉菜單中選擇Settings打開首選項菜單首選項菜單中選擇左側(cè)的ProjectInterpreter,在右側(cè)下拉菜單中選擇3.6.5版本解釋器,并依次點擊Apply與OK確認設(shè)置2)新建Project(如已完成工程創(chuàng)建,可跳過此步驟)點擊CreateNewProject新建工程在Location文本框中補充輸入project,表示將/root/PycharmProjects/project作為新工程目錄,并點擊create完成創(chuàng)建3)新建python源代碼文件鼠標右鍵單擊project工程,在菜單中選擇New->PythonFile創(chuàng)建.py文件在彈出窗口的Name文本框中輸入.py文件的文件名,本次實驗推薦文件名為“getter、setter、deleter“。接著點擊OK按鈕完成python源文件的創(chuàng)建。創(chuàng)建成功后,會默認在右側(cè)編輯區(qū)域打開該文件4)編寫實驗代碼1.加載python庫,定義游戲相關(guān)的全局變量[Code001]:#_*_coding:UTF-8_*_importnumpy,sys,random,pygamefrompygame.localsimport*Size=4#4*4行列Block_WH=110#每個塊的長度寬度BLock_Space=10#兩個塊之間的間隙Block_Size=Block_WH*Size+(Size+1)*BLock_SpaceMatrix=numpy.zeros([Size,Size])#初始化矩陣4*4的0矩陣Screen_Size=(Block_Size,Block_Size+110)Title_Rect=pygame.Rect(0,0,Block_Size,110)#設(shè)置標題矩形的大小Score=0#數(shù)塊顏色Block_Color={0:(150,150,150),2:(255,255,255),4:(255,255,128),8:(255,255,0),16:(255,220,128),32:(255,220,0),64:(255,190,0),128:(255,160,0),256:(255,130,0),512:(255,100,0),1024:(255,70,0),2048:(255,40,0),4096:(255,10,0),}2.定義基礎(chǔ)類包含matrix,score,zerolist3個屬性。提供一個操控矩陣的方法,toSequence(matrix),以及游戲的合并策略[Code002]:classUpdateNew(object):"""docstringforUpdateNew"""def__init__(self,matrix):super(UpdateNew,self).__init__()self.matrix=matrixself.score=0self.zerolist=[]#保存的為一個個元組,用于存放矩陣中0元素的位置坐標#合并相同的數(shù)字defcombineList(self,rowlist):start_num=0end_num=Size-rowlist.count(0)-1whilestart_num<end_num:ifrowlist[start_num]==rowlist[start_num+1]:rowlist[start_num]*=2self.score+=int(rowlist[start_num])#每次返回累加的分數(shù)rowlist[start_num+1:]=rowlist[start_num+2:]rowlist.append(0)start_num+=1returnrowlist#刪除列表前面和中間的0,返回合并后的列表defremoveZero(self,rowlist):whileTrue:mid=rowlist[:]#拷貝一份listtry:rowlist.remove(0)#remove,刪除列表中第一個匹配項rowlist.append(0)#append,在列表末尾添加元素except:#如果沒有0,拋出異常passifrowlist==mid:break;returnbineList(rowlist)#去除矩陣中每一行前面與中間的0元素,獲得矩陣中0元素位置#合并元素后返回添加一個2或4元素后的矩陣deftoSequence(self,matrix):lastmatrix=matrix.copy()m,n=matrix.shape#獲得矩陣的行,列#對于m行,去除前面和中間的0后合并foriinrange(m):newList=self.removeZero(list(matrix[i]))matrix[i]=newList#添加所有0元素的行列號forkinrange(Size-1,Size-newList.count(0)-1,-1):#添加所有有0的行號列號self.zerolist.append((i,k))#矩陣中有最小值0且移動后的矩陣不同,才可以添加0位置處添加隨機數(shù)ifmatrix.min()==0and(matrix!=lastmatrix).any():GameInit.initData(matrix,self.zerolist)returnmatrix3.定義上下左右四個操作動作類[Code003]:#左移,繼承基礎(chǔ)類的屬性和方法,提供一種處理數(shù)據(jù)的方法,handleData()classLeftAction(UpdateNew):#繼承自父類的屬性進行初始化。而且是用父類的初始化方法來初始化繼承的屬性。def__init__(self,matrix):super(LeftAction,self).__init__(matrix)defhandleData(self):matrix=self.matrix.copy()#獲得一份矩陣的復制newmatrix=self.toSequence(matrix)returnnewmatrix,self.score#右移,同左移+翻轉(zhuǎn)classRightAction(UpdateNew):def__init__(self,matrix):super(RightAction,self).__init__(matrix)defhandleData(self):matrix=self.matrix.copy()[:,::-1]#翻轉(zhuǎn)newmatrix=self.toSequence(matrix)returnnewmatrix[:,::-1],self.score#上移,同左移+轉(zhuǎn)置classUpAction(UpdateNew):def__init__(self,matrix):super(UpAction,self).__init__(matrix)defhandleData(self):matrix=self.matrix.copy().T#轉(zhuǎn)置newmatrix=self.toSequence(matrix)returnnewmatrix.T,self.score#下移,同左移+翻轉(zhuǎn)+轉(zhuǎn)置classDownAction(UpdateNew):def__init__(self,matrix):super(DownAction,self).__init__(matrix)defhandleData(self):matrix=self.matrix.copy()[::-1].T#翻轉(zhuǎn)+轉(zhuǎn)置newmatrix=self.toSequence(matrix)returnnewmatrix.T[::-1],self.score4.定義游戲初始化類,包括游戲界面、數(shù)字出現(xiàn)的隨機位置等[Code004]:#游戲初始化類classGameInit(object):"""docstringforGameInit"""def__init__(self):super(GameInit,self).__init__()@staticmethod#獲得隨機位置坐標defgetRandomLocal(zerolist=None):ifzerolist==None:a=random.randint(0,Size-1)b=random.randint(0,Size-1)else:a,b=random.sample(zerolist,1)[0]returna,b@staticmethod#隨機返回2或者4defgetNewNum():#隨機返回2或者4n=random.random()ifn>0.8:n=4else:n=2returnn@classmethod#將合并后的數(shù)據(jù)在空白地方增加2或4definitData(cls,matrix=None,zerolist=None):ifmatrixisNone:matrix=Matrix.copy()a,b=cls.getRandomLocal(zerolist)#zerolist空任意返回(x,y)位置,否則返回任意一個0元素位置n=cls.getNewNum()matrix[a][b]=nreturnmatrix#返回初始化任意位置為2或者4的矩陣@classmethod#繪制游戲界面,第一個參數(shù)是屏幕,第二個參數(shù)顏色#第三個參數(shù)rect大小,第四個默認參數(shù)defdrawSurface(cls,screen,matrix,score):#設(shè)置游戲界面的顏色字體pygame.draw.rect(screen,(255,255,255),Title_Rect)font1=pygame.font.SysFont('simsun',48)font2=pygame.font.SysFont(None,32)#font.render第一個參數(shù)是文本內(nèi)容,第二個參數(shù)是否抗鋸齒,第三個參數(shù)字體顏色screen.blit(font1.render('Score:',True,(255,127,0)),(20,25))screen.blit(font1.render('%s'%score,True,(255,127,0)),(170,25))screen.blit(font2.render('up',True,(255,127,0)),(360,20))screen.blit(font2.render('leftdownright',True,(255,127,0)),(300,50))a,b=matrix.shape#按照行列畫方塊foriinrange(a):forjinrange(b):cls.drawBlock(screen,i,j,Block_Color[matrix[i][j]],matrix[i][j])@staticmethod#繪制方塊defdrawBlock(screen,row,column,color,blocknum):font=pygame.font.SysFont('stxingkai',80)#方塊起始坐標w=column*Block_WH+(column+1)*BLock_Spaceh=row*Block_WH+(row+1)*BLock_Space+110pygame.draw.rect(screen,color,(w,h,110,110))ifblocknum!=0:#如果方塊中有數(shù)字,數(shù)字居中fw,fh=font.size(str(int(blocknum)))#獲得數(shù)字的長度和寬度screen.blit(font.render(str(int(blocknum)),True,(0,0,0)),(w+(110-fw)/2,h+(110-fh)/2))@staticmethod#將鍵盤方向鍵與函數(shù)對應(yīng)defkeyDownPressed(keyvalue,matrix):ifkeyvalue==K_LEFT:returnLeftAction(matrix)elifkeyvalue==K_RIGHT:returnRightAction(matrix)elifkeyvalue==K_UP:returnUpAction(matrix)elifkeyvalue==K_DOWN:returnDownAction(matrix)@staticmethod#判斷傳入的矩陣,游戲是否結(jié)束#如果有一行存在相鄰兩個數(shù)相同,則游戲沒有結(jié)束defgameOver(matrix):testmatrix=matrix.copy()a,b=testmatrix.shapeforiinrange(a):forjinrange(b-1):iftestmatrix[i][j]==testmatrix[i][j+1]:#如果每行存在相鄰兩個數(shù)相同,則游戲沒有結(jié)束print('游戲沒有結(jié)束')returnFalseforiinrange(b):forjinrange(a-1):iftestmatrix[j][i]==testmatrix[j+1][i]:print('游戲沒有結(jié)束')returnFalseprint('游戲結(jié)束')returnTrue5.定義游戲的主要動作事件[Code005]:defmain():pygame.init()#初始化pygame庫screen=pygame.display.set_mode(Screen_Size,0,32)#屏幕設(shè)置matrix=GameInit.initData()#更新矩陣的值currentscore=0#分數(shù)GameIn

溫馨提示

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

最新文檔

評論

0/150

提交評論