社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python写了个“羊了个羊”游戏

Crossin的编程教室 • 4 月前 • 199 次点击  

大家好,欢迎来到 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))*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):# 状态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 = 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张为失败,上方没有剩牌则为胜利

# 达到7张,失败iflen(docks) >= 7:    screen.blit('end', (0, 0))# 没有剩牌,胜利iflen(tiles) == 0:    screen.blit('win', (0, 0))

6.

本demo距离《羊了个羊》尚有改进空间,有兴趣的小伙伴可自行尝试扩展,包括但不限于:

  • 道具功能

  • 增加收牌的动画效果(可以用 pgzero 提供的 animate 方法)

  • 更多的关卡布局

  • 打包成exe

  • 游戏排行榜

  • 当然还有游戏最最核心的部分:观看广告

代码已开源:

python666.cn/c/8

可下载,可修改,可商用,但公开发布需署名来源:Crossin的编程教室

如果喜欢的话,感谢帮忙点赞和转发,你的支持是我持续更新的动力!


Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
Crossin的其他书籍:

添加微信 crossin123 ,加入编程教室共同学习~
感谢转发和点赞的各位~

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/198636