羊了个羊,但是Python简(li)单(pu)版
大家好,欢迎来到 Crossin的编程教室 !
要说最近最热门的游戏,那肯定是《羊了个羊》没跑了。
连续上了好几天热搜,火到连央视都来提醒谨防有人利用游戏之名诈骗。
但游戏爆火的另一面,也是无数玩家对于第二关难度的吐槽和不满。
如果你也像我一样,因为过不了关而不爽,不如自己用 Python 来写一个简单版,想过几关过几关
甚至还可以调个无解关卡去霍霍其他人
我这个版本不仅难度简单,代码也很简单,一共不到100行。代码已开源:
python666.cn/c/8
可下载,可修改,可商用,但公开发布需署名来源:Crossin的编程教室
做了一个同样简单的整活视频,供大家一乐:
稍微解释一下思路和代码:
1.
游戏用了 pygame-zero 这个库(所以才能这么少的代码实现),运行前需要安装 pgzero 库:
pip install pgzero
(或者通过 IDE 安装)
2.
运行时需要带上项目里的 images 和 music 文件夹(你可以替换里面的图片和音乐)
3.
每一张牌是一个 Actor 对象(相当于一般游戏开发中的精灵类),具有种类(12种各12张)、层级、状态(不可点/可点/已收集)等属性。
开局时随机打乱后摆放,根据种类显示不同图片。
除了最上层的牌可点,其余均不可点。
# 初始化牌组,12*12张牌随机打乱
ts = list(range(1, 13))*12
random.shuffle(ts)
n = 0
for k in range(7): # 7层
for i in range(7-k): #每层减1行
for j in range(7-k):
t = ts[n] #获取排种类
n += 1
tile = Actor(f'tile{t}') #使用tileX图片创建Actor对象
tile.pos = 120 + (k * 0.5 + j) * tile.width, 100 + (k * 0.5 + i) * tile.height * 0.9 #设定位置
tile.tag = t #记录种类
tile.layer = k #记录层级
tile.status = 1 if k == 6 else 0 #除了最顶层,状态都设置为0(不可点)这里是个简化实现
tiles.append(tile)
4.
判断鼠标点击的位置是否处于某张可点的牌内,是的话就从所有牌列表中移除,加到下方牌堆列表里。
然后遍历与这张牌有重叠的下一层牌,对于每张下层牌,反过来检查是否有其他上层牌覆盖它,如果没有,就把它变成可点。
for tile in reversed(tiles): #逆序循环是为了先判断上方的牌,如果点击了就直接跳出,避免重复判定
if tile.status == 1 and tile.collidepoint(pos):
# 状态1可点,并且鼠标在范围内
tile.status = 2
tiles.remove(tile)
diff = [t for t in docks if t.tag != tile.tag] #获取牌堆内不相同的牌
if len(docks) - len(diff) < 2: #如果相同的牌数量<2,就加进牌堆
docks.append(tile)
else: #否则用不相同的牌替换牌堆(即消除相同的牌)
docks = diff
for down in tiles: #遍历所有的牌
if down.layer == tile.layer - 1 and down.colliderect(tile): #如果在此牌的下一层,并且有重叠
for up in tiles: #那就再反过来判断这种被覆盖的牌,是否还有其他牌覆盖它
if up.layer == down.layer + 1 and up.colliderect(down): #如果有就跳出
break
else: #如果全都没有,说明它变成了可点状态
down.status = 1
return
5.
下方牌堆达到7张为失败,上方没有剩牌则为胜利
# 达到7张,失败
if len(docks) >= 7:
screen.blit('end', (0, 0))
# 没有剩牌,胜利
if len(tiles) == 0:
screen.blit('win', (0, 0))
6.
本demo距离《羊了个羊》尚有改进空间,有兴趣的小伙伴可自行尝试扩展,包括但不限于:
- 道具功能
- 增加收牌的动画效果(可以用 pgzero 提供的 animate 方法)
- 更多的关卡布局
- 打包成exe
- 游戏排行榜
- 当然还有游戏最最核心的部分:观看广告
代码已开源:
python666.cn/c/8
可下载,可修改,可商用,但公开发布需署名来源:Crossin的编程教室
如果喜欢的话,感谢帮忙点赞和转发,你的支持是我持续更新的动力!
我是Crossin,我们下个游戏见~
对了,哦,对了,如果你想学Python,记得来看下我的《人人都能学Python》系列。
零基础python入门 图文系列教程:python666.cn
相关文章
- aic准则python_Python数据科学:线性回归
- Python知识点(史上最全)
- 哪些软件是python编写出来的_用Python编程需要什么软件?
- Python安装whl文件之坑「建议收藏」
- Python入门系列(五)一篇搞懂python语句
- Python动态爬虫爬取京东商品评论[通俗易懂]
- python3 gil锁_python同步锁
- 【说站】python如何用函数删除空白
- 【说站】python选择排序算法的性能分析
- Python 小技巧-利用 itemgetter 提升排序速Python 小技巧-利用 itemgetter 提升排序速度
- python win32api sendmessage_Python win32api.SendMessage方法代码示例[通俗易懂]
- 【错误记录】PyCharm 运行 Python 程序报错 ( PEP 8: W292 no newline at end of file )
- python-Python与PostgreSQL数据库-PostgreSQL数据库的基本知识(一)
- Python实战之MySQL数据库操作详解编程语言
- Python杨辉三角算法详解编程语言
- 掌握Python访问MySQL的新技能(python访问mysql)
- python使用Python轻松操作Redis(redis-)
- python驱动使用pip安装MySQL Python驱动的简单步骤(pip安装mysql)
- 使用Python连接MySQL数据库,实现高效数据交互(python连接mysql)
- 使用cxoracle模块,开发Python与Oracle数据库的连接(cx_oracle模块)
- 如何把时间序列问题转化为监督学习问题?通俗易懂的 Python 教程
- python实现数通设备端口监控示例