python小欢喜(八)俄罗斯方块 (9) 按向下的方向键时加速下落

阅读: 评论:0

python小欢喜(八)俄罗斯方块 (9) 按向下的方向键时加速下落

python小欢喜(八)俄罗斯方块 (9) 按向下的方向键时加速下落

前面的文章《python小欢喜(八)俄罗斯方块 (6) 源码文件的初步组织》将源代码分成了3个独立的文件
config.py,block.py,main.py

在前面的例子中,方块以恒定的速度下落。接下来实现一个功能,在按下向下的方向键后,方块以更快的速度下落。为了实现这一点,修改block.py中 FallingGroup 类,为其添加属性

#下落速度self.downSpeed = Config.downSpeed

在main.py的 animate 函数中添加如下代码

#根据下落速度,计算出两个检查点的间隔时间(单位毫秒),如果到达了下一个检查点,则执行下落方法if _ticks() - lastCheckPoint > 1000/fallingGroup.downSpeed:#下落方块组合执行下落方法fallingGroup.down(Config.blockWidth)lastCheckPoint = _ticks()

其中

1000/fallingGroup.downSpeed

是两次检查点间的间隔时间,从上面的表达式可以看了,如果下落速度fallingGroup.downSpeed的值越大,则间隔时间越短。其初始值为2,也就是说500ms才会执行一次 down 操作。

在main.py的事件处理循环中添加对 向下方向键的处理

elif event.key == pygame.K_DOWN:      #如果按下了向下的方向键#下落速度乘以100fallingGroup.downSpeed*=100

当按下向下的方向键后,下落速度增加了100倍,两个检查点的间隔变成了10ms,即每10ms ,方块就下落1格。

另外对代码的一些小细节,做了一些重构,比如原来的变量speed被重新命名为distance,使得代码的含义更清晰。

完整的python代码

config.py

# config.py
# 配置数据,全局变量的定义#颜色常量的定义
BLACK = (0,0,0)       # 用RGB值定义黑色
WHITE = (255,255,255) # 用RGB值定义白色#配置参数类
class Config():def __init__(self):passscreenWidth = 600screenHeight= 800blockWidth = 40blockColor = 'blue'downSpeed = 2#方块组合形状的二维矩阵图示,1表示该处有方块,0表示没有
shapeGraph=[
(
[1,1,1,1],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
),
(
[0,1,0,0],
[1,1,1,0],
[0,0,0,0],
[0,0,0,0],
),
(
[1,0,0,0],
[1,0,0,0],
[1,0,0,0],
[1,0,0,0],
),
(
[1,1,1,0],
[1,0,0,0],
[0,0,0,0],
[0,0,0,0],
),
(
[1,0,0,0],
[1,0,0,0],
[1,1,0,0],
[0,0,0,0],
),
(
[1,1,0,0],
[1,0,0,0],
[1,0,0,0],
[0,0,0,0],
),
(
[1,0,0,0],
[1,1,0,0],
[1,0,0,0],
[0,0,0,0],
),
(
[1,1,0,0],
[0,1,1,0],
[0,0,0,0],
[0,0,0,0],
),
(
[1,1,0,0],
[1,1,0,0],
[0,0,0,0],
[0,0,0,0],
),
]#将形状图转换为形状坐标列表
def shpaeGraph2List(shapeGraph):shapeList =[]for g in shapeGraph:shape=[]for y in range(4):for x in range(4):if g[y][x] == 1 :shape.append([x*Config.blockWidth,y*Config.blockWidth])shapeList.append(shape)return shapeList#存放形状初始坐标列表的全局变量 shapeList
shapeList = shpaeGraph2List(shapeGraph)

block.py

