pygame庫(kù)實(shí)現(xiàn)俄羅斯方塊小游戲
本文實(shí)例為大家分享了pygame庫(kù)實(shí)現(xiàn)俄羅斯方塊小游戲的具體代碼,供大家參考,具體內(nèi)容如下
import random,time,pygame,sys
from pygame.locals import *#導(dǎo)pygame內(nèi)定義的一些常量
FPS=25#每秒傳輸幀數(shù)(刷新率),此處一秒內(nèi)在屏幕上連續(xù)投射出24張靜止畫(huà)面
WINDOWWIDTH=640#窗口寬
WINDOWHEIGHT=480#窗口高
BOXSIZE=20#游戲框大小
BOARDWIDTH=10#游戲框?qū)挾?
BOARDHEIGHT=20#游戲框高度
BLANK='.'#定義方塊形狀模板時(shí),填補(bǔ)空白處的字符
MOVESIDEWAYSFREQ=0.15#玩家一直按下左或右方向鍵,方塊仍是每0.15s才會(huì)移動(dòng)一次
MOVEDOWNFREQ=0.1#玩家一直按下下方向鍵,方塊仍是每0.1s移動(dòng)一次
XMARGIN=(WINDOWWIDTH-BOARDWIDTH*BOXSIZE)/2#游戲界面的寬度
TOPMARGIN=WINDOWHEIGHT-(BOARDHEIGHT*BOXSIZE)-5#游戲界面的高度
#定義RGB顏色變量
WHITE=(255,255,255)#設(shè)置字體顏色
BLACK=(0,0,0)#整個(gè)窗口背景為黑色
GRAY=(185,185,185)#字體陰影灰色
#以下的顏色分別被COLORS和LIGHTCOLORS所引用
RED=(155,0,0)
LIGHTRED=(175, 20, 20)#淺紅
GREEN=(0,155,0)
LIGHTGREEN=(20,175,20)#淺綠
BLUE=(0,0,155)
LIGHTBLUE=(20,20,175)#淺藍(lán)
YELLOW=(155,155,0)
LIGHTYELLOW=(175,175,20)#淺黃
BORDERCOLOR=BLUE#游戲邊框顏色為藍(lán)色
BGCOLOR=BLACK#背景顏色為黑色
TEXTCOLOR=WHITE#字體為白色,被showTextScreen()引用,用來(lái)設(shè)置暫停時(shí)的"Pause"文本字體顏色
TEXTSHADOWCOLOR=GRAY#字體陰影為灰色,被showTextScreen()引用,用來(lái)設(shè)置暫停時(shí)的"Pause"文本陰影字體顏色
COLORS=(BLUE,GREEN,RED,YELLOW)#組成方塊的小方塊顏色
LIGHTCOLORS=(LIGHTBLUE,LIGHTGREEN,LIGHTRED,LIGHTYELLOW)#圍繞在小方塊周邊顏色,強(qiáng)調(diào)輪廓
assert len(COLORS)==len(LIGHTCOLORS)#每個(gè)顏色對(duì)應(yīng)其淺色
TEMPLATEWIDTH=5#模板寬
TEMPLATEHEIGHT=5#模板高
#定義方塊形狀模板(順時(shí)針旋轉(zhuǎn)變換),在列表中嵌入了含有字符串的列表來(lái)構(gòu)成這個(gè)模板,模板包含了這個(gè)方塊可能變換的所有形狀
S_SHAPE_TEMPLATE=[['.....',
'.....',
'..00.',
'.00..',
'.....'],
['.....',
'..0..',
'..00.',
'...0.',
'.....']]
Z_SHAPE_TEMPLATE=[['.....',
'.....',
'.00..',
'..00.',
'.....'],
['.....',
'..0..',
'.00..',
'.0...',
'.....']]
I_SHAPE_TEMPLATE=[['..0..',
'..0..',
'..0..',
'..0..',
'.....'],
['.....',
'.....',
'0000.',
'.....',
'.....']]
O_SHAPE_TEMPLATE=[['.....',
'.....',
'.00..',
'.00..',
'.....']]
J_SHAPE_TEMPLATE=[['.....',
'.0...',
'.000.',
'.....',
'.....'],
['.....',
'..00.',
'..0..',
'..0..',
'.....'],
['.....',
'.....',
'.000.',
'...0.',
'.....'],
['.....',
'..0..',
'..0..',
'.00..',
'.....']]
L_SHAPE_TEMPLATE=[['.....',
'...0.',
'.000.',
'.....',
'.....'],
['.....',
'..0..',
'..0..',
'..00.',
'.....'],
['.....',
'.....',
'.000.',
'.0...',
'.....'],
['.....',
'.00..',
'..0..',
'..0..',
'.....']]
T_SHAPE_TEMPLATE=[['.....',
'..0..',
'.000.',
'.....',
'.....'],
['.....',
'..0..',
'..00.',
'..0..',
'.....'],
['.....',
'.....',
'.000.',
'..0..',
'.....'],
['.....',
'..0..',
'.00..',
'..0..',
'.....']]
#定義字典變量PIECES來(lái)存儲(chǔ)所有的不同形狀模板(重點(diǎn)是所有),即字典變量PIECES包含了每個(gè)類(lèi)型的方塊和所有的變換形狀
PIECES={'S':S_SHAPE_TEMPLATE,
'Z':Z_SHAPE_TEMPLATE,
'I':I_SHAPE_TEMPLATE,
'O':O_SHAPE_TEMPLATE,
'J':J_SHAPE_TEMPLATE,
'L':L_SHAPE_TEMPLATE,
'T':T_SHAPE_TEMPLATE}
#主函數(shù)用于創(chuàng)建一些全局變量并在游戲開(kāi)始之前顯示一個(gè)初始畫(huà)面
def main():
global FPSCLOCK,DISPLAYSURF,BASICFONT,BIGFONT
pygame.init()#初始化pygame相關(guān)模塊,為使用硬件做準(zhǔn)備
FPSCLOCK=pygame.time.Clock()#創(chuàng)建一個(gè)新對(duì)象,可以使用時(shí)鐘跟蹤的時(shí)間量。該時(shí)鐘還提供多種功能以幫助控制游戲的幀率。返回一個(gè)Clock對(duì)象
DISPLAYSURF=pygame.display.set_mode((WINDOWWIDTH,WINDOWHEIGHT))#顯示窗口(返回一個(gè)Surface對(duì)象)
BASICFONT=pygame.font.Font('freesansbold.ttf',18)#用來(lái)設(shè)置暫停時(shí)"Press a key to play."字體顏色,被showTextScreen()引用
BIGFONT=pygame.font.Font('freesansbold.ttf',100)#用來(lái)設(shè)置暫停時(shí)"Pause"文本及其陰影文本字體大小,被showTextScreen()引用
pygame.display.set_caption('俄羅斯方塊')
while True:
#隨機(jī)播放背景音樂(lè),mid音樂(lè)格式由MIDI繼承而來(lái)。MID文件并不是一段錄制好的音樂(lè),而是記錄
#聲音的信息,然后告訴聲卡如何再現(xiàn)音樂(lè)的一組指令,所以音樂(lè)播放的好壞因不同機(jī)器的聲卡而不同
if random.randint(0,1)==0:#加入異常語(yǔ)句,沒(méi)有mid音樂(lè)也可直接運(yùn)行
try:
pygame.mixer.music.load('QQ火拼泡泡龍復(fù)原BGM---無(wú)損[游戲中].mid')
except:
pass
else:
try:
pygame.mixer.music.load('蛇蛇爭(zhēng)霸.mid')
except:
pass
try:
pygame.mixer.music.play(-1,0.0)#參數(shù)依次為無(wú)限循環(huán)播放,從音樂(lè)開(kāi)頭播放
except:
pass
runGame()
try:
pygame.mixer.music.stop()
except:
pass
showTextScreen('Game Over')
def runGame():
"""啟動(dòng)運(yùn)行游戲函數(shù)"""
board=getBlankBoard()#返回一個(gè)新的空白板數(shù)據(jù)結(jié)構(gòu)
lastMoveDownTime=time.time()
lastMoveSidewaysTime=time.time()
lastFallTime=time.time()
#按下方向鍵會(huì)將以下三個(gè)變量設(shè)置為None,上移變量用于翻轉(zhuǎn)方塊,故沒(méi)有上移變量
movingDown=False
movingLeft=False
movingRight=False
score=0
level,fallFreq=calculateLevelAndFallFreq(score)
fallingPiece=getNewPiece()#當(dāng)前掉落的方塊
nextPiece=getNewPiece()#游戲玩家可以在屏幕的NEXT區(qū)域看見(jiàn)的下一個(gè)方塊
while True:#開(kāi)始游戲循環(huán)
if fallingPiece==None:
fallingPiece=nextPiece#沒(méi)有下降的一塊在運(yùn)動(dòng),所以開(kāi)始一個(gè)新的一塊在頂部,把nextPiece變量中的下一個(gè)方塊賦值給fallingPiece變量
nextPiece=getNewPiece()
lastFallTime=time.time()#重置lastFallTime變量,賦值為當(dāng)前時(shí)間,這樣就可以通過(guò)變量fallFreq控制方塊下落頻率
if not isValidPosition(board, fallingPiece):#不能在游戲框中放下新的方塊,游戲結(jié)束,Valid:有效的,Position:位置
return#返回runGame函數(shù)調(diào)用處
checkForQuit()#不斷檢查是否要退出
for event in pygame.event.get():#事件處理循環(huán)
if event.type==KEYUP:
if event.key==K_p:#暫停游戲
DISPLAYSURF.fill(BGCOLOR)#將DISPLAYSURF(窗口Surface對(duì)象)重新填充為黑色
showTextScreen('Paused')#DISPLAYSURF(窗口Surface對(duì)象)顯示暫停字樣
lastMoveDownTime = time.time()
lastMoveSidewaysTime = time.time()
lastFallTime = time.time()
elif event.key==K_LEFT or event.key==K_a:
movingLeft=False
elif event.key==K_RIGHT or event.key==K_d:
movingRight=False
elif event.key==K_DOWN or event.key==K_s:
movingDown=False
elif event.type==KEYDOWN:#將方塊側(cè)向移動(dòng)
if event.key==K_LEFT or event.key==K_a and isValidPosition(board,fallingPiece,adjX=-1):
fallingPiece['x']-=1
movingLeft=True
movingRight=False
lastMoveSidewaysTime=time.time()
elif event.key==K_RIGHT or event.key==K_d and isValidPosition(board,fallingPiece,adjX=1):
fallingPiece['x']+=1
movingRight=True
movingLeft=False
lastMoveSidewaysTime=time.time()
elif event.key==K_UP or event.key==K_w:#按向上鍵,旋轉(zhuǎn)方塊(如果有空間的話)
fallingPiece['rotation']=(fallingPiece['rotation']+1)%len(PIECES[fallingPiece['shape']])
if not isValidPosition(board,fallingPiece):
fallingPiece['rotation']=(fallingPiece['rotation']-1)%len(PIECES[fallingPiece['shape']])
elif event.key==K_q:#按q鍵,按相反方向旋轉(zhuǎn)
fallingPiece['rotation']=(fallingPiece['rotation']-1)%len(PIECES[fallingPiece['shape']])
if not isValidPosition(board,fallingPiece):
fallingPiece['rotation'] = (fallingPiece['rotation'] + 1) % len(PIECES[fallingPiece['shape']])
elif event.key==K_DOWN or event.key==K_s:#按下向下鍵,使得方塊下落得更快,fallingPiece['y']+=1使方塊下落一個(gè)格子,
#前提是這是一個(gè)有效下落,把movingDown設(shè)置為T(mén)rue,把lastMoveDownTime變量
#設(shè)置為當(dāng)前時(shí)間.當(dāng)向下方向鍵一直pp按下時(shí),以后將會(huì)檢查這個(gè)變量保證方塊以一個(gè)較快速率下降
movingDown=True
if isValidPosition(board,fallingPiece,adjY=1):
fallingPiece['y']+=1
lastMoveDownTime=time.time()
elif event.key==K_SPACE:#如果按下的是空格,則將方塊一步到底部。程序首先需要找出它著落需要下降多少個(gè)格子,有關(guān)moving的3個(gè)變量都要
#設(shè)置為False,用以保證程序后面部分代碼知道游戲玩家已經(jīng)按下所有方向鍵。
movingDown=False
movingLeft=False
movingRight=False
for i in range(1,BOARDHEIGHT):
if not isValidPosition(board,fallingPiece,adjY=i):
break
fallingPiece['y']+=i-1
if (movingLeft or movingRight) and (time.time()-lastMoveSidewaysTime) > MOVESIDEWAYSFREQ:#如果用戶(hù)按住按鍵超過(guò)0.15s,那么該表達(dá)式返回True,便可使得方塊左或右移一個(gè)格子
#因?yàn)槿绻脩?hù)重復(fù)按下方向鍵讓方塊移動(dòng)多個(gè)格子是很煩人的。好的做法便是用戶(hù)按下
#方向鍵讓方塊保持移動(dòng),直到松開(kāi)鍵為止
if movingLeft and isValidPosition(board,fallingPiece,adjX=-1):
fallingPiece['x']-=1
elif movingRight and isValidPosition(board,fallingPiece,adjX=1):
fallingPiece['x']+=1
lastMoveSidewaysTime=time.time()
if movingDown and time.time()-lastMoveDownTime>MOVEDOWNFREQ and isValidPosition(board,fallingPiece,adjY=1):
fallingPiece['y']+=1
lastMoveDownTime=time.time()
if time.time()-lastFallTime>fallFreq:#讓方塊自動(dòng)落下如果它到了下落的時(shí)候
#判斷方塊是否落地
if not isValidPosition(board,fallingPiece,adjY=1):#方塊已落地
addToBoard(board,fallingPiece)#將落地的方塊添加到游戲框中
score+=removeCompleteLines(board)#判斷游戲框中的每一行是否填滿,刪除填滿的一行,返回填滿數(shù)
level,fallFreq=calculateLevelAndFallFreq(score)#計(jì)算游戲等級(jí)以及下落頻率
fallingPiece=None#將當(dāng)前下落的方塊設(shè)置為空對(duì)象,然后在函數(shù)開(kāi)頭重新賦值nextPiece
else:#方塊沒(méi)有落地,只是把方塊移下來(lái)
fallingPiece['y']+=1
lastFallTime=time.time()
#把所有東西畫(huà)在屏幕上
DISPLAYSURF.fill(BGCOLOR)#設(shè)置窗口背景顏色
drawBoard(board)#將空白數(shù)據(jù)模板繪畫(huà)到窗口
drawStatus(score,level)#將狀態(tài)欄繪畫(huà)到窗口
drawNextPiece(nextPiece)#將下一個(gè)方塊顯示欄畫(huà)到窗口
if fallingPiece != None:
drawPiece(fallingPiece)
pygame.display.update()
FPSCLOCK.tick(FPS)
def getBlankBoard():
"""創(chuàng)建并返回一個(gè)新的空白板數(shù)據(jù)結(jié)構(gòu),board列表為如下形式:
[['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
,['.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.']]
與BOARDWIDTH=10#游戲框?qū)挾?,BOARDHEIGHT=20#游戲框高度對(duì)應(yīng)
"""
board=[]
for i in range(BOARDWIDTH):
board.append([BLANK]*BOARDHEIGHT)
return board
def calculateLevelAndFallFreq(score):
"""根據(jù)分?jǐn)?shù),返回玩家所處的關(guān)卡,以及掉落的棋子掉落到一個(gè)空格前的時(shí)間間隔。"""
level=int(score/10)+1#等級(jí)
fallFreq=0.27-(level*0.02)#下落頻率(frequence)
return level,fallFreq
def getNewPiece():
"""以隨機(jī)旋轉(zhuǎn)和顏色返回隨機(jī)的新塊"""
shape=random.choice(list(PIECES.keys()))#shape為S,Z,I....
newPiece={'shape':shape,
'rotation':random.randint(0,len(PIECES[shape])-1),#PIECES[shape]為S_SHAPE_TEMPLATE,Z_SHAPE_TEMPLATE,I_SHAPE_TEMPLATE.此處指一類(lèi)方塊的可旋轉(zhuǎn)次數(shù)
'x':int(BOARDWIDTH/2)-int(TEMPLATEWIDTH/2),
'y':-2,
'color':random.randint(0,len(COLORS)-1)}
return newPiece
def checkForQuit():
"""檢查退出事件"""
for event in pygame.event.get(QUIT):#獲取所有退出事件
terminate()#如果存在任何退出事件,則調(diào)用終止函數(shù)
for event in pygame.event.get(KEYUP):#獲取所有的放開(kāi)鍵事件
if event.key==K_ESCAPE:#如果KEYUP事件是針對(duì)Esc鍵的
terminate()#終止
pygame.event.post(event)#將其他KEYUP(非Esc鍵放開(kāi))事件對(duì)象放回事件隊(duì)列
def terminate():
"""退出函數(shù)"""
pygame.quit()
sys.exit()
def showTextScreen(text):
"""在窗口Surface對(duì)象的中央顯示大文本,直到按下一個(gè)鍵。用于繪制文本投影,注意:pygame沒(méi)有提供直接在現(xiàn)有
表面繪制文本的方法:相反,您必須使用Font.render()來(lái)創(chuàng)建文本的圖像(表面),然后將此圖像blit到另一個(gè)表面。
"""
#做出陰影效果
titleSurf,titleRect=makeTextObjs(text,BIGFONT,TEXTSHADOWCOLOR)#BIGFONT為main函數(shù)中定義,TEXTSHADOWCOLOR為模塊中定義,此處文本顏色TEXTSHADOWCOLOR(灰色),下面是TEXTCOLOR(白色)
titleRect.center=(int(WINDOWWIDTH/2),int(WINDOWHEIGHT / 2))#設(shè)置矩形容器的位置,此處需要注意titleRect指的是每個(gè)文本Surface對(duì)象與其對(duì)應(yīng)的全覆蓋矩形容器,此容器在這里不可見(jiàn)
DISPLAYSURF.blit(titleSurf,titleRect)#在窗口Surface對(duì)象畫(huà)文本Surface對(duì)象和與其對(duì)應(yīng)的矩形Surface對(duì)象,做出blit這個(gè)動(dòng)作的人是一個(gè)Surface類(lèi)的實(shí)例
#實(shí)體文本整體向左上移動(dòng)3個(gè)單位,與上面的陰影效果唯一不同的就是傳入的顏色參數(shù)
titleSurf,titleRect=makeTextObjs(text,BIGFONT,TEXTCOLOR)
titleRect.center=(int(WINDOWWIDTH/2)-3,int(WINDOWHEIGHT/2)-3)
DISPLAYSURF.blit(titleSurf,titleRect)
#繪制"Paused"文本下附加的"Press a key to play."文本
pressKeySurf,pressKeyRect=makeTextObjs('Press a key to play.',BASICFONT,TEXTCOLOR)
pressKeyRect.center=(int(WINDOWWIDTH/2),int(WINDOWHEIGHT/2)+100)
DISPLAYSURF.blit(pressKeySurf,pressKeyRect)
while checkForKeyPress()==None:
pygame.display.update()
FPSCLOCK.tick()#這種方法應(yīng)該被調(diào)用一次。它將計(jì)算多少毫秒被調(diào)用。如果可選的幀率參數(shù)的函數(shù)以將延遲保持在低于給
#定游戲運(yùn)行時(shí)每秒滴答。這有助于限制運(yùn)行游戲的速度。通過(guò)調(diào)用clock.tick每幀一次地(40),該程序不會(huì)運(yùn)行超過(guò)40幀/秒。
def makeTextObjs(text,font,color):
"""這將創(chuàng)建一個(gè)新Surface對(duì)象,并在其上呈現(xiàn)指定的文本。"""
surf=font.render(text,True,color)#參數(shù)依次為:要寫(xiě)的文本,布爾值(是否開(kāi)啟抗鋸齒功能,True字體較為平滑,),字體顏色,背景色
return surf,surf.get_rect()#返回一個(gè)覆蓋整個(gè)表面的新矩形(Rect對(duì)象,一個(gè)矩形的靈活容器)
def isValidPosition(board,piece,adjX=0,adjY=0):
"""如果塊在板內(nèi)且沒(méi)有碰撞,則返回True,該函數(shù)我暫時(shí)不理解"""
for x in range(TEMPLATEWIDTH):
for y in range(TEMPLATEHEIGHT):
isAboveBoard=y+piece['y']+adjY<0
if isAboveBoard or PIECES[piece['shape']][piece['rotation']][y][x]==BLANK:
continue
if not isOnBoard(x+piece['x']+adjX,y+piece['y']+adjY):
return False
if board[x+piece['x']+adjX][y+piece['y']+adjY]!=BLANK:
return False
return True
def isOnBoard(x,y):
return x>=0 and x<BOARDWIDTH and y<BOARDHEIGHT
def addToBoard(board,piece):
"""根據(jù)方塊的位置,形狀,旋轉(zhuǎn)填充的游戲框中"""
for x in range(TEMPLATEWIDTH):
for y in range(TEMPLATEHEIGHT):
if PIECES[piece['shape']][piece['rotation']][y][x]!=BLANK:
board[x+piece['x']][y+piece['y']]=piece['color']
def removeCompleteLines(board):
"""刪除游戲框中所有已完成(Completed)的行,將上面的所有內(nèi)容向下移動(dòng),并返回完整行數(shù)。"""
numLinesRemoved=0#記錄刪除的行數(shù)
y=BOARDHEIGHT-1#從游戲框底部開(kāi)始
while y>=0:
if isCompleteLine(board,y):#如果填充了這一行,則移開(kāi)這條線,把所有方塊往下一拉
for pullDownY in range(y,0,-1):
for x in range(BOARDWIDTH):
board[x][pullDownY]=board[x][pullDownY-1]
for x in range(BOARDWIDTH):#將最上面一行設(shè)置為空白
board[x][0]=BLANK
numLinesRemoved+=1
else:
y-=1#繼續(xù)查看下一行
return numLinesRemoved
def isCompleteLine(board,y):
"""如果行中填充了沒(méi)有空格的框,則返回True"""
for x in range(BOARDWIDTH):
if board[x][y]==BLANK:
return False
return True
def calculateLevelAndFallFreq(score):
"""基于分?jǐn)?shù),返回玩家所在的關(guān)卡。"""
level=int(score/10)+1
fallFreq=0.27-(level*0.02)#根據(jù)level變量計(jì)算方塊每下落一個(gè)空間所需要的秒數(shù)
return level,fallFreq
def drawBoard(board):
"""將空白數(shù)據(jù)模板畫(huà)到窗口Surface對(duì)象上"""
pygame.draw.rect(DISPLAYSURF, BORDERCOLOR, (XMARGIN - 3, TOPMARGIN - 7, (BOARDWIDTH * BOXSIZE) + 8, (BOARDHEIGHT * BOXSIZE) + 8), 5)
# fill the background of the board #填充空白數(shù)據(jù)模板背景顏色
pygame.draw.rect(DISPLAYSURF, BGCOLOR, (XMARGIN, TOPMARGIN, BOXSIZE * BOARDWIDTH, BOXSIZE * BOARDHEIGHT))
# draw the individual boxes on the board #在空白數(shù)據(jù)模板上畫(huà)出各個(gè)盒子
for x in range(BOARDWIDTH):
for y in range(BOARDHEIGHT):
drawBox(x, y, board[x][y])
def drawStatus(score,level):
"""在Surface窗口對(duì)象上畫(huà)在游戲框旁邊的狀態(tài)欄"""
#繪制分?jǐn)?shù)文本
scoreSurf=BASICFONT.render("Score:%s"%score,True,TEXTCOLOR)#TEXTCOLOR為白色
scoreRect=scoreSurf.get_rect()
scoreRect.topleft = (WINDOWWIDTH - 150, 20)
DISPLAYSURF.blit(scoreSurf, scoreRect)
#繪制等級(jí)文本
levelSurf = BASICFONT.render('Level: %s' % level, True, TEXTCOLOR)
levelRect = levelSurf.get_rect()
levelRect.topleft = (WINDOWWIDTH - 150, 50)
DISPLAYSURF.blit(levelSurf, levelRect)
def drawNextPiece(piece):
#繪制"下一個(gè)"文本
nextSurf=BASICFONT.render("Next:",True,TEXTCOLOR)
nextRect=nextSurf.get_rect()
nextRect.topleft=(WINDOWWIDTH-120,80)
DISPLAYSURF.blit(nextSurf, nextRect)
#繪制下一個(gè)"方塊",pixel中文為像素
drawPiece(piece,pixelx=WINDOWWIDTH-120, pixely=100)
def drawPiece(piece,pixelx=None, pixely=None):
shapeToDraw=PIECES[piece['shape']][piece['rotation']]
if pixelx==None and pixely==None:
pixelx,pixely=convertToPixelCoords(piece['x'], piece['y'])#如果沒(méi)有指定pixelx & pixely,則使用存儲(chǔ)在片段數(shù)據(jù)結(jié)構(gòu)中的位置
#畫(huà)出組成這個(gè)方塊的每一個(gè)小方塊
for x in range(TEMPLATEWIDTH):
for y in range(TEMPLATEHEIGHT):
if shapeToDraw[y][x] != BLANK:
drawBox(None,None,piece['color'],pixelx + (x * BOXSIZE), pixely + (y * BOXSIZE))
def convertToPixelCoords(boxx,boxy):
"""將board上給定的xy坐標(biāo)轉(zhuǎn)換為屏幕上位置的xy坐標(biāo),convert:轉(zhuǎn)換,pixel:像素,coords:坐標(biāo)"""
return (XMARGIN+(boxx*BOXSIZE)),(TOPMARGIN+(boxy * BOXSIZE))
def drawBox(boxx,boxy,color,pixelx=None,pixely=None):
"""在黑板上的xy坐標(biāo)處畫(huà)一個(gè)盒子(每個(gè)四重奏有四個(gè)盒子)?;蛘?,如果指定了pixelx & pixely,則繪制到存儲(chǔ)在pixelx & pixely中的像素坐標(biāo)(這用于“下一個(gè)”塊)"""
if color==BLANK:
return
if pixelx==None and pixely==None:
pixelx, pixely = convertToPixelCoords(boxx, boxy)
pygame.draw.rect(DISPLAYSURF, COLORS[color], (pixelx + 1, pixely + 1, BOXSIZE - 1, BOXSIZE - 1))
pygame.draw.rect(DISPLAYSURF, LIGHTCOLORS[color], (pixelx + 1, pixely + 1, BOXSIZE - 4, BOXSIZE - 4))
def checkForKeyPress():
"""遍歷事件隊(duì)列,尋找KEYUP事件,獲取KEYDOWN事件,將它們從事件隊(duì)列中刪除"""
checkForQuit()
for event in pygame.event.get([KEYDOWN, KEYUP]):
if event.type!=KEYDOWN:
continue
return event.key
return None
if __name__=='__main__':
main()
運(yùn)行結(jié)果:

