羊了个羊,但是Python简(li)单(pu)版

博主用Python制作了一个简易版《羊了个羊》,代码不到100行,开源并可商用。游戏采用pygame-zero库实现,介绍了游戏的运行原理及代码结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

要说最近最热门的游戏,那肯定是《羊了个羊》没跑了。

连续上了好几天热搜,火到连央视都来提醒谨防有人利用游戏之名诈骗。

但游戏爆火的另一面,也是无数玩家对于第二关难度的吐槽和不满。

如果你也像我一样,因为过不了关而不爽,不如自己用 Python 来写一个简单版,想过几关过几关

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

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

python666.cn/c/8

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

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

羊了个羊,但是Python简(li)单(pu)版

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

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

以下是Python八卦迷宫的代码实现: ```python # 定义迷宫地图 maze = [ ['*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', ' ', '*'], ['*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ', '*'], ['*', ' ', '*', ' ', '*', '*', '*', '*', ' ', '*', '*', '*', '*', ' ', '*', ' ', '*', '*', '*', '*'], ['*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', '*'], ['*', ' ', '*', ' ', '*', ' ', '*', '*', '*', '*', '*', ' ', '*', ' ', '*', '*', '*', '*', ' ', '*'], ['*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', '*', ' ', '*', ' ', '*', ' ', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', ' ', '*'], ['*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', '*', ' ', '*', ' ', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', ' ', '*'], ['*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', '*', ' ', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', ' ', '*'], ['*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', ' ', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', ' ', '*'], ['*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*'], ['*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*'] ] # 定义起点和终点 start = (1, 1) end = (17, 17) # 定义方向 directions = [(0, 1), (0, -1), (1, 0), (-1, 0)] # 定义拼音字符 pinyin = ['ba', 'bi', 'bo', 'bu', 'ca', 'ci', 'cu', 'cha', 'che', 'chi', 'cho', 'chu', 'da', 'de', 'di', 'du', 'duo', 'e', 'en', 'er', 'fa', 'fo', 'fu', 'ga', 'ge', 'gu', 'gua', 'guai', 'gui', 'gun', 'ha', 'he', 'hei', 'hen', 'heng', 'hong', 'hou', 'hu', 'hua', 'huai', 'huan', 'huang', 'hui', 'hun', 'huo', 'ji', 'jia', 'jian', 'jiang', 'jiao', 'jie', 'jin', 'jing', 'jiong', 'jiu', 'ju', 'juan', 'jue', 'jun', 'ka', 'ke', 'kai', 'kan', 'kang', 'kao', 'kei', 'ken', 'keng', 'kong', 'kou', 'ku', 'kua', 'kuai', 'kuan', 'kuang', 'kui', 'kun', 'kuo', 'la', 'lai', 'lan', 'lang', 'lao', 'le', 'lei', 'leng', 'li', 'lia', 'lian', 'liang', 'liao', 'lie', 'lin', 'ling', 'liu', 'lo', 'long', 'lou', 'lu', 'lv', 'luan', 'lue', 'lun', 'luo', 'ma', 'mai', 'man', 'mang', 'mao', 'me', 'mei', 'men', 'meng', 'mi', 'mian', 'miao', 'mie', 'min', 'ming', 'miu', 'mo', 'mou', 'mu', 'na', 'nai', 'nan', 'nang', 'nao', 'ne', 'nei', 'nen', 'neng', 'ni', 'nian', 'niang', 'niao', 'nie', 'nin', 'ning', 'niu', 'nong', 'nu', 'nv', 'nuan', 'nue', 'nuo', 'o', 'ou', 'pa', 'pai', 'pan', 'pang', 'pao', 'pei', 'pen', 'peng', 'pi', 'pian', 'piao', 'pie', 'pin', 'ping', 'po', 'pou', 'pu', 'qi', 'qia', 'qian', 'qiang', 'qiao', 'qie', 'qin', 'qing', 'qiong', 'qiu', 'qu', 'quan', 'que', 'qun', 'ran', 'rang', 'rao', 're', 'ren', 'reng', 'ri', 'rong', 'rou', 'ru', 'rua', 'ruan', 'rui', 'run', 'ruo', 'sa', 'sai', 'san', 'sang', 'sao', 'se', 'sen', 'seng', 'sha', 'shai', 'shan', 'shang', 'shao', 'she', 'shei', 'shen', 'sheng', 'shi', 'shou', 'shu', 'shua', 'shuai', 'shuan', 'shuang', 'shui', 'shun', 'shuo', 'si', 'song', 'sou', 'su', 'suan', 'sui', 'sun', 'suo', 'ta', 'tai', 'tan', 'tang', 'tao', 'te', 'teng', 'ti', 'tian', 'tiao', 'tie', 'ting', 'tong', 'tou', 'tu', 'tuan', 'tui', 'tun', 'tuo', 'wa', 'wai', 'wan', 'wang', 'wei', 'wen', 'weng', 'wo', 'wu', 'xi', 'xia', 'xian', 'xiang', 'xiao', 'xie', 'xin', 'xing', 'xiong', 'xiu', 'xu', 'xuan', 'xue', 'xun', 'ya', 'yan', 'yang', 'yao', 'ye', 'yi', 'yin', 'ying', 'yo', 'yong', 'you', 'yu', 'yuan', 'yue', 'yun', 'za', 'zai', 'zan', 'zang', 'zao', 'ze', 'zei', 'zen', 'zeng', 'zha', 'zhai', 'zhan', 'zhang', 'zhao', 'zhe', 'zhei', 'zhen', 'zheng', 'zhi', 'zhong', 'zhou', 'zhu', 'zhua', 'zhuai', 'zhuan', 'zhuang', 'zhui', 'zhun', 'zhuo', 'zi', 'zong', 'zou', 'zu', 'zuan', 'zui', 'zun', 'zuo'] # 定义拼音字符的索引 pinyin_index = 0 # 定义当前位置和当前方向 current_pos = start current_direction = 0 # 定义拼音字符串 result = '' # 循环走迷宫 while current_pos != end: # 获取当前位置的坐标 x, y = current_pos # 判断当前位置是否为拐点 if maze[x][y] == ' ' and (maze[x + directions[current_direction][0]][y + directions[current_direction][1]] == '*' or maze[x + directions[current_direction][0]][y + directions[current_direction][1]] == ' '): # 拼接拼音字符 result += pinyin[pinyin_index] pinyin_index = (pinyin_index + 1) % len(pinyin) # 判断当前位置是否为死路 if maze[x + directions[current_direction][0]][y + directions[current_direction][1]] == '*': # 改变方向 current_direction = (current_direction + 1) % 4 # 改变位置 current_pos = (x + directions[current_direction][0], y + directions[current_direction][1]) # 输出拼音字符串 print(result) ```
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crossin的编程教室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值