在前一篇文章《python小欢喜(八)俄罗斯方块 (2)由方块组成复杂的形状》介始了如何由多个小方块组合成横条状与竖条状,并且可以用方向键控制左右移动,接下来介绍如何实现组合对像的旋转

4个方块组成一个横条的旋转效果如下:

python 代码如下:

# 俄罗斯方块,组合对象的旋转import pygame, sys#颜色常量的定义
BLACK = (0,0,0)       # 用RGB值定义黑色
WHITE = (255,255,255) # 用RGB值定义白色#配置参数类
class Config():def __init__(self):passscreenWidth = 600screenHeight= 800blockWidth = 40speed = 40# 方块类
class Block(pygame.sprite.Sprite):def __init__(self,x,y):self.inix = xself.iniy = ypygame.sprite.Sprite.__init__(self)self.image = pygame.image.load("block4.png")self.rect = self.image.get_rect()        self.rect.x = xself.rect.y = y#重置初始位置def reset(self):self.rect.x = self.inixself.rect.y = self.iniy#方块向下移动def down(self, speed):# 向下移动self.rect.centery += speed        #方块左右移动def move(self, speed):# 左右移动self.rect.centerx += speed# 表示多个方块的组合,type指明组合的类形
class BlockGroup(pygame.sprite.Group):def __init__(self, type):pygame.sprite.Group.__init__(self)self.blocks=[]   if type == '横条':for i in range(4):y = 0x = i*Config.blockWidthself.blocks.append(Block(x,y))self.add(self.blocks[i])                if type == '竖条':for i in range(4):x = 0y = i*Config.blockWidthself.blocks.append(Block(x,y))self.add(self.blocks[i])     #得到组合对象的包络矩形    self.rect = self.boundingRect()#记录初始位置,此处要使用copy方法    self.iniRect = self.rect.copy()#重置初始位置def reset(self):#恢复初始位置,此处要使用copy方法  self.rect = self.iniRect.copy()       for block in self.blocks:block.reset()#方块组合向下移动def down(self, speed):if self.rect.y <= Config.screenHeight:self.rect.y += speedfor block in self.blocks:block.down(speed)           else:self.reset()                #方块组合左右移动def move(self, speed):if (speed > 0 and self.rect.x < Config.screenWidth-self.rect.width) or (speed < 0 and self.rect.x > 0):self.rect.x += speedfor block in self.blocks:block.move(speed) #求出包围组合对象的矩形def boundingRect(self):minX = Config.screenWidth+100minY = Config.screenHeight+100maxX = -100maxY = -100for block in self.blocks:if block.rect.x < minX:minX = block.rect.xif block.rect.y < minY:minY = block.rect.yif block.rect.x > maxX:maxX = block.rect.xif block.rect.y > maxY:maxY = block.rect.yreturn pygame.Rect(minX,minY,maxX-minX+Config.blockWidth,maxY-minY+Config.blockWidth)#旋转def rotate(self):#取第1个方块的中心作为整个组合对象的旋转中心    cx=self.blocks[1].rect.centerxcy=self.blocks[1].rect.centeryfor i in range(4):#求出当前方块的中心与旋转中心的距离差dx = self.blocks[i].rect.centerx -cxdy = self.blocks[i].rect.centery -cy#距离差组成的复数 乘上 复数 i ,得到的复数是 原复数逆时针旋转90度的结果r  = complex(dx,dy)*complex(0,1)#得到旋转之后的结果self.blocks[i].rect.centerx = cx + r.realself.blocks[i].rect.centery = cy + r.imag            #更新组合对象的包络矩形self.rect = self.boundingRect()                    # 重绘显示区域,形成动画效果
def animate():screen.fill(BLACK)blockGroup.down(speed)blockGroup.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()
#方块移动的速度
speed = Config.speed#生成一个方块组合对象
blockGroup = BlockGroup('横条')
#blockGroup = BlockGroup('竖条')# 事件处理循环
running = True
while running:#设定每秒帧数,为了实现俄罗斯方块一格一格的下落效果,将帧率设得很低,相应的下降速度(每秒位移量)等于方块的边长clock.tick(2) for event in pygame.event.get():    if event.type == pygame.QUIT: running = Falseif event.type == pygame.KEYDOWN:          # 如果按下了键盘上的键if event.key == pygame.K_LEFT:        # 如果按下了向左的方向键blockGroup.move(-1*speed)elif event.key == pygame.K_RIGHT:     #如果按下了向右的方向键blockGroup.move(speed)elif event.key == pygame.K_UP:        #如果按下了向上的方向键blockGroup.rotate()animate()
pygame.quit() #退出pygame

与旋转相关的功能的关键代码如下:

    #旋转def rotate(self):#取第1个方块的中心作为整个组合对象的旋转中心    cx=self.blocks[1].rect.centerxcy=self.blocks[1].rect.centeryfor i in range(4):#求出当前方块的中心与旋转中心的距离差dx = self.blocks[i].rect.centerx -cxdy = self.blocks[i].rect.centery -cy#距离差组成的复数 乘上 复数 i ,得到的复数是 原复数逆时针旋转90度的结果r  = complex(dx,dy)*complex(0,1)#得到旋转之后的结果self.blocks[i].rect.centerx = cx + r.realself.blocks[i].rect.centery = cy + r.imag            #更新组合对象的包络矩形self.rect = self.boundingRect()

