基于Python-Pygame:200行代码实现完整的俄罗斯方块
源码:
# coding : utf-8#: pip install pygame
import random
import sys
import pygame#: 颜色定义
COLOR_WHITE = (255, 255, 255)
COLOR_BLACK = (0, 0, 0)class Block:"""小块"""width = 24height = 24@staticmethoddef draw(s, left, top, color, bg_color):pygame.draw.rect(s, bg_color, pygame.Rect(left, top, Block.width, Block.height))pygame.draw.rect(s, color, pygame.Rect(left, top, Block.width - 1, Block.height - 1))class Building:"""积木"""def __init__(self):"""方块的7种基本形状每次初始化随机选择一个形状@:return True / False"""self.form = random.choice([[[0, 0, 0, 0, 0],[0, 0, 1, 0, 0],[0, 1, 1, 1, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0]],[[0, 0, 0, 0, 0],[0, 0, 0, 0, 0],[1, 1, 1, 1, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0]],[[0, 0, 0, 0, 0],[0, 1, 1, 0, 0],[0, 0, 1, 1, 0],[0, 0, 0, 0, 0],[0, 0, 0, 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, 0, 0]],[[0, 0, 0, 0, 0],[0, 1, 1, 0, 0],[0, 0, 1, 0, 0],[0, 0, 1, 0, 0],[0, 0, 0, 0, 0]],[[0, 0, 0, 0, 0],[0, 0, 1, 1, 0],[0, 0, 1, 0, 0],[0, 0, 1, 0, 0],[0, 0, 0, 0, 0]],[[0, 0, 0, 0, 0],[0, 1, 1, 0, 0],[0, 1, 1, 0, 0],[0, 0, 0, 0, 0],[0, 0, 0, 0, 0]]])def __getitem__(self, pos):return self.form[pos]def __setitem__(self, key, value):self.form[key] = valueclass Layout:"""棋盘"""def __init__(self):self.block_x_count = 16;self.block_y_count = 22;self.layout = [[0 if 1 < i < self.block_x_count - 2 and j < self.block_y_count - 2 else 1for i in range(self.block_x_count)] for j in range(self.block_y_count)]@propertydef size(self):"""返回棋盘屏幕大小(width,height)"""return (self.block_x_count * Block.width, self.block_y_count * Block.height)def create_new_building(self):"""创建新的积木,初始化位置为第5,0格, 速度为4:return: 返回是否无空间创建了"""self.building = Building()self.building_left, self.building_top = 5, 0 #self.drop_speed = 3print(self.test_building_touch_wall())return self.test_building_touch_wall()@propertydef speed(self):return self.drop_speeddef test_building_touch_wall(self, x_offset=0, y_offset=0):"""积木是否已经触底/墙壁具体操作:判断积木最后一排的1,是否在当前棋牌对应的位置是也是1@:param x_offset: x的偏移量 移动时可以传入1/-1来判断@:param y_offset: y的偏移量 正常下落时可以传入1来判断"""for i in range(4, -1, -1):for j in range(5):if self.building[i][j]:if self.layout[i + self.building_top + y_offset][j + self.building_left + x_offset]:return Truereturn Falsedef move_left_right(self, x):"""左右移动@:param x: 移动量 x_offset"""#: 移动时不能撞墙if not self.test_building_touch_wall(x_offset=x):self.building_left += xdef down_build(self):""" 盒子的自动下移 """self.building_top += 1def direct_down(self):""" 手动快速降落 """self.drop_speed = 50def convert_building(self):"""* 扭转盒子的总方位 (右转)具体操作:把第一竖排的倒序给第一横排的把第二竖排的倒序给第二横排的后面同理."""new_box = [[0 for i in range(5)] for j in range(5)]for i in range(5):for j in range(4, -1, -1):new_box[i][j] = self.building[4 - j][i]self.building = new_boxdef clear_full_lines(self):"""消除满行的所有行"""new_layout = [[0 if 1 < i < self.block_x_count - 2 and j < self.block_y_count - 2 else 1for i in range(self.block_x_count)] for j in range(self.block_y_count)]row_len = self.block_x_count - 4new_row = self.block_y_count - 2 - 1for cur_row in range(self.block_y_count - 2 - 1, 0, -1):if sum(self.layout[cur_row][2:self.block_x_count - 2]) < row_len:new_layout[new_row] = self.layout[cur_row]new_row -= 1self.layout = new_layoutdef put_building_to_layout(self):"""将积木放到棋盘里"""for i in range(4, -1, -1):for j in range(5):if self.building[i][j]:self.layout[i + self.building_top][j + self.building_left] = 1#: 这里会调用消除函数self.clear_full_lines()def draw_building(self, s):"""显示积木@:param s : pygame = screen """cur_left, cur_top = self.building_left * Block.width, self.building_top * Block.heightfor i in range(5):for j in range(5):# 只画积木实体,不管盒子本身if self.building[j][i]:Block.draw(s, cur_left + i * Block.width, cur_top + j * Block.height, COLOR_BLACK, COLOR_WHITE)def draw(self, s):"""显示棋盘@:param s : pygame = screen """for i in range(self.block_x_count):for j in range(self.block_y_count):if self.layout[j][i] == 0:Block.draw(s, i * Block.width, j * Block.height, COLOR_WHITE, COLOR_BLACK)else:Block.draw(s, i * Block.width, j * Block.height, COLOR_BLACK, COLOR_WHITE)# -------------------------------------------------------------------
# Main
# -------------------------------------------------------------------
def main():#: 初始化while True:layout = Layout()layout.create_new_building()pygame.init()pygame.display.set_caption('俄罗斯方块')screen = pygame.display.set_mode((layout.size), 0, 32)is_over = False#: 单局游戏循环开始 [结束后直接重新开始]while not is_over:#: 处理游戏消息for e in pygame.event.get():if e.type == pygame.QUIT:sys.exit()#: 处理按键if e.type == pygame.KEYDOWN:if e.key == pygame.K_UP:layout.convert_building()if e.key == pygame.K_DOWN:layout.direct_down()if e.key == pygame.K_LEFT:layout.move_left_right(-1)if e.key == pygame.K_RIGHT:layout.move_left_right(1)#: 是否碰触底部地面了,是 -> 融合背景 否 -> 继续下落if layout.test_building_touch_wall(y_offset=1):layout.put_building_to_layout()is_over = layout.create_new_building()else:layout.down_build()#: 绘制layout.draw(screen)layout.draw_building(screen)pygame.display.update()#: 速度pygame.time.Clock().tick(layout.speed)if __name__ == '__main__':main()
效果:
基于Python-Pygame:200行代码实现完整的俄罗斯方块相关推荐
- Python用20行代码实现完整邮件功能 [完整代码+建议收藏]
大家好,我是Lex 喜欢欺负超人那个Lex 擅长领域:python开发.网络安全渗透.Windows域控Exchange架构 今日重点:python脚本实现发送邮件,邮件添加附件,读取接收邮件等功能. ...
- 基于Python使用10行代码改变图片像素大小
直接上代码: from PIL import Image #没有模块的先pip安装一下模块 def produceImage(file_in, width, height, file_out):ima ...
- 爬虫python代码-Python爬虫教程:200行代码实现一个滑动验证码
Python爬虫教程:教你用200行代码实现一个滑动验证码 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大 ...
- python爬虫代码-Python爬虫教程:200行代码实现一个滑动验证码
Python爬虫教程:教你用200行代码实现一个滑动验证码 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大 ...
- 宁愿“大小周”、每天只写 200 行代码、月薪 8k-17k 人群再涨!揭晓中国开发者真实现状...
作者 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 程序员,一个圈外人羡慕.圈内人喊苦的"神奇"职业--高薪.福利好是旁人羡慕的理由,高压.加班多却也是他们最常见的写照 ...
- js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...
本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...
- blockchain 区块链200行代码:在JavaScript实现的一个简单的例子
blockchain 区块链200行代码:在JavaScript实现的一个简单的例子 了解blockchain的概念很简单(区块链,交易链块):它是分布式的(即不是放置在同一台机器上,不同的网络设备上 ...
- JavaScript开发区块链只需200行代码
JavaScript开发区块链只需200行代码 用JavaScript开发实现一个简单区块链.通过这一开发过程,你将理解区块链技术是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表 ...
- 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)
不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN) 生成对抗网络(Generative Adversarial Networks,GAN)最早由 Ian Goodfello ...
最新文章
- 使用git上传代码到github
- 百度广告管家帮助站长“管好家”
- VMWare 6.0桥接模式虚拟机网络配置
- 山西DOT NET俱乐部
- Matlab读取点云数据显示
- 配置HDFS HttpFS和WebHDFS
- 姜健:为开源工作幸福且自豪
- 图形桌面linux触摸,新手看招:用图形桌面访问Linux操作系统
- 3904三极管是什么功能_什么是放大器。它有什么特性
- 【thinkphp】ThinkPHP各个低版本(=3.2)完全配置参考手册
- 10.related product , up-sell product and cross-sells
- 神经网络matlab仿真,MATLAB神经网络仿真与应用_IT教程网
- 【小小小白进行手机进行刷机测试 Ubuntu系统下安装adb工具、fastboot工具】
- java 生成er图标_设计数据库 ER 图太麻烦?不妨试试这两款工具,自动生成数据库 ER 图!!!...
- 代码安全审计工具推荐
- 1.3 PyCharm下载
- nuc972外部中断1实验代码
- Q-learning(强化学习)
- 微创新只是大公司用来挤压小公司的武器,但绝不是小公司与大公司竞争的法宝。——转自傅盛...
- 计算机软件著作权申请表中开发运行环境、技术特点等项目的编写指南