首页 > 编程语言 >羊了个羊,但是Python简(li)单(pu)版

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

时间:2022-09-27 00:44:33浏览次数:81  
标签:tiles 12 游戏 pu Python len li tile

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

image.png

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

image.png

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

image.png

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

https://www.bilibili.com/video/BV1Ze411K7WF/

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

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

标签:tiles,12,游戏,pu,Python,len,li,tile
From: https://www.cnblogs.com/crossin/p/16733105.html

相关文章

  • Linux、Windows下Redis的安装即Redis的基本使用详解
    前言什么是RedisRedis是一个基于内存的key-value结构数据库。Redis是互联网技术领域使用最为广泛的存储中间件,它是「RemoteDictionaryService」的首字母缩写,也就......
  • The Python Standard Library by Example pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1XrEGFnmV_jwtkXILXLjUQg点击这里获取提取码 ......
  • 应用内存管理:Linux的应用与内存管理
    应用程序想要使用内存,必须得找操作系统申请,那就有必要先了解下Linux内核怎么管理内存的,然后再去分析应用程序的内存管理细节。硬件架构现代计算机体系结构被称为Non-Unif......
  • Python源码剖析 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/12DltvfQr4Tc7ZwhiG1UmAg点击这里获取提取码 ......
  • 「国产系统」Tubian 0.3,兼容Windows和Android的GNU/Linux系统!
    Tubian是我的自用系统整理而成的Linux发行版,基于Debian,对Windows和Android应用提供了较为完善的兼容。可以直装QQTIM微信MSOFFICE等大量Windows应用,并且几乎实现对Android......
  • python
    基本数据类型之布尔值bool用来判断事物的对错是否可行只要用于流程控制中只有两种状态true对的真的可行的false错的假的不可行的python中所有......
  • python Thread
    #foriinrange(10):#t1=Thread(target=函数,args=(,))#t.append(t1)##t1.start()#forhint:#h.join()#共耗时:26.087260484695435500#fo......
  • Python-标识符命名规则
    合法标识符在Python中,标识符由字母,数字,下划线组成,但不能以数字开头.命名规则lower_underscore:小写字母中间隔下划线.一般使用小写加下划线UPPER_UNDERS......
  • 世界坐标系转换/相机标定/畸变矫正-Python
    PnP(Perspective-n-Point)是求解3D到2D点的对应方法。不论是相机和雷达的标定还是相机和相机的标定都可以使用PNP来解决,即通过不同坐标系下相同的点对求解变换矩阵。这里......
  • 一小伙使用 python爬虫来算命?
    1.网站分析因版权原因,网站的地址大家可以私信我或者加我文章结尾的qq,完整的教程群里有,需要的自提,当然遇到问题也可以请教哦。2.获取内容我们今天呢,就先做一个通过星座来得......