当前位置:文档之家› Python-俄罗斯方块游戏

Python-俄罗斯方块游戏

【Python】用Python实现一个俄罗斯方块游戏俄罗斯方块游戏,使用Python实现,总共有350+行代码,实现了俄罗斯方块游戏的基本功能,同时会记录所花费时间,消去的总行数,所得的总分,还包括一个排行榜,可以查看最高记录。

排行榜中包含一系列的统计功能,如单位时间消去的行数,单位时间得分等。

附源码:from Tkinter import *from tkMessageBox import *import randomimport time#俄罗斯方块界面的高度HEIGHT = 18#俄罗斯方块界面的宽度WIDTH = 10ACTIVE = 1PASSIVE = 0TRUE = 1FALSE = 0root=Tk();root.title('Russia')class App(Frame):def __init__(self,master):Frame.__init__(self)master.bind('<Up>',self.Up)master.bind('<Left>',self.Left)master.bind('<Right>',self.Right)master.bind('<Down>',self.Down)#master.bind('<Down>',self.Space)master.bind('<space>',self.Space)master.bind('<Control-Shift-Key-F12>',self.Play)master.bind('<Key-F6>',self.Pause)self.backg="#%02x%02x%02x" % (120,150,30)self.frontg="#%02x%02x%02x" % (40,120,150)self.nextg="#%02x%02x%02x" % (150,100,100)self.flashg="#%02x%02x%02x" % (210,130,100)self.LineDisplay=Label(master,text='Lines: ',bg='black',fg='red')self.Line=Label(master,text='0',bg='black',fg='red')self.ScoreDisplay=Label(master,text='Score: ',bg='black',fg='red')self.Score=Label(master,text='0',bg='black',fg='red')#Display timeself.SpendTimeDisplay=Label(master,text='Time: ',bg='black',fg='red')self.SpendTime=Label(master,text='0.0',bg='black',fg='red')self.LineDisplay.grid(row=HEIGHT-2,column=WIDTH,columnspan=2)self.Line.grid(row=HEIGHT-2,column=WIDTH+2,columnspan=3)self.ScoreDisplay.grid(row=HEIGHT-1,column=WIDTH,columnspan=2)self.Score.grid(row=HEIGHT-1,column=WIDTH+2,columnspan=3)#Display timeself.SpendTimeDisplay.grid(row=HEIGHT-4,column=WIDTH,columnspan=2) self.SpendTime.grid(row=HEIGHT-4,column=WIDTH+2,columnspan=3)self.TotalTime=0.0self.TotalLine=0;self.TotalScore=0#Game overself.isgameover=FALSE#Pauseself.isPause=FALSE#Startself.isStart=FALSEself.NextList=[];self.NextRowList=[]r=0;c=0for k in range(4*4):LN=Label(master,text=' ',bg=str(self.nextg),fg='white',relief=FLAT,bd=4) LN.grid(row=r,column=WIDTH+c,sticky=N+E+S+W)self.NextRowList.append(LN)c=c+1if c>=4:r=r+1;c=0self.NextList.append(self.NextRowList)self.NextRowList=[]self.BlockList=[];belList=[]self.BlockRowList=[];belRowList=[]row=0;col=0for i in range(HEIGHT*WIDTH):L=Label(master,text=' ',bg=str(self.backg),fg='white',relief=FLAT,bd=4) L.grid(row=row,column=col,sticky=N+E+S+W)L.row=row;L.col=col;L.isactive=PASSIVEself.BlockRowList.append(0);belRowList.append(L)col=col+1if col>=WIDTH:row=row+1;col=0self.BlockList.append(self.BlockRowList)belList.append(belRowList)self.BlockRowList=[];belRowList=[]#filefw=open('text.txt','a')fw.close()hasHead=FALSEf=open('text.txt','r')if f.read(5)=='score':hasHead=TRUEf.close()self.file=open('text.txt','r+a')if hasHead==FALSE:self.file.write('score line time scorePtime linePtime scorePline date\n')self.file.flush()self.time=1000self.OnTimer()def __del__(self):#self.file.close()passdef Pause(self,event):self.isPause=1-self.isPausedef Up(self,event):BL=self.BlockList;LL=belListMoveable=TRUExtotal=0;ytotal=0;count=0for i in range(HEIGHT):for j in range(WIDTH):if LL[i][j].isactive==ACTIVE:xtotal=xtotal+i;ytotal=ytotal+j;count=count+1SourceList=[];DestList=[]for i in range(HEIGHT):for j in range(WIDTH):if LL[i][j].isactive==ACTIVE:x0=(xtotal+ytotal)/count;y0=(ytotal-xtotal )/countxr=(xtotal+ytotal)%count;yr=(ytotal-xtotal)%countx=x0-j;y=y0+iif xr>=count/2:x=x+1if yr>=count/2:y=y+1SourceList.append([i,j]);DestList.append([x,y])if x<0 or x>=HEIGHT or y<0 or y>=WIDTH:Moveable=FALSEif x>=0 and x<HEIGHT and y>=0 and y<WIDTH and BL[x][y]==1 and LL[x][y].isactive==PASSIVE:Moveable=FALSEif Moveable==TRUE:for i in range(len(SourceList)):self.Empty(SourceList[i][0],SourceList[i][1])for i in range(len(DestList)):self.Fill(DestList[i][0],DestList[i][1])def Left(self,event):BL=self.BlockList;LL=belListMoveable=TRUEfor i in range(HEIGHT):for j in range(WIDTH):if LL[i][j].isactive==ACTIVE and j-1<0:Moveable=FALSEif LL[i][j].isactive==ACTIVE and j-1>=0 and BL[i][j-1]==1 and LL[i][j-1].isactive==PASSIVE:Moveable=FALSEif Moveable==TRUE:for i in range(HEIGHT):for j in range(WIDTH):if j-1>=0 and LL[i][j].isactive==ACTIVE and BL[i][j-1]==0:self.Fill(i,j-1);self.Empty(i,j)def Right(self,event):BL=self.BlockList;LL=belListMoveable=TRUEfor i in range(HEIGHT):for j in range(WIDTH):if LL[i][j].isactive==ACTIVE and j+1>=WIDTH:Moveable=FALSEif LL[i][j].isactive==ACTIVE and j+1<WIDTH and BL[i][j+1]==1 and LL[i][j+1].isactive==PASSIVE:Moveable=FALSEif Moveable==TRUE:for i in range(HEIGHT-1,-1,-1):for j in range(WIDTH-1,-1,-1):if j+1<WIDTH and LL[i][j].isactive==ACTIVE and BL[i][j+1]==0:self.Fill(i,j+1);self.Empty(i,j)def Space(self,event):while 1:if self.Down(0)==FALSE:breakdef OnTimer(self):if self.isStart==TRUE and self.isPause==FALSE:self.TotalTime = self.TotalTime + float(self.time)/1000self.SpendTime.config(text=str(self.TotalTime))if self.isPause==FALSE:self.Down(0)if self.TotalScore>=1000:self.time=900if self.TotalScore>=2000:self.time=750if self.TotalScore>=3000:self.time=600if self.TotalScore>=4000:self.time=400self.after(self.time,self.OnTimer)def Down(self,event):BL=self.BlockList;LL=belListMoveable=TRUEfor i in range(HEIGHT):for j in range(WIDTH):if LL[i][j].isactive==ACTIVE and i+1>=HEIGHT:Moveable=FALSEif LL[i][j].isactive==ACTIVE and i+1<HEIGHT and BL[i+1][j]==1 and LL[i+1][j].isactive==PASSIVE:Moveable=FALSEif Moveable==TRUE:for i in range(HEIGHT-1,-1,-1):for j in range(WIDTH-1,-1,-1):if i+1<HEIGHT and LL[i][j].isactive==ACTIVE and BL[i+1][j]==0:self.Fill(i+1,j);self.Empty(i,j)if Moveable==FALSE:for i in range(HEIGHT):for j in range(WIDTH):LL[i][j].isactive=PASSIVEself.JudgeLineFill()self.Start()if self.isgameover==TRUE:showinfo('T_T','The game is over!');self.Distroy();return FALSEfor i in range(4):for j in range(4):self.NextEmpty(i,j)self.Rnd()return Moveabledef JudgeLineFill(self):BL=self.BlockList;LL=belListcount=0;LineList=[]for i in range(WIDTH):LineList.append(1)#display flashfor i in range(HEIGHT):if BL[i]==LineList:count=count+1for k in range(WIDTH):LL[i][k].config(bg=str(self.flashg))LL[i][k].update()if count!=0:self.after(100)#delete blockfor i in range(HEIGHT):if BL[i]==LineList:#count=count+1for j in range(i,0,-1):for k in range(WIDTH):BL[j][k]=BL[j-1][k]LL[j][k]['relief']=LL[j-1][k].cget('relief')LL[j][k]['bg']=LL[j-1][k].cget('bg')for l in range(WIDTH):BL[0][l]=0LL[0][l].config(relief=FLAT,bg=str(self.backg))self.TotalLine=self.TotalLine+countif count==1:self.TotalScore=self.TotalScore+1*WIDTHif count==2:self.TotalScore=self.TotalScore+3*WIDTHif count==3:self.TotalScore=self.TotalScore+6*WIDTHif count==4:self.TotalScore=self.TotalScore+10*WIDTHself.Line.config(text=str(self.TotalLine))self.Score.config(text=str(self.TotalScore))def Fill(self,i,j):if j<0:returnif self.BlockList[i][j]==1:self.isgameover=TRUEself.BlockList[i][j]=1belList[i][j].isactive=ACTIVEbelList[i][j].config(relief=RAISED,bg=str(self.frontg))def Empty(self,i,j):self.BlockList[i][j]=0belList[i][j].isactive=PASSIVEbelList[i][j].config(relief=FLAT,bg=str(self.backg))def Play(self,event):showinfo('Made in China','^_</font></p><p><span mce_name="em" style="font-style: italic;" class="Apple-style-span" mce_style="font-style: italic;"><span style="font-size: small; " id="" mce_style="font-size: small;"><br></span></span></p><p><span mce_name="em" style="font-style: italic;" class="Apple-style-span" mce_style="font-style: italic;"><span style="font-size: small; " id="" mce_style="font-size: small;"> </span></span></p><p><br></p>)def NextFill(self,i,j):self.NextList[i][j].config(relief=RAISED,bg=str(self.frontg))def NextEmpty(self,i,j):self.NextList[i][j].config(relief=FLAT,bg=str(self.nextg))def Distroy(self):#saveif self.TotalScore!=0:savestr='%-9u%-8u%-8.2f%-14.2f%-13.2f%-14.2f%s\n' % (self.TotalScore,self.TotalLine,self.TotalTime,self.TotalScore/self.TotalTime,self.TotalLine/self.TotalTime,float(self.TotalScore)/self.TotalLine,time.strftime('%Y-%m-%d%H:%M:%S',time.localtime()))self.file.seek(0,2)self.file.write(savestr)self.file.flush()for i in range(HEIGHT):for j in range(WIDTH):self.Empty(i,j)self.TotalLine=0;self.TotalScore=0;self.TotalTime=0.0self.Line.config(text=str(self.TotalLine))self.Score.config(text=str(self.TotalScore))self.SpendTime.config(text=str(self.TotalTime))self.isgameover=FALSEself.isStart=FALSEself.time=1000for i in range(4):for j in range(4):self.NextEmpty(i,j)def Start(self):if self.x==1:self.Fill(0,WIDTH/2-2);self.Fill(0,WIDTH/2-1);self.Fill(0,WIDTH/2);self.Fill(0,WIDTH/2+1)if self.x==2:self.Fill(0,WIDTH/2-1);self.Fill(0,WIDTH/2);self.Fill(1,WIDTH/2-1);self.Fill(1,WIDTH/2)if self.x==3:self.Fill(0,WIDTH/2);self.Fill(1,WIDTH/2-1);self.Fill(1,WIDTH/2);self.Fill(1,WIDTH/2+1)if self.x==4:self.Fill(0,WIDTH/2-1);self.Fill(1,WIDTH/2-1);self.Fill(1,WIDTH/2);self.Fill(1,WIDTH/2+1)if self.x==5:self.Fill(0,WIDTH/2+1);self.Fill(1,WIDTH/2-1);self.Fill(1,WIDTH/2);self.Fill(1,WIDTH/2+1)if self.x==6:self.Fill(0,WIDTH/2-1);self.Fill(0,WIDTH/2);self.Fill(1,WIDTH/2);self.Fill(1,WIDTH/2+1)if self.x==7:self.Fill(0,WIDTH/2);self.Fill(0,WIDTH/2+1);self.Fill(1,WIDTH/2-1);self.Fill(1,WIDTH/2)self.isStart=TRUEdef Rnd(self):self.x=random.randint(1,7)if self.x==1:self.NextFill(0,0);self.NextFill(0,1);self.NextFill(0,2);self.NextFill(0,3)if self.x==2:self.NextFill(0,1);self.NextFill(0,2);self.NextFill(1,1);self.NextFill(1,2)if self.x==3:self.NextFill(0,2);self.NextFill(1,1);self.NextFill(1,2);self.NextFill(1,3)if self.x==4:self.NextFill(0,1);self.NextFill(1,1);self.NextFill(1,2);self.NextFill(1,3)if self.x==5:self.NextFill(0,3);self.NextFill(1,1);self.NextFill(1,2);self.NextFill(1,3)if self.x==6:self.NextFill(0,1);self.NextFill(0,2);self.NextFill(1,2);self.NextFill(1,3)if self.x==7:self.NextFill(0,2);self.NextFill(0,3);self.NextFill(1,1);self.NextFill(1,2) def RndFirst(self):self.x=random.randint(1,7)def Show(self):self.file.seek(0)strHeadLine=self.file.readline()dictLine={}strTotalLine=''for OneLine in self.file.readlines():temp=int(OneLine[:5])dictLine[temp]=OneLinelist=sorted(dictLine.items(),key=lambda d:d[0])ii=0for onerecord in reversed(list):ii=ii+1if ii<11:strTotalLine+=onerecord[1]showinfo('Ranking', strHeadLine+strTotalLine) def Start():app.RndFirst();app.Start();app.Rnd()def End():app.Distroy()def Set():passdef Show():app.Show()mainmenu=Menu(root)root['menu']=mainmenugamemenu=Menu(mainmenu)mainmenu.add_cascade(label='game',menu=gamemenu) gamemenu.add_command(label='start',command=Start) gamemenu.add_command(label='end',command=End) gamemenu.add_separator()gamemenu.add_command(label='exit',command=root.quit) setmenu=Menu(mainmenu)mainmenu.add_cascade(label='set',menu=setmenu) setmenu.add_command(label='set',command=Set) showmenu=Menu(mainmenu)mainmenu.add_cascade(label='show',menu=showmenu) showmenu.add_command(label='show',command=Show) app=App(root)root.mainloop()。

相关主题