当前位置:首页 >> 脚本专栏

pygame实现俄罗斯方块游戏

本文实例为大家分享了pygame实现俄罗斯方块的具体代码,供大家参考,具体内容如下

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中
#在游戏开始并且砖块开始下落前,我们需要将一些变量初始化为游戏开始时候的值。
 board = getBlankBoard()#创建一个空白游戏板数据结构
 lastMoveDownTime = time.time()#lastMoveDownTime最后按向下方向键的时间
 lastMoveSidewaysTime = time.time()#lastMoveSidewaysTime最后按左右向键的时间
 lastFallTime = time.time()#最后下落砖块的时间
 movingDown = False #没有按下向下方向键
 movingLeft = False #没有按下向左方向键
 movingRight = False #没有按下向右方向键
 score = 0 #得分
 level, fallFreq = calculateLevelAndFallFreq(score)#计算关卡数和下落频率,因为此时score=0,所以经计算后level=1,fallFreq=0.25
 fallingPiece = getNewPiece() #fallingPiece变量将设置为能够被玩家操作的当前下落的砖块
 nextPiece = getNewPiece() #nextPice为在屏幕的Next部分出现的砖块,即下一个将要下落的砖块

 while True: # 游戏主循环,它负责砖块在落向底部的过程中,游戏主要部分的代码
  if fallingPiece == None:#在下落的砖块已经着陆之后,fallingPiece变量设置为None
   fallingPiece = nextPiece#这意味着nextPiece中的砖块将会复制到fallingPiece中。
   nextPiece = getNewPiece()#生成新的新的nextPiece砖块,砖块可以通过getNewPiece()函数生成。
   lastFallTime = time.time() #该变量也重新设置为当前时间,以便砖块能够在fallFreq中所设置的那么多秒之内下落。
   if not isValidPosition(board, fallingPiece):
     #但是,如果游戏板已经填满了,isValidPosition()将返回False,导致这是一个无效的位置,那么,我们知道游戏板已经填满了,玩家失败了。
    return #在这种情况下 runGame()函数将被返回。

  for event in pygame.event.get(): #事件处理循环负责玩家旋转下落的砖块,移动下落的砖块。
    #松开一个剪头键将会把movingLeft或movingRight或movingDown变量设置为False,表示玩家不再想
    #要让砖块朝着该方向移动。随后的代码将会根据这些“moving”变量中的Boolean值来确定做什么。
   if event.type == KEYUP:#当按键弹起的时候响应KEYUP事件
    if (event.key == K_LEFT):#判断当前弹起的按键是否为左方向键
     movingLeft = False #是的话置为False,表示玩家不再想要让砖块朝着该方向移动。
    elif (event.key == K_RIGHT):#同上
     movingRight = False
    elif (event.key == K_DOWN):#同上
     movingDown = False

   elif event.type == KEYDOWN:#当按键按下的时候响应KEYDOWN事件
    if (event.key == K_LEFT) and isValidPosition(board, fallingPiece, adjX=-1):
    #当按下的按键为向左方向键,并且向左移动一个位置有效
     fallingPiece['x'] = fallingPiece['x'] -1 #左移
     movingLeft = True #将movingLeft变量设置为True,并且为了确保落下的砖块不会既向左又向右移动
     movingRight = False #将 movingRight设置为False
     lastMoveSidewaysTime = time.time() #lastMoveSidewaysTime更改为当前时间
#设置了 movingLeft,movingRigh以便玩家能够只是按住方向键以保持砖块移动。如果movingLeft变量设置为True,程序就知道已经按下了向左箭头键并且没有松开它。

    elif (event.key == K_RIGHT ) and isValidPosition(board, fallingPiece, adjX=1): #同上
     fallingPiece['x'] =fallingPiece['x'] + 1
     movingRight = True
     movingLeft = False
     lastMoveSidewaysTime = time.time()

    #按向上箭头将会把砖块为其下一个旋转状态。代码所需要做的只是fallingPiece字典中的'rotation'键的值增加1。然而,如果增加'rotation'键的值
    #大于旋转的总数目,那么用该形状可能旋转的总数目(这就是len(PIECES[fallingPiece['shape']的含义)来模除它,然后,这个值将回滚到从0开始。
    elif event.key == K_UP :
     fallingPiece['rotation'] = (fallingPiece['rotation'] + 1) % len(PIECES[fallingPiece['shape']])
     if not isValidPosition(board, fallingPiece):
     #由于新的旋转位置与游戏板上已有的一些方块重叠而导致新的旋转位置无效,那么,
     #我们想要通过从fallingPiece['rotation']减去1而切换回最初的旋转。我们也可以使用len(PIECES[fallingPiece['shape']])来模除
     #它,以便如果新的值为-1,模除将其改为列表中的最后一次旋转。"text-align: center">pygame实现俄罗斯方块游戏

pygame实现俄罗斯方块游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。