# block.py
# 方块及方块组合类的定义import pygame
from PIL import Image,ImageDraw
from config import *# 方块类
class Block(pygame.sprite.Sprite):def __init__(self,x,y):self.inix = xself.iniy = ypygame.sprite.Sprite.__init__(self)     self.image = ateBlockImg() = _rect()         =  = y#生成方块图片def createBlockImg(self):#生成一个指定大小与颜色的矩形图像im = w('RGB',(Config.blockWidth,Config.blockWidth),Config.blockColor)draw = ImageDraw.Draw(im)#画一个黑色的边框draw.line([(0,0),(0,Config.blockWidth)],'black',1)draw.line([(0,Config.blockWidth),(Config.blockWidth,Config.blockWidth)],'black',1)draw.line([(Config.blockWidth,Config.blockWidth),(Config.blockWidth,0)],'black',1)draw.line([(Config.blockWidth,0),(0,0)],'black',1)data = im.tobytes()      #转换成字节size = im.size           #图形分辨率mode = im.mode        return pygame.image.fromstring(data,size,mode)#重置初始位置def reset(self): =  = self.iniy#方块向下移动def down(self,distance):# 向下移动y += distance       #方块左右移动def move(self,distance):# 左右移动x += distance # 表示下落中的多个方块的组合,typeIdx指明组合形状在shapeList中的索引
class FallingGroup(pygame.sprite.Group):def __init__(self, typeIdx,bottomGroup):self.bottomGroup = bottomGrouppygame.sprite.Group.__init__(self)iniX = int((Config.screenWidth/2)/Config.blockWidth)*Config.blockWidthshape = shapeList[typeIdx]       for xyPair in shape:x = iniX+xyPair[0]y = xyPair[1]             self.add(Block(x,y)) #得到组合对象的包络矩形     = self.boundingRect()#记录初始位置,此处要使用copy方法    self.iniRect = py()#下落速度self.downSpeed = Config.downSpeed#重置初始位置def reset(self):#恢复初始位置,此处要使用copy方法   = py()       for block in self.sprites():set()#方块组合向下移动def down(self, distance):if not llided(self): += distancefor block in self.sprites():block.down(distance)           else:#set()self.bottomGroup.eat(self)              #方块组合左右移动def move(self, distance):#print([,,height])if (distance > 0  < width) or (distance < 0  > 0): += distancefor block in self.sprites():ve(distance) #求出包围组合对象的矩形def boundingRect(self):minX = Config.screenWidth+100minY = Config.screenHeight+100maxX = -100maxY = -100for block in self.sprites(): < minX:minX =  < minY:minY =  > maxX:maxX =  > maxY:maxY = urn pygame.Rect(minX,minY,maxX-minX+Config.blockWidth,maxY-minY+Config.blockWidth)#旋转def rotate(self):#取组合对象的中心点作为旋转中心,旋转中心应位于网格点上    cx=int((&#width/2)/Config.blockWidth)*Config.blockWidthcy=int((&#height/2)/Config.blockWidth)*Config.blockWidthfor block in self.sprites():#求出当前方块的中心与旋转中心的距离差dx = x -cxdy = y -cy#距离差组成的复数 乘上 复数 i ,得到的复数是 原复数逆时针旋转90度的结果r  = complex(dx,dy)*complex(0,1)#得到旋转之后的结果x = cx + r.real + entery = cy + r.imag#取得包络矩形的原始水平位置lastRectX =             #更新组合对象的包络矩形 = self.boundingRect()dx =  lastRectX -  #使得旋转后的组合对象的水平位置保持不变 += dxfor block in self.sprites():+=dx# 表示底部方块的组合
class BottomGroup(pygame.sprite.Group):def __init__(self):pygame.sprite.Group.__init__(self)#预设一行方块,放置在窗口下边界之下,不会显示,但可用于让下落的方块停下来n = int(Config.screenWidth/Config.blockWidth)for i in range(n):#测试时故意让预设的一行方块向上移动一行,这样就可显示出来,可以看到碰撞检测的效果y= Config.screenHeight-Config.blockWidth#y= Config.screenHeightx= i*Config.blockWidthself.add(Block(x,y))#检查下落的方块是否与底部方块发生了碰撞def collided(self,fallingGroup):for d in fallingGroup.sprites():for b in self.sprites(): - d.rect.y <=Config.blockWidth  == d.rect.x:return Truereturn False#吃掉下落的方块def eat(self,fallingGroup):for d in fallingGroup.sprites():self.add(pty()

main.py

# main.py
# 俄罗斯方块,主程序所在文件import pygame
from block import *
import random#随机生成下落方块组合
def randomFallingGroup():return FallingGroup(typeIdx=random.randint(0,8),bottomGroup=bottomGroup)# 重绘显示区域,形成动画效果
def animate():global fallingGroup,bottomGroup,lastCheckPoint#设置屏幕为黑色screen.fill(BLACK)#根据下落速度,计算出两个检查点的间隔时间(单位毫秒),如果到达了下一个检查点,则执行下落方法if _ticks() - lastCheckPoint > 1000/fallingGroup.downSpeed:#下落方块组合执行下落方法fallingGroup.down(Config.blockWidth)lastCheckPoint = _ticks()#如果下落的方块组合已经被底部方块组合“吃”掉了,则生成新的下落方块组合if len(fallingGroup.sprites()) <= 0:fallingGroup = randomFallingGroup()#下落方块组合执行绘制方法fallingGroup.draw(screen) #底部方块组合执行绘制方法bottomGroup.draw(screen)   #刷新屏幕 pygame.display.flip() # ------------------------main---------------------------------------------------------------------# 初始化各种对象
pygame.init()
#游戏窗口的屏幕
screen = pygame.display.set_mode([Config.screenWidth,Config.screenHeight])
#用黑色填充背景
screen.fill(BLACK)
#设置图形窗口标题
pygame.display.set_caption("俄罗斯方块") 
#游戏时钟
clock = pygame.time.Clock()#生成底部方块组合对象
bottomGroup =BottomGroup()#随机生成一个下落方块组合对象
fallingGroup = randomFallingGroup()#下落时刻检查点
lastCheckPoint = _ticks()# 事件处理循环
running = True
while running:#设定每秒帧数clock.tick(30) for event in ():    pe == pygame.QUIT: running = pe == pygame.KEYDOWN:          # 如果按下了键盘上的键if event.key == pygame.K_LEFT:        # 如果按下了向左的方向键#向左平移一格ve(-1*Config.blockWidth)elif event.key == pygame.K_RIGHT:     #如果按下了向右的方向键#向右平移一格ve(Config.blockWidth)elif event.key == pygame.K_UP:        #如果按下了向上的方向键#调用旋转方法ate()elif event.key == pygame.K_DOWN:      #如果按下了向下的方向键#下落速度乘以100fallingGroup.downSpeed*=100#调用绘制动画的方法animate()  
pygame.quit() #退出pygame

本文发布于:2024-01-28 09:49:50,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064065966559.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23