社区所有版块导航
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简(li)单(pu)版

Python编程 • 2 年前 • 426 次点击  
来自公众号: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 = 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的编程教室

---END---


推荐↓↓↓

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/151006
 
426 次点击