import sys
import random, copy
import pygame as pg
from pygame.locals import *
# 常量声明
EMPTY_CELL = 0 # 空区标识,表示没有方块
FALLING_BLOCK = 1 # 下落中的方块标识,也就是活动方块。
STATIC_BLOCK = 2 # 固实方块标识
'''
全局变量声明
变量值以sysInit函数中初始化后的结果为准
'''
defaultFont = None # 默认字体
screen = None # 屏幕输出对象
backSurface = None # 图像输出缓冲画板
score = 0 # 玩家得分记录
clearLineScore = 0 # 玩家清除的方块行数
level = 1 # 关卡等级
clock = None # 游戏时钟
nowBlock = None # 当前下落中的方块
nextBlock = None # 下一个将出现的方块
fallSpeed = 10 # 当前方块下落速度
beginFallSpeed = fallSpeed # 游戏初始时方块下落速度
speedBuff = 0 # 下落速度缓冲变量
keyBuff = None # 上一次按键记录
maxBlockWidth = 10 # 舞台堆叠区X轴最大可容纳基础方块数
maxBlockHeight = 18 # 舞台堆叠区Y轴最大可容纳基础方块数
blockWidth = 30 # 以像素为单位的基础方块宽度
blockHeight = 30 # 以像素为单位的基础方块高度
blocks = [] # 方块形状矩阵四维列表。第一维为不同的方块形状,第二维为每个方块形状不同的方向(以0下标起始,一共四个方向),第三维为Y轴方块形状占用情况,第四维为X轴方块形状占用情况。矩阵中0表示没有方块,1表示有方块。
stage = [] # 舞台堆叠区矩阵二维列表,第一维为Y轴方块占用情况,第二维为X轴方块占用情况。矩阵中0表示没有方块,1表示有固实方块,2表示有活动方块。
gameOver = False # 游戏结束标志
pause = False # 游戏暂停标志
def printTxt(content, x, y, font, screen, color=(255, 255, 255)):
'''显示文本
args:
content:待显示文本内容
x,y:显示坐标
font:字体
screen:输出的screen
color:颜色
'''
imgTxt = font.render(content, True, color)
screen.blit(imgTxt, (x, y))
class point(object):
'''平面坐标点类
attributes:
x,y:坐标值
'''
def __init__(self, x, y):
self.__x = x
self.__y = y
def getx(self):
return self.__x
def setx(self, x):
self.__x = x
x = property(getx, setx)
def gety(self):
return self.__y
def sety(self, y):
self.__y = y
y = property(gety, sety)
def __str__(self):
return "{x:" + "{:.0f}".format(self.__x) + ",y:" + "{:.0f}".format(self.__y) + "}"
class blockSprite(object):
'''
方块形状精灵类
下落方块的定义全靠它了。
attributes:
shape:方块形状编号
direction:方块方向编号
xy,方块形状左上角方块坐标
block:方块形状矩阵
'''
def __init__(self, shape, direction, xy):
self.shape = shape
self.direction = direction
self.xy = xy
def chgDirection(self, direction):
'''
改变方块的方向
args:
direction:1为向右转,0为向左转。
'''
dirNumb = len(blocks[self.shape]) - 1
if direction == 1:
self.direction += 1
if self.direction > dirNumb:
self.direction = 0
else:
self.direction -= 1
if self.direction < 0:
self.direction = dirNumb
def clone(self):
'''
克隆本体
return:
返回自身的克隆
'''
return blockSprite(self.shape, self.direction, point(self.xy.x, self.xy.y))
def _getBlock(self):
return blocks[self.shape][self.direction]
block = property(_getBlock)
def getConf(fileName):
'''
从配置文件中读取方块形状数据
每个方块以4*4矩阵表示形状,配置文件每行代表一个方块,用分号分隔矩阵行,用逗号分隔矩阵列,0表示没有方块,1表示有方块。
因为此程序只针对俄罗斯方块的经典版,所以方块矩阵大小以硬编码的形式写死为4*4。
args:
fileName:配置文件名
'''
global blocks # blocks记录方块形状。
with open(fileName, 'rt') as fp:
for temp in fp.readlines():
blocks.append([])
blocksNumb = len(blocks) - 1
blocks[blocksNumb] = []
# 每种方块形状有四个方向,以0~3表示。配置文件中只记录一个方向形状,另外三个方向的矩阵排列在sysInit中通过调用transform计算出来。
blocks[blocksNumb].append([])
row = temp.split(";")
for r in range(len(row)):
col = []
ct = row[r].split(",")
# 对矩阵列数据做规整,首先将非“1”的值全修正成“0”以过滤空字串或回车符。
for c in range(len(ct)):
if ct[c] != "1":
col.append(0)
else:
col.append(1)
# 将不足4列的矩阵通过补“0”的方式,补足4列。
for c in range(len(ct) - 1, 3):
col.append(0)
blocks[blocksNumb][0].append(col)
# 如果矩阵某行没有方块,则配置文件中可以省略此行,程序会在末尾补上空行数据。
for r in range(len(row) - 1, 3):
blocks[blocksNumb][0].append([0, 0, 0, 0])
blocks[blocksNumb][0] = formatBlock(blocks[blocksNumb][0])
def sysInit():
'''
系统初始化
包括pygame环境初始化,全局变量赋值,生成每个方块形状的四个方向矩阵。
'''
global defaultFont, screen, backSurface, clock, blocks, stage, gameOver, fallSpeed, beginFallSpeed, nowBlock, nextBlock, score, level, clearLineScore, pause
# pygame运行环境初始化
pg.init()
screen = pg.display.set_mode((500, 550))
backSurface = pg.Surface((screen.get_rect().width, screen.get_rect().height))
pg.display.set_caption("block")
clock = pg.time.Clock()
pg.mouse.set_visible(False)
# 游戏全局变量初始化
defaultFont = pg.font.Font(None, 16) # yh.ttf这个字体文件请自行上网搜索下载,如果找不到就随便用个ttf格式字体文件替换一下。
nowBlock = None
nextBlock = None
gameOver = False
pause = False
score = 0
level = 1
clearLineScore = 0
beginFallSpeed = 20
fallSpeed = beginFallSpeed - level * 2
# 初始化游戏舞台
stage = []
for y in range(maxBlockHeight):
stage.append([])
for x in range(maxBlockWidth):
stage[y].append(EMPTY_CELL)
# 生成每个方块形状4个方向的矩阵数据
for x in range(len(blocks)):
# 因为重新开始游戏时会调用sysinit对系统所有参数重新初始化,为了避免方向矩阵数据重新生成,需要在此判断是否已经生成,如果已经生成则跳过。
if len(blocks[x]) < 2:
t = blocks[x][0]
for i in range(3):
t = transform(t, 1)
blocks[x].append(formatBlock(t))
# transform,removeTopBlank,formatBlock这三个函数只为生成方块形状4个方向矩阵使用,在游戏其他环节无作用,在阅读程序时可以先跳过。
def transform(block, direction=0):
'''
生成指定方块形状转换方向后的矩阵数据
args:
block:方块形状矩阵参数
direction:转换的方向,0代表向左,1代表向右
return:
变换方向后的方块形状矩阵参数
'''
result = []
for y in range(4):
result.append([])
for x in range(4):
if direction == 0:
result[y].append(block[x][3 - y])
else:
result[y].append(block[3 - x][y])
return result
def removeTopBlank(blo
听风吹等浪起
- 粉丝: 2w+
- 资源: 2320
最新资源
- python入门-17.最大子段和-团结!.py
- python入门-test-18.车厢重组.py
- 第56课 枚举2-20241227131043.pdf
- 基于 Flask 和 React 的前后端分离论坛全部资料+详细文档.zip
- 基于 Flask 和 WebSocket 实现的聊天室程序全部资料+详细文档.zip
- 基于 Scrapy 的新闻智能分类微信小程序,目的是打造出一个可以对新闻进行智能分类的微信小程序。技术栈:Python + Scrapy + MongoDB +
- 基于Flask 与Material Design的博客全部资料+详细文档.zip
- 基于bert4keras的命名实体识别flask展示全部资料+详细文档.zip
- 基于bert4keras关系抽取的flask展示全部资料+详细文档.zip
- 基于flask+MySQL的日程管理系统全部资料+详细文档.zip
- 基于Flask、MySQL和Bootstrap开发的图片分享社交网站。全部资料+详细文档.zip
- 基于Flask+Python3.6的电影网站项目全部资料+详细文档.zip
- 基于flask的web端三维模型重建系统-毕业设计全部资料+详细文档.zip
- 基于Flask的自然语言处理Web应用:人物观点提取,文本摘要,点评情感分类全部资料+详细文档.zip
- 基于Flask构建的无人机物流管理系统全部资料+详细文档.zip
- 基于flask框架的轻量级新闻资讯网站全部资料+详细文档.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