源码:

# 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行代码实现完整的俄罗斯方块相关推荐

  1. Python用20行代码实现完整邮件功能 [完整代码+建议收藏]

    大家好,我是Lex 喜欢欺负超人那个Lex 擅长领域:python开发.网络安全渗透.Windows域控Exchange架构 今日重点:python脚本实现发送邮件,邮件添加附件,读取接收邮件等功能. ...

  2. 基于Python使用10行代码改变图片像素大小

    直接上代码: from PIL import Image #没有模块的先pip安装一下模块 def produceImage(file_in, width, height, file_out):ima ...

  3. 爬虫python代码-Python爬虫教程:200行代码实现一个滑动验证码

    Python爬虫教程:教你用200行代码实现一个滑动验证码 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大 ...

  4. python爬虫代码-Python爬虫教程:200行代码实现一个滑动验证码

    Python爬虫教程:教你用200行代码实现一个滑动验证码 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大 ...

  5. 宁愿“大小周”、每天只写 200 行代码、月薪 8k-17k 人群再涨!揭晓中国开发者真实现状...

    作者 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 程序员,一个圈外人羡慕.圈内人喊苦的"神奇"职业--高薪.福利好是旁人羡慕的理由,高压.加班多却也是他们最常见的写照 ...

  6. js websocket同步等待_WebSocket硬核入门:200行代码,教你徒手撸一个WebSocket服务器...

    本文原题"Node.js - 200 多行代码实现 Websocket 协议",为了提升内容品质,有较大修订. 1.引言 最近正在研究 WebSocket 相关的知识,想着如何能自 ...

  7. blockchain 区块链200行代码:在JavaScript实现的一个简单的例子

    blockchain 区块链200行代码:在JavaScript实现的一个简单的例子 了解blockchain的概念很简单(区块链,交易链块):它是分布式的(即不是放置在同一台机器上,不同的网络设备上 ...

  8. JavaScript开发区块链只需200行代码

    JavaScript开发区块链只需200行代码 用JavaScript开发实现一个简单区块链.通过这一开发过程,你将理解区块链技术是什么:区块链就是一个分布式数据库,存储结构是一个不断增长的链表,链表 ...

  9. 不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN)

     不到 200 行代码,教你如何用 Keras 搭建生成对抗网络(GAN) 生成对抗网络(Generative Adversarial Networks,GAN)最早由 Ian Goodfello ...

最新文章

  1. 移植uboot第五步:支持NORFlash
  2. 参数(parameter)和属性(attribute)的区别
  3. 萨默尔机器人_第四届丝博会人工智能受热捧 机器人会送餐会协助办案
  4. JDK8的排序大法!!
  5. 信息学奥赛一本通C++语言——1020: 打印ASCII码
  6. linux ubuntu 12.04 下默认是安装了openjdk的
  7. Silverlight 4.0 Accordion 解决ScrollViewer 的问题
  8. 【java】对学生成绩进行排序
  9. TFS小记(3):建立团队项目
  10. java混淆工具zelix比较_常用的5款java混淆器
  11. 简单介绍谷歌关键词扩展工具
  12. 手机通讯录分组名称_个人通讯录如何批量导入/导出
  13. 微信扫描小程序码登录 PC 网站 Demo
  14. 山东大学计算机学院复试名单,山东大学2012计算机学院拟录取名单。
  15. APK查壳软件(根据so名)
  16. NVIDIA GeForce Go 6100 for Wndows 7 (笔记本)
  17. 用星坐标(Star Coordinates)表示高维数据
  18. 《花田小院》丨国风版《梦幻花园》
  19. 什么是搜索词?有什么用?
  20. 《机器学习》周志华 --第3章 线性模型 思维导图+笔记+习题

热门文章

  1. linux查看磁盘io的几种方法
  2. golang redis 队列删除图片
  3. Learning Data Structure_2_线性表、栈和队列
  4. AngularJS从构建项目开始
  5. BMP文件格式详解(BMP file format) (转)
  6. 18句正能量话语,送给自己也送给你
  7. JUnit的优点在于什么地方?和main方法有什么不同?
  8. 显示器颜色偏灰不鲜明_你离学会后期调色,只差了一块颜色“正确”的摄影显示器...
  9. visual studio 代码提示插件_程序员请收好:10个非常有用的Visual Studio Code插件
  10. 姓名的首字母组成的图案C语言怎么编,c语言编写一个程序,根据用户输入英文名和姓先显示姓氏,其后跟一个逗号,然后显示名的首字母:...