import random, time, pygame, sys
from pygame.locals import *
FPS = 25
WINDOWWIDTH = 640#整个游戏屏幕的宽
WINDOWHEIGHT = 480#整个游戏屏幕的高
BOXSIZE = 20#每个小格子的宽和高
BOARDWIDTH = 10#游戏窗口本身有10个方块的宽度
BOARDHEIGHT = 20#游戏窗口本身有20个方块的高度
BLANK = '.'#表示空白空格
#每当玩家按下向左或向右箭头键的时候,下落的砖块都应该分别向左或向右移动一个方块。然而,玩家也可以保持按住了向左箭头键或向右箭头键以使得下落的砖块持续移动。
MOVESIDEWAYSFREQ = 0.15 #按向左箭头键或向右箭头键每次持续按下超过0.15秒的时候,砖块相应的移动一个空格
MOVEDOWNFREQ = 0.1 #按向下头键每次持续按下超过0.1秒的时候,砖块向下一个空格
XMARGIN = int((WINDOWWIDTH - BOARDWIDTH * BOXSIZE) / 2)#(0INDOWWIDTH是总窗口的宽度-游戏界面一行上的方块个数*每个方块的宽度)/2窗口左边或右边剩下的像素数
TOPMARGIN = WINDOWHEIGHT - (BOARDHEIGHT * BOXSIZE) - 5#TOPMARGIN:游戏窗口上面剩下的像素数=总窗口的高度-(游戏界面一列上的方块个数*每个方块的高度)-5
# R G B
WHITE = (255, 255, 255)#白色
GRAY = (185, 185, 185)#灰色
BLACK = ( 0, 0, 0)#黑色
RED = (155, 0, 0)#红色
GREEN = ( 0, 155, 0)#绿色
BLUE = ( 0, 0, 155)#蓝色
YELLOW = (155, 155, 0)#黄色
BORDERCOLOR = BLUE#边界颜色
BGCOLOR = BLACK#背景颜色
TEXTCOLOR = WHITE#文字颜色
COLORS = (BLUE,GREEN,RED,YELLOW) #方块四种颜色,存于COLORS元组中
TEMPLATEWIDTH = 5#砖块模板宽
TEMPLATEHEIGHT = 5#砖块模板高
S_SHAPE_TEMPLATE = [['.....', #S形状的模板
'.....',
'..OO.',
'.OO..',
'.....'],
['.....', #S逆时针变化的形状
'..O..',
'..OO.',
'...O.',
'.....']]
Z_SHAPE_TEMPLATE = [['.....', #Z形模板
'.....',
'.OO..',
'..OO.',
'.....'],
['.....',
'..O..',
'.OO..',
'.O...',
'.....']]
I_SHAPE_TEMPLATE = [['..O..', #I型模板
'..O..',
'..O..',
'..O..',
'.....'],
['.....',
'.....',
'OOOO.',
'.....',
'.....']]
O_SHAPE_TEMPLATE = [['.....', #O型模板
'.....',
'.OO..',
'.OO..',
'.....']]
J_SHAPE_TEMPLATE = [['.....', #J型模板
'.O...',
'.OOO.',
'.....',
'.....'],
['.....',
'..OO.',
'..O..',
'..O..',
'.....'],
['.....',
'.....',
'.OOO.',
'...O.',
'.....'],
['.....',
'..O..',
'..O..',
'.OO..',
'.....']]
L_SHAPE_TEMPLATE = [['.....', #L型模板
'...O.',
'.OOO.',
'.....',
'.....'],
['.....',
'..O..',
'..O..',
'..OO.',
'.....'],
['.....',
'.....',
'.OOO.',
'.O...',
'.....'],
['.....',
'.OO..',
'..O..',
'..O..',
'.....']]
T_SHAPE_TEMPLATE = [['.....', #T型模板
'..O..',
'.OOO.',
'.....',
'.....'],
['.....',
'..O..',
'..OO.',
'..O..',
'.....'],
['.....',
'.....',
'.OOO.',
'..O..',
'.....'],
['.....',
'..O..',
'.OO..',
'..O..',
'.....']]
PIECES = {'S': S_SHAPE_TEMPLATE, #PIECES是一个字典,它储存了所有不同的模板(列表)。每个模板都拥有一个形状所有可能的旋转(列表)。
'Z': Z_SHAPE_TEMPLATE,
'J': J_SHAPE_TEMPLATE,
'L': L_SHAPE_TEMPLATE,
'I': I_SHAPE_TEMPLATE,
'O': O_SHAPE_TEMPLATE,
'T': T_SHAPE_TEMPLATE}
def main(): #main()函数还负责创建了一些其他的全局常量,并且显示了在游戏运行的时候出现的初始屏幕。
global FPSCLOCK, DISPLAYSURF, BASICFONT, BIGFONT
pygame.init()#在inport pygame之后 调用其他函数之前总要调用这个函数
FPSCLOCK = pygame.time.Clock()#pygame.time.Clock()创建pygame.time.Clock对象
DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT)) #pygame.display.set_mode()的参数是一个元组,该元祖中有两个参数,
#即:创建窗口的宽和高,单位是像素,该函数返回pygame.Surface对象
BASICFONT = pygame.font.Font('freesansbold.ttf', 18)#字体
BIGFONT = pygame.font.Font('freesansbold.ttf', 100)#字体
pygame.display.set_caption('Tetromino')#设置窗口标题
showTextScreen('Tetromino')#设置在开始界面显示的文字
while True: #游戏循环,该游戏循坏会在一秒之内多次检查是否发生了任何新的事件,例如:点击鼠标或按下键盘
pygame.mixer.music.load('tetrisc.mp3')#加载音乐
pygame.mixer.music.play(-1, 0.0)#播放音乐
runGame()#调用runGame()开始游戏,当游戏失败的时候,runGame()将返回main(),
pygame.mixer.music.stop()#然后main()会停止背景音乐
showTextScreen('Game Over')#并显示游戏结束屏幕。当玩家按下一个键,showTextScreen()函数将返回,程序回到main()中的的第一行,重新开始游戏
def runGame():#实际的游戏代码都在runGame中
#在游戏开始并且砖块Q5A1Q]%Q 耏7:[v_V6z4(Q5A1Q!%!PQ9,9lt =aM%i =aM%i4('V#Z_Kr"?vvCV#Z_KrZ_vzjvCZ_V6wzKr"?vvCg3"C?4(4)M%
=9P9QQaQ
=1=H4(Р4(й%9=]]%Q 4(%MA1eMUIСФ4(%9=]]%Q 4(4)хMM%
=9PM耕QQaQ
=1=H4(IMР4(Iй%9=]]%Q 4(%MA1eMUIСMIФ4(MM%
=9P1耕QQaQ
=1=H4(IMР4(Iй%9=]]%Q 4(%MA1eMUIСMIФ4(4)ФMIQа %=9PQaQ
=1=H4(IйС]%9=]]%Q С]%9=]!%!P4(%MA1eMUIСMIФ4(--QA东 M%
=9PQaQ
=1=H4(-йС]%9=]]%Q С]%9=]!%!P4(%MA1eMUIС--Ф4(4(AM
1=
,4(4)}}}|}}}|4(4(е聍gn>?顽ň4(е聍gn>?顽4(brZj3ro疒j惚r'&*rokkR2