更多關(guān)于俄羅斯方塊的文章,請(qǐng)點(diǎn)擊查看專(zhuān)題:《俄羅斯方塊》
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
FastApi如何快速構(gòu)建一個(gè)web項(xiàng)目的實(shí)現(xiàn)
本文主要介紹了FastApi如何快速構(gòu)建一個(gè)web項(xiàng)目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
python 成功引入包但無(wú)法正常調(diào)用的解決
這篇文章主要介紹了python 成功引入包但無(wú)法正常調(diào)用的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
python實(shí)現(xiàn)類(lèi)似ftp傳輸文件的網(wǎng)絡(luò)程序示例
這篇文章主要介紹了python實(shí)現(xiàn)類(lèi)似ftp傳輸文件的網(wǎng)絡(luò)程序示例,需要的朋友可以參考下2014-04-04
Pandas中DataFrame數(shù)據(jù)刪除詳情
這篇文章主要以介紹的是Pandas中DataFrame的數(shù)據(jù)刪除的相關(guān)資料,主要使用drop、del方式,需要的朋友可以參考下面文章的具體內(nèi)容2021-09-09
Python實(shí)戰(zhàn)之制作天氣查詢(xún)軟件
這篇文章主要給大家介紹了關(guān)于Python實(shí)戰(zhàn)之制作天氣查詢(xún)軟件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
python機(jī)器學(xué)習(xí)基礎(chǔ)決策樹(shù)與隨機(jī)森林概率論
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)基礎(chǔ)決策樹(shù)與隨機(jī)森林概率論詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
Python中shape[0]、shape[1]和shape[-1]分別的意思詳解(附代碼)
剛開(kāi)始使用python做東西,總是不太理解矩陣、數(shù)組相關(guān)的問(wèn)題,所以在此記錄shape方面的總結(jié),下面這篇文章主要給大家介紹了關(guān)于Python中shape[0]、shape[1]和shape[-1]分別是什么意思的相關(guān)資料,需要的朋友可以參考下2022-11-11

