大家好,欢迎来到 Crossin 的编程教室。
曾经红极一时的《羊了个羊》游戏,相信很多人都玩过。游戏的一大特色第二关难度飙升,绝大多数人都没过得去。
今天我们就来用 Python 来写一个简单版,想过几关过几关
甚至还可以调个无解关卡去霍霍其他人
我这个版本不仅难度简单,代码也很简单,一共不到100行。代码已开源:
python666.cn/c/8
可下载,可修改,可商用,但公开发布需署名来源:Crossin的编程教室
做了一个同样简单的整活视频,供大家一乐:
稍微解释一下思路和代码:
1.
游戏用了 pygame-zero 这个库(所以才能这么少的代码实现),运行前需要安装 pgzero 库:
(或者通过 IDE 安装)
2.
运行时需要带上项目里的 images 和 music 文件夹(你可以替换里面的图片和音乐)
3.
每一张牌是一个 Actor 对象(相当于一般游戏开发中的精灵类),具有种类(12种各12张)、层级、状态(不可点/可点/已收集)等属性。
开局时随机打乱后摆放,根据种类显示不同图片。
除了最上层的牌可点,其余均不可点。
ts = list(range(1, 13))*12random.shuffle(ts)n = 0for 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 = 1if k == 6else0#除了最顶层,状态都设置为0(不可点)这里是个简化实现 tiles.append(tile)
4.
判断鼠标点击的位置是否处于某张可点的牌内,是的话就从所有牌列表中移除,加到下方牌堆列表里。
然后遍历与这张牌有重叠的下一层牌,对于每张下层牌,反过来检查是否有其他上层牌覆盖它,如果没有,就把它变成可点。
for tile in reversed(tiles): if tile.status == 1and tile.collidepoint(pos): tile.status = 2 tiles.remove(tile) diff = [t for t in docks if t.tag != tile.tag] if len(docks) - len(diff) 2: docks.append(tile)else: docks = difffor down in tiles: if down.layer == tile.layer - 1and down.colliderect(tile): for up in tiles: if up.layer == down.layer + 1and up.colliderect(down): breakelse: down.status = 1return
5.
下方牌堆达到7张为失败,上方没有剩牌则为胜利
iflen(docks) >= 7: screen.blit('end', (0, 0))iflen(tiles) == 0: screen.blit('win', (0, 0))
6.
本demo距离《羊了个羊》尚有改进空间,有兴趣的小伙伴可自行尝试扩展,包括但不限于:
python666.cn/c/8
可下载,可修改,可商用,但公开发布需署名来源:Crossin的编程教室
如果喜欢的话,感谢帮忙点赞和转发,你的支持是我持续更新的动力!
Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
添加微信 crossin123 ,加入编程教室共同学习~