原标题:300行Python代码实现俄罗斯方块,致敬逝去的童年

本文代码基于 python3.6 和 pygame1.9.4。

俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块。但是想到旋转,停靠,消除等操作,感觉好像很难啊,等真正写完了发现,一共也就 300 行代码,并没有什么难的。

先来看一个游戏截图,有点丑,好吧,我没啥美术细胞,但是主体功能都实现了,可以玩起来。

本人对于Python学习创建了一个小小的学习圈子,为各位提供了一个平台,大家一起来讨论学习Python。欢迎各位到来

Python学习群:960410445一起讨论视频分享学习。Python是未来的发展方向,正在挑战我们的分析能力及对世界的认知方式,因此,我们与时俱进,迎接变化,并不断的成长,掌握Python核心技术,才是掌握真正的价值所在。

外形

俄罗斯方块整个界面分为两部分,一部分是左边的游戏区域,另一部分是右边的显示区域,显示得分、速度、下一个方块样式等。这里就不放截图了,看上图就可以。

游戏区域跟贪吃蛇一样,是由一个个小方格组成的,为了看得直观,我特意画了网格线。

方块

接下来就是要定义方块,方块的形状一共有以下 7 种:

I 型

O 型

T 型

S 型

Z 型

L 型

J 型

这里我做了多次的更改,因为方块最大的长度是长条形的,为4格,所以我统一用了 4 × 4 的方格来定义。这也是可以的,只是后来发现不方便。

为了直观,直接以一个二维数组来定义方块,其中 . 表示空的, 0 表示实心的。(用 . 表示空是为了看得直观,如果用空格会看不清。)

例如 I 行,以 4 × 4 方格定义为

['.0..',

'.0..',

'.0..',

'.0..']

['....',

'....',

'0000',

'....']

方块最难的是需要实现旋转功能,比如 I 型,就有横和竖两种形态。所谓旋转,表面上看,是把方块顺时针旋转了 90°,但实际做的时候,我们并不需要正真的去实现这个“旋转”的效果。

最终实现的时候,这些图形都是我们画在界面上的,而每一次刷新,界面上所有内容都会被清空重画,所以旋转只是画当前方块的时候不再画之前的形状,而是画旋转后的形状。

比如这个 I 型,定义成了 4 × 4 的形状,但实际上只需要 1 × 4 或 4 × 1 就可以了,其他剩下的地方都是空的。它不像 T 型,T 型不是一个矩形,如果用一个矩形来定义,必然有 2 个位置是空的。那么,I 型真的有必要定义成 4 × 4 吗?

答案是肯定的。想想看,如果是 4 × 1 的一个横条,旋转后变成 1 × 4 的竖条,这个位置怎么确定?好像有点困难。但是如果是 4 × 4 的正方形,我们只需要固定起点坐标(左上角)不变,把竖条的 4 × 4 直接替换掉横条的 4 × 4 区域,是不是就实现旋转了?而且位置很容易计算。

另外一点,在有些情况下是不可以旋转的。比如 I 型的竖条,在紧贴左右边框的时候是不可以旋转的。这点我有印象,可以肯定。但是对于其他的形状,我就不是很确定了,我百度搜了下,找了个网页版的俄罗斯方块玩了下,发现也是不可以的。例如:

在紧贴右边框的时候是无法旋转的。如果要每一个形状都去判断一下,那实在是太烦了。从方块的定义入手,就可以很简单的实现。

例如竖条行,定义是:

['.0..',

'.0..',

'.0..',

'.0..']

竖条是可以贴边的,所以当它在最左边的时候,X 轴坐标是 -1,这是因为定义中左边一竖排是空的。我们只需判定,当方块所定义的形状(包括空的部分)完全在游戏区域内时才可以旋转。

我之前所说,全都定义成 4 × 4 不好,原因就在这里,对于 T 型等其他形状,无法做这个判定。所以,对于 T 型等形状,我们可以定义成 3 × 3 的格式:

['.0.',

'000',

'...']

还有一种情况是无法旋转的,就是旋转后的位置已经被别的方块占了。另外下落,左右移动,都要做这个判断。既然这些是一致的,那么就可以用同一个方法来判断。

先要定义一个 game_area 变量,用于存放整个游戏区域当前的状态:

game_area = [['.'] * BLOCK_WIDTHfor_inrange(BLOCK_HEIGHT)]

初始状态全是空的,所以全部用 . 初始化就可以了。

另外,需要一些变量定义当前下落方块的状态

cur_block= None# 当前下落方块

cur_pos_x, cur_pos_y = 0, 0 # 当前下落方块的坐标

方块我们是以二维数组的方式定义的,并且存在空行和空列,如果我们遍历这个二维数组判断其所在的区域在当前游戏区域内是否已经被别的方块所占,这个是可以实现的。我们考虑另外一种情况,一个竖条形,左边一排是空的,这空的一排是可以移出游戏区域的,这个怎么判断?每次左移的时候都去判断一下左边一排全都是空吗?这太麻烦了。并且方块都是固定的,所以这些我们可以提前定义好。最终方块定义如下:

方块需要包含两个方法,获取随机一个方块和旋转时获取旋转后的方块

判断是否可以旋转,下落,移动的方法也很容易实现了

停靠

最后一个问题是停靠,当方块下落到底或者遇到别的方块之后,就不能在下落了。我将此称之为“停靠”,有个名字说起来也方便一点。

