关于python:羊了个羊但是Python简li单pu版

49次阅读

共计 1933 个字符,预计需要花费 5 分钟才能阅读完成。

大家好,欢送来到 Crossin 的编程教室!
要说最近最热门的游戏,那必定是《羊了个羊》没跑了。

间断上了好几天热搜,火到连央视都来揭示谨防有人利用游戏之名欺骗。
但游戏爆火的另一面,也是有数玩家对于第二关难度的吐槽和不满。

如果你也像我一样,因为过不了关而不爽,不如本人用 Python 来写一个简略版,想过几关过几关
甚至还能够调个无解关卡去霍霍其他人

我这个版本不仅难度简略,代码也很简略,一共不到 100 行。代码已开源:
python666.cn/c/8
可下载,可批改,可商用,但公开公布需署名起源:Crossin 的编程教室
做了一个同样简略的整活视频,供大家一乐:

https://www.bilibili.com/vide…

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

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

正文完
 0