python小欢喜(八)俄罗斯方块 (3) 组合对象的旋转
在前一篇文章《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) 组合对象的旋转相关推荐
- python小欢喜(八)俄罗斯方块 (5) 生成各种组合形状
前面的文章<python小欢喜(八)俄罗斯方块 (2)由方块组成复杂的形状>只是实现了"横条"与"竖条"两种组合形状.接下来介绍生成更多复杂的组合形 ...
- python小欢喜(七)游戏编程 (2) 挡球游戏的改进:使用中文提示并添加声音效果
在前面的文章<python小欢喜(六)动画 (1) pygame的安装与初步使用>中介绍了如何安装pygame. <python小欢喜(七)游戏编程 (1) 挡球>实现了一个小 ...
- python小欢喜(七)游戏编程 (3) 高山滑雪
引子 在前面的文章 <python小欢喜(七)游戏编程 (1) 挡球>实现了一个小游戏.不过这个游戏过于简单,没有什么趣味性.接下来介绍一款更加好玩的游戏的开发. 该游戏名为高山滑雪,改编 ...
- python编的俄罗斯方块游戏_手把手制作Python小游戏:俄罗斯方块(一)
手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...
- python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)
手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...
- python小欢喜(六)动画 (2) 移动的笑脸
在前一篇文章<python小欢喜(六)动画 (1) pygame的安装与初步使用>中介绍了如何安装pygame.接下来咱们用pygame做一些有趣的动画效果 显示笑脸图片 python代码 ...
- python小欢喜(一)写一个python程序如此简单
python是一门有趣又有用的语言. 如何才能学会python呢? 跟我嗨起来吧,我们要用最简单的方法,最快的速度学会python. 相信我,凡事都有捷径,学python也不例外. 咱们需要做点什么准 ...
- 【Python小游戏】俄罗斯方块
摘要:这篇文章主要介绍了使用PyQt5模块来设计一个俄罗斯方块的小游戏. 游戏示例:如下视频演示了一个简单的游戏界面 视频演示地址 游戏主要说明: 俄罗斯方块主要涉及了五个类别19种图形,每个图形为4 ...
- python特性(八):生成器对象的send方法
生成器对象是一个迭代器.但是它比迭代器对象多了一些方法,它们包括send方法,throw方法和close方法.这些方法,主要是用于外部与生成器对象的交互.本文先介绍send方法. send方法有一个参 ...
- python小欢喜(三)超级计算器
在日常生活中,我们经常用到计算器,计算器可以帮助我们快速得到数学算式的结果.在电脑上,也有计算器软件,计算器软件的界面与实际的计算器很类似,功能更加强大. 如果学会了python语言,我们将拥有一个比 ...
最新文章
- 如何使用Web Audio API听到“ Yanny”和“ Laurel”的声音
- 浏览器复制不进行url编码_谷歌浏览器测试版支持在PC上复制号码并操作关联安卓设备进行拨打...
- 【Leetcode | 02】二叉树、线性表目录
- Android 系统(220)---如何快速对系统重启问题进行归类
- 马云给雅虎员工作的精彩演讲:爱迪生欺骗了世界!
- 西安石油大学计算机类分专业,西安石油大学2019年分专业录取分数解读
- 无代码编程的兴起:借助无代码平台,无需编写任何基础代码即可开发软件
- 浏览班级为计算机的同学记录的命令,2011年全国计算机等级考试二级VFP笔记(4)...
- mysql cmd 常用命令
- 求职面试准备——自我介绍
- 微信安装旧版本方法,版本过低,请升级最新版本
- ISME:全基因组关联研究揭示了控制根际微生物组遗传力的植物基因位点
- mysql 漏洞 wa_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战
- 基于Redis实现查找附近的人
- 菜鸡学C语言之真心话大冒险
- postgresql中patroni集群备库手动还原后,hac启动日志比主库多1
- XDOJ例题及答案第八更 密码编译 密码强度 排序2 排序3 排序算法比较器 判断奇偶性 平均数 气温波动 亲和数 求交错序列前N项和 求平均值求奇数的和
- STM32驱动2位数码管
- 淘宝自动回复机器人配置手册——售前模板配置(上)
- 计算机核心期刊新排名!
热门文章
- 20春季 7-2 The Judger (25 分)
- Unity实战篇 |制作一个跟随鼠标转向的 简易箭头指示标,包括 UI指向 和 3D指向标
- 笔记本无网络计算机,笔记本没有无线网络连接怎么办 解决方法介绍【图解】...
- python_中位数
- VMware虚拟机下载及Ubuntu安装指南
- 第十篇:React 中的“栈调和”(Stack Reconciler)过程是怎样的?
- html,css使用表格制作课程表
- 嵌入式系统开发环境概述
- CPU计算机性能的操作方法,电脑CPU性能测试最佳方法分享 赶紧学一下
- 二项分布与伯努利试验的关系,看图说话