首先是要判断是否可以停靠,停靠发生之后,就是将当前方块的非空点画到游戏区域上,说白了,就是将 cur_block 的非空点按对应位置复制到 game_area 里去。并且计算是否有一排被全部填满了,全部填满则消除。

至此,整个俄罗斯方块的主体功能就算是完成了。

这里很多参数是可以调的,例如觉得旋转别扭,可以直接调整方块的定义,而无需去改动代码逻辑。返回搜狐,查看更多

责任编辑:

python童年_300行Python代码实现俄罗斯方块,致敬逝去的童年相关推荐

  1. 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)

    前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...

  2. pil python 安装_20行Python代码给微信头像戴帽子

    作者 | Leauky,北理工硕士在读,非CS专业的Python爱好者. 朋友圈里@微信官方要求戴圣诞帽的活动曾经火爆一时,有些会玩的小伙伴都悄咪咪地用美图秀秀一类的 app 给自己头像 p 一顶,然 ...

  3. [转载] python 卷积_40 行 Python 代码,实现卷积特征可视化

    参考链接: 使用Python3跟踪鸟类迁移 卷积神经网络(CNN)变革了计算机视觉,并将彻底改变整个世界.因此,开发解释 CNN 的技术也同样是一个重要的研究领域.本文将向你解释如何仅使用 40 行 ...

  4. python 验证码_4行Python代码生成图像验证码

    点击上方蓝色字体,关注我们 最近无意看到网上有人使用Python编写几十行代码生成图像验证码,感觉很是繁琐,这里为各位朋友推荐两种方法,使用4行Python代码即可生成验证码. 1 captcha库 ...

  5. 60行JavaScript代码写俄罗斯方块

    教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏 早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要 ...

  6. 我的世界python俄罗斯方块_300行Python代码实现俄罗斯方块,致敬逝去的童年

    本文代码基于 python3.6 和 pygame1.9.4. 俄罗斯方块是儿时最经典的游戏之一,刚开始接触 pygame 的时候就想写一个俄罗斯方块.但是想到旋转,停靠,消除等操作,感觉好像很难啊, ...

  7. 三百行python代码的项目_300行Python代码打造实用接口测试框架

    在刚开始实现ApiTestEngine的时候,卡斯(kasi)提议做一个Java版的.对于这样的建议,我当然是拒绝的,瞬即回复了他,"人生苦短,回头是岸啊". 当然,我没好意思跟他 ...

  8. python一千行入门代码-用Python三十行代码快速生成1000条随机评教内容

    随着大家使用评教的人越来越多,评教的内容确实一尘不变,有点不太好,所以昨天花了一个晚上的时间,用Python撸了一个随机生成评教内容的程序. 代码已经全部推送到github上,点击阅读原文查看 原理很 ...

  9. python一千行入门代码-Python 有哪些一千行左右的经典练手项目?

    谢邀.据我了解,没有千行左右的「经典」练手项目.但是我可以推荐一些练手项目.这些项目来着 教你阅读Python开源项目代码 - Python之美 - 知乎专栏 : 和工作中看别人代码差不多,基本每个人 ...

最新文章

  1. 白盒测试方法之条件覆盖测试
  2. python中国大学排名爬虫写明详细步骤-python中国大学排名爬虫
  3. 注册界面php mysql_php:用户登录注册并存入数据库的简单网页示例
  4. java逆向基础,Java逆向基础之函数
  5. vuepress侧边栏配置_VuePress搭建静态博客网站
  6. 基因分子生物学(1)-基因常识与DNA常识
  7. TCP协议的三次握手和四次分手
  8. pcm转换在线工具_有木有好用的CAD格式转换工具可以推荐?在线等,挺急的
  9. 12平键标准尺寸规格表_郑州花纹板加工规格尺寸表
  10. pku 3207 Ikki's Story IV - Panda's Trick 2-sat判定是否存在可行解
  11. JAVA屏幕截图与水印添加程序-HEHEHEScreenshot
  12. python-socket模块基本用法收集
  13. 2016-06-17 nui构件隐藏时相关属性的设置 bug命名【彩虹】
  14. 大学生职业生涯规划包word,ppt模板以及必备素材
  15. java咖啡系统,附源代码
  16. 约翰霍普金斯大学计算机博士收入,约翰霍普金斯大学计算机科学研究生项目详情!...
  17. 四大网络抓包神器,总有一款适合你......
  18. NAACL 2022事件相关(事件抽取、事件关系抽取、事件预测等)论文汇总
  19. Android7.0解决 android.os.FileUriExposedException: file:///storage/emulated/0/
  20. RISC-V 实现整数运算指令(Part 1)

热门文章

  1. LeetCode 29. 两数相除(位运算)
  2. springboot listener_Springboot 监听redis key的过期事件
  3. 网站服务器令牌获取,adobe - 获取Adobe Sign访问令牌以进行服务器到服务器身份验证 - 堆栈内存溢出...
  4. Power BI 数据可视化软件实现共享报表
  5. Power BI 如何获取数据做可视化
  6. 海洋分享lol皮肤插件_LOL战斗之夜客户端BUG频出服务器爆满!如何提前领取皮肤?...
  7. 谷歌:CNN击败Transformer,有望成为预训练界新霸主!LeCun却沉默了...
  8. Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)
  9. 图谱实战 | 李翔:美团到店综合知识图谱的构建与应用
  10. 论文浅尝 - AAAI2020 | 多轮对话系统中的历史自适应知识融合机制