这个方法中用到一点数学知识。当一个复数(向量)乘以虚数单位 i ,结果向量是在原向量的基础上逆时针旋转90度的结果。

python小欢喜(八)俄罗斯方块 (3) 组合对象的旋转相关推荐

  1. python小欢喜(八)俄罗斯方块 (5) 生成各种组合形状

    前面的文章<python小欢喜(八)俄罗斯方块 (2)由方块组成复杂的形状>只是实现了"横条"与"竖条"两种组合形状.接下来介绍生成更多复杂的组合形 ...

  2. python小欢喜(七)游戏编程 (2) 挡球游戏的改进:使用中文提示并添加声音效果

    在前面的文章<python小欢喜(六)动画 (1) pygame的安装与初步使用>中介绍了如何安装pygame. <python小欢喜(七)游戏编程 (1) 挡球>实现了一个小 ...

  3. python小欢喜(七)游戏编程 (3) 高山滑雪

    引子 在前面的文章 <python小欢喜(七)游戏编程 (1) 挡球>实现了一个小游戏.不过这个游戏过于简单,没有什么趣味性.接下来介绍一款更加好玩的游戏的开发. 该游戏名为高山滑雪,改编 ...

  4. python编的俄罗斯方块游戏_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

  5. python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

  6. python小欢喜(六)动画 (2) 移动的笑脸

    在前一篇文章<python小欢喜(六)动画 (1) pygame的安装与初步使用>中介绍了如何安装pygame.接下来咱们用pygame做一些有趣的动画效果 显示笑脸图片 python代码 ...

  7. python小欢喜(一)写一个python程序如此简单

    python是一门有趣又有用的语言. 如何才能学会python呢? 跟我嗨起来吧,我们要用最简单的方法,最快的速度学会python. 相信我,凡事都有捷径,学python也不例外. 咱们需要做点什么准 ...

  8. 【Python小游戏】俄罗斯方块

    摘要:这篇文章主要介绍了使用PyQt5模块来设计一个俄罗斯方块的小游戏. 游戏示例:如下视频演示了一个简单的游戏界面 视频演示地址 游戏主要说明: 俄罗斯方块主要涉及了五个类别19种图形,每个图形为4 ...

  9. python特性(八):生成器对象的send方法

    生成器对象是一个迭代器.但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法.这些方法,主要是用于外部与生成器对象的交互.本文先介绍send方法. send方法有一个参 ...

  10. python小欢喜(三)超级计算器

    在日常生活中,我们经常用到计算器,计算器可以帮助我们快速得到数学算式的结果.在电脑上,也有计算器软件,计算器软件的界面与实际的计算器很类似,功能更加强大. 如果学会了python语言,我们将拥有一个比 ...

最新文章

  1. 如何使用Web Audio API听到“ Yanny”和“ Laurel”的声音
  2. 浏览器复制不进行url编码_谷歌浏览器测试版支持在PC上复制号码并操作关联安卓设备进行拨打...
  3. 【Leetcode | 02】二叉树、线性表目录
  4. Android 系统(220)---如何快速对系统重启问题进行归类
  5. 马云给雅虎员工作的精彩演讲:爱迪生欺骗了世界!
  6. 西安石油大学计算机类分专业,西安石油大学2019年分专业录取分数解读
  7. 无代码编程的兴起:借助无代码平台,无需编写任何基础代码即可开发软件
  8. 浏览班级为计算机的同学记录的命令,2011年全国计算机等级考试二级VFP笔记(4)...
  9. mysql cmd 常用命令
  10. 求职面试准备——自我介绍
  11. 微信安装旧版本方法,版本过低,请升级最新版本
  12. ISME:全基因组关联研究揭示了控制根际微生物组遗传力的植物基因位点
  13. mysql 漏洞 wa_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战
  14. 基于Redis实现查找附近的人
  15. 菜鸡学C语言之真心话大冒险
  16. postgresql中patroni集群备库手动还原后,hac启动日志比主库多1
  17. XDOJ例题及答案第八更 密码编译 密码强度 排序2 排序3 排序算法比较器 判断奇偶性 平均数 气温波动 亲和数 求交错序列前N项和 求平均值求奇数的和
  18. STM32驱动2位数码管
  19. 淘宝自动回复机器人配置手册——售前模板配置(上)
  20. 计算机核心期刊新排名!

热门文章

  1. 20春季 7-2 The Judger (25 分)
  2. Unity实战篇 |制作一个跟随鼠标转向的 简易箭头指示标,包括 UI指向 和 3D指向标
  3. 笔记本无网络计算机,笔记本没有无线网络连接怎么办 解决方法介绍【图解】...
  4. python_中位数
  5. VMware虚拟机下载及Ubuntu安装指南
  6. 第十篇:React 中的“栈调和”(Stack Reconciler)过程是怎样的?
  7. html,css使用表格制作课程表
  8. 嵌入式系统开发环境概述
  9. CPU计算机性能的操作方法,电脑CPU性能测试最佳方法分享 赶紧学一下
  10. 二项分布与伯努利试验的关系,看图说话