大家好,欢迎来到Crossin的编程课堂!如果要说最近最火的游戏,那一定是《羊了个羊》了。连续几天上了热搜,火到连央视都来提醒大家提防有人用游戏的名义进行诈骗。但游戏火爆的另一面,也是无数玩家对二级难度的吐槽和不满。如果你和我一样,因为过不了关而感到不开心,何不用Python来写一个简单的版本呢。想好几个关卡后,甚至可以调整一个无解的关卡去给其他人。我的版本不仅难,而且简单。代码也很简单,总共不到100行。代码开源:python666.cn/c/8可下载、可修改、可商用,但公开发布需要签名来源:Crossin的编程课堂做了一个同样简单的视频供大家欣赏:https://www.bilibili.com/video...稍微解释一下思路和代码:1.游戏使用了pygame-zero库(所以用这么少的代码就可以实现),之前需要安装pgzero库运行:pipinstallpgzero(或者通过IDE安装)2.运行时需要带上工程中的images和music文件夹(可以替换里面的图片和音乐)3.每张卡片是一个Actor对象(相当于一般游戏开发中的sprite类),它有类型(12种12张牌)、等级、状态(不可点击/可点击/已收藏)等属性。游戏开始时随机洗牌放置,根据类型显示不同的图片。除了最上面的卡片,其余的都不能点击。#初始化牌组,12*12张牌随机洗牌ts=list(range(1,13))*12random.shuffle(ts)n=0forkinrange(7):#7layersforiinrange(7-k):#Minus1rowperlayerforjinrange(7-k):t=ts[n]#获取行类型n+=1tile=Actor(f'tile{t}')#使用tileX图像创建Actorobjecttile.pos=120+(k*0.5+j)*tile.width,100+(k*0.5+i)*tile.height*0.9#setpositiontile.tag=t#recordtypetile.layer=k#Recordingleveltile.status=1ifk==6else0#除了顶层,status设置为0(不可点击)这里是tiles.append(tile)的简化实现4.判断鼠标点击的位置是否在某张可以点击的卡片中。如果是,它将从所有卡片列表中移除并添加到下面的卡片堆列表中。然后遍历与这张牌重叠的下一层牌。对于每张下层卡片,依次查看是否有其他上层卡片覆盖。如果不是,请将其变成可点击的。fortileinreversed(tiles):#反向循环是先判断上面的牌,点击后直接跳出,避免重复判断iftile.status==1andtile.collidepoint(pos):#Status1可以被点击,并且鼠标在范围内(docks)-len(diff)<2:#如果相同牌的数量<2,则将它们加入牌组docks.append(tile)else:#否则用不同的牌替换牌组(即消除相同的牌cards)docks=difffordownintiles:#遍历所有卡片ifdown.layer==tile.layer-1anddown.colliderect(tile):#如果这张卡片的下一层,和upintiles有重叠:#然后反过来判断这张被覆盖的卡片,是否有其他卡片覆盖它ifup.layer==down.layer+1andup.colliderect(down):#如果有,则跳出breakelse:#如果有没有,解释一下变成了pointablestatedown.status=1return5。如果底牌达到7张牌,则失败,如果上面没有牌,则为胜利。#当达到7张牌时,失败iflen(docks)>=7:screen.blit('end',(0,0))#Nocardsleft,winiflen(tiles)==0:screen.blit('win',(0,0))6.这个demo从《羊了个羊》还有改进的空间。有兴趣的朋友可以自己尝试扩展,包括但不限于:道具功能增加卡牌收藏的动画效果(可以通过pgzero提供的animate方法)更多关卡布局打包成exe游戏排行榜,当然还有游戏最核心部分:看广告代码已开源:python666.cn/c/8可下载、修改、商用,但公开发布需签名来源:Crossin的编程课堂喜欢的话,感谢大家的帮助,点赞和转发,你们的支持是我持续更新的动力!我是Crossin,下场比赛见~对哦对,想学Python的记得看我的《人人都能学Python》系列零基础Python入门图文系列教程:python666.cn
