首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用Python写了个“羊了个羊”游戏

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

作者头像
Crossin先生
发布2026-07-10 21:41:11
发布2026-07-10 21:41:11
550
举报

大家好,欢迎来到 Crossin 的编程教室。

曾经红极一时的《羊了个羊》游戏,相信很多人都玩过。游戏的一大特色第二关难度飙升,绝大多数人都没过得去。

今天我们就来用 Python 来写一个简单版,想过几关过几关

甚至还可以调个无解关卡去霍霍其他人

我这个版本不仅难度简单,代码也很简单,一共不到100行。代码已开源:

python666.cn/c/8

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

做了一个同样简单的整活视频,供大家一乐:

稍微解释一下思路和代码:

1.

游戏用了 pygame-zero 这个库(所以才能这么少的代码实现),运行前需要安装 pgzero 库:

代码语言:javascript
复制
pip install pgzero

(或者通过 IDE 安装)

2.

运行时需要带上项目里的 imagesmusic 文件夹(你可以替换里面的图片和音乐)

3.

每一张牌是一个 Actor 对象(相当于一般游戏开发中的精灵类),具有种类(12种各12张)、层级状态(不可点/可点/已收集)等属性。

开局时随机打乱后摆放,根据种类显示不同图片。

除了最上层的牌可点,其余均不可点。

代码语言:javascript
复制
# 初始化牌组,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 = 1if k == 6else0#除了最顶层,状态都设置为0(不可点)这里是个简化实现
            tiles.append(tile)

4.

判断鼠标点击的位置是否处于某张可点的牌内,是的话就从所有牌列表中移除,加到下方牌堆列表里。

然后遍历与这张牌有重叠的下一层牌,对于每张下层牌,反过来检查是否有其他上层牌覆盖它,如果没有,就把它变成可点。

代码语言:javascript
复制
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 = diff
for 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):     #如果有就跳出
break
else:      #如果全都没有,说明它变成了可点状态
                    down.status = 1
return

5.

下方牌堆达到7张为失败,上方没有剩牌则为胜利

代码语言:javascript
复制
# 达到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的编程教室

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


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档