vibecoding-放置修仙休闲小游戏

Isabelle收藏家Lv.20归还仪式见证者👁 20♥ 0💬 0

放置类休闲小游戏


第 01 步 环境安装

第 02 步 新建项目

😀 创建两个文件夹,src放代码,pic放图片。

第 03 步 图片绘制

😀 src 下新建一个 main.py 的文件,利用 pygame 把 pic/tra.png 显示在屏幕中间,背景填充为纯黑色。

第 04 步 批量生成

😀 按照 炼气→筑基→开光→融合→心动→金丹→元婴→出窍→分神→合体→洞虚→大乘→渡劫 ,给我分别画一个三角形,代表不同时期,三角形要求从 炼气 到 渡劫 总共13个图。

第 05 步 分帧动画

😀 将窗口大小创建成 1440 x 810,并且实现一个图片帧动画,0.3 秒切换一张图片,图片目录为 pic/triangle/%d.png,%d 的值从 0 到 12 ,图片高度缩放成窗口高度,图片左上角的位置在屏幕左上角。

第 06 步 按钮控件

😀 停止图片循环切换逻辑,然后实现一个 ScaleButton 的类,保存在 src/button.py 文件中,它是一个点击以后,图片会缩小,放开又会恢复原样的按钮通用类,支持传入参数 image_path、scale_factor、press_scale、animation_speed。然后在 main.py 中生成一个 ScaleButton类 的实例 mainbtn,图片资源是 pic/ui/mainbtn.png,显示在屏幕右下角,点击这个按钮以后,图片进行循环切换。

第 07 步 经验系统

1、不采用 SKILL

😀 定义窗口宽高为变量(WIDTH, HEIGHT),在(WIDTH - (WIDTH // 5) - 50, 100)的位置绘制一个长高为(WIDTH//5, 30)的圆角矩形经验条,经验条的所有逻辑都写在 exp.py 文件中,定义一个 ExpBar 类,main.py 文件中实例化一个经验条对象出来进行展示。经验条中间显示 修为 0/100,其中 100是升级所需经验,0是当前经验,当前经验值随着 mainbtn 点击后进行变化,每点击一下增加 10 点经验(修为是包装后术语,经验是常用术语)。整个经验条是从 红橙黄绿青蓝紫 彩色呈现,这些逻辑在 ExpBar 中实现,减少 main.py 的代码量。

2、采用 SKILL

点击【设置】 -> 点击【规则和技能】 -> 点击【创建】。

技能名称:tween_ani
描述:将变量的改变从瞬间变化变成差值补间
指令:示例:假设有一个变量 x,那么你的功能就是把它拆成两个变量 target_x 和 current_x。
target_x:实际的变量值。外部设置的时候改变的是这个值;
current_x:界面上显示的变量值。只有在自身的upate更新函数中,才会变化,并且变化值逐渐趋近于 target_x,趋近速度是令一个变量。

😀 对 经验值 应用 SKILL:tween_ani

第 08 步 等级系统

😀 等级系统:左边的图片序列帧作为等级系统的一部分,等级系统的所有逻辑都写在 level.py 文件中,定义一个 Level 类,main.py 文件中实例化一个Level出来进行展示。当经验涨到 100 以后,执行升级的逻辑。等级从 0 开始, 升级就是值加一,但是给玩家展示的等级分为 大级 和 小阶,每个大级下有9个小阶,所以如果等级的值是 level,那么 大级就是 level/9,小阶就是 level%9+1,所以小阶的值域就是 1 到 9,而大级对应的是 修仙等级【炼气→筑基→开光→融合→心动→金丹→元婴→出窍→分神→合体→洞虚→大乘→渡劫】总共13级,在屏幕左边绘制【隶书,110号字体】的竖向的描边字代表修仙等级,在序列帧等级的图片中心绘制【隶书,60】的横向的描边字代表几阶(类似 '5阶' 这样),目前代码中的 current_frame 变量其实就可以通过等级换算得来了,这些逻辑也请在 Level 中实现,减少 main.py 的代码量。

第 09 步 阻尼动画

😀 等级对应的这些图片,利用 sin 三角函数,做个简单的竖直方向的阻尼震动,并且图片的大小,比目前的宽高扩大 1.2 倍。应用 SKILL:tween_ani

第 10 步 体力限制

😀 体力系统:energy.py 用来实现体力相关的类 Energy,体力系统用来控制经验增长的速度,每次点击 mainbtn 的时候,会扣除一点体力,一开始有 50 点体力,显示在 mainbtn 的上方,资源是 pic/ui/energyback.png 作为体力的背景图,体力的数值则显示在背景图上,字体采用 SysFont("SimLi", 28),居中偏右 20 px 显示。字体颜色为橙色(198, 114, 34)。

第 11 步 体力恢复

😀 体力恢复:在体力数值右边,显示一个 SysFont("SimHei", 16),且和体力值同颜色的字:"%ds",其中 %d 代表数值,s 代表秒,意思是每 60秒 恢复一点体力,%d的值从59一直到0以后,体力值增长1,并且%d继续从59变成0,循环往复,直到体力值变成 50 以后,这个倒计时消失。这个逻辑都是现在 energy.py 文件中。要求 体力数值 和 倒计时 是水平中心对齐的。

第 12 步 装备物品

😀 接下来设计 python 格式的装备表,在 equip_table.py 中填充数据, 其中 武器、护腕、戒指、护符 是攻击性装备; 头盔、甲胄、腰带、护肩、鞋履、手套 是防御性装备;项链 和 法器 是攻防兼备的装备。 攻击属性是 外功攻击、内功攻击、命中、暴击;防御属性是 外功防御、内功防御、闪避、暴防、血上限,每种装备都有基础属性和扩展属性; 对于基础属性如下: 武器:内功攻击、外功攻击 护腕:命中 戒指:内功攻击 护符:外功攻击 头盔、甲胄:内功防御、外功防御 腰带、护肩:闪避 鞋履:内功防御 手套:外功防御 项链:内功攻击、外功攻击 法器:命中、暴击 对于扩展属性如下: 武器:血上限、命中、暴击 护腕:外功攻击、内功攻击 戒指、护符:命中、暴击 头盔、甲胄:内功防御、外功防御 腰带、护肩:暴防 鞋履:闪避 手套:闪避 项链:血上限、内功防御、外功防御 法器:血上限、闪避、暴防 装备总共13个品阶、分别是: 炼气 → 筑基 → 开光 → 融合 → 心动 → 金丹 → 元婴 → 出窍 → 分神 → 合体 → 洞虚 → 大乘 → 渡劫

和玩家的大级是一一对应的。 对应的品质颜色分别是:

灰(180,180,180)、白(239, 239, 239)、绿(1, 149, 50)、蓝(59,133,197)、深蓝(45,99,185)、大深蓝(35,78,152)、紫(121,69,146)、紫红(151,56,106)、橙(255,142,0)、灰金(195,167,96)、金(210, 160, 0)、黄(245,215,79)、红(200,61,51) 装备命名参考: 炼气剑、筑基刀、开光护腕、融合护肩、心动项链、金丹手套、出窍鞋履、分身法器、合体戒指、大乘腰带、渡劫护符 这样的字样。

总共生成 13(品阶) x 12(部位) 个装备,属性的话按照品阶依次提升,物品编号按照 品阶 和 装备,1xxyy。其中 1 代表装备,yy 代表装备部位,从00到11;xx代表品阶,从00到12。 所有的这些 品阶、枚举 以及 属性等等枚举定义,请写在 const.py 文件中,以 class 的形式定义吧。

第 13 步 装备图标

😀 在 pic/equipments 目录下帮我生成 13 x 12 个装备的图标,图标大小 128 x 128,对应到 equip_table.py 中的每件装备,根据每件装备的品质,背景采用的颜色为 const.Equipment.QUALITY_COLORS 中的定义,图标的内容绘制的精细一点,用 python 来画,每个图标和装备本身含义要对应,比如 项链 不要给我画成了 护腕。

第 14 步 装备生成

😀 点击 manbtn 以后,在增加修为的同时,会生成一件装备。这件装备会进入临时背包,这些逻辑请在 equipment.py 文件中实现,如果临时背包中已经有一件装备了,那么点击 mainbtn 无效,也不扣除体力。如果临时背包中有装备,那么显示一个装备tips,装备 tips 的逻辑也写在 equipment.py 的 EquipTips 类中,tips 的左上角坐标是(x, y),其中 x 的值和 经验条的left一致,y 的值就去 HEIGHT//2-50。装备tips 的内部展示 装备名、部位、基础属性、扩展属性。"部位" 两个字不用显示,但是具体是什么部位,请显示在 tips的右上角。基础属性 和 扩展属性 后面的 冒号也不需要。装备的名字颜色和对应的修仙大级对应的颜色相关。装备名字体大小20,其它字体大小18。

第 15 步 装备装备

😀 在 equipment.py 中实现装备的穿戴逻辑,首先在经验条下方显示一个装备面板 pic/ui/euqipback.png,这个是个背景板,宽度和经验条宽度一致。上面是一个 3 x 4 的装备槽,第一排是 武器、头盔、甲胄、鞋履;第二排是 腰带、护腕、手套、项链;第三排是 护肩、戒指、法器(和暗器相同意思)、护符。然后在装备 tips 的最下方显示一个按钮【装备】pic/ui/equip_btn.png,点击以后就装备到对应的槽位中,同时清空临时背包。当然,如果对应的槽位已经有装备了,那就在下方显示两个按钮:左边是【分解】pic/ui/split_btn.png ,点击以后直接清空临时背包(等物品系统做好以后后续会得到一些物品,这里保留实现),右边是【替换】pic/ui/replace_btn.png,点击以后将目前装备进行穿戴,原有装备进行分解。装备穿戴到面板时,采用的图片在 pic/equipments/ 目录下,文件名是 equip_%d_%d.png,第一个数字是品阶,第二个数字是部位。【装备】和【替换】的过程增加一个动画,动画的流程如下:装备tips先消失,然后出现一个128x128的装备图标,起点在装备tips的位置,终点在对应槽位,应用 SKILL: tween_ani

第 16 步 战力系统

😀 战力系统:战斗力相关的逻辑,请实现在 power.py 文件中,以一个类 Power 来实现,在经验条的上方,水平方向对齐的位置,显示一个战力的背景条,图片路径 pic/ui/powerback.png,战力背景条的长度和经验条保持一致,高度做等比例缩放。并且居中位置显示 "战力 %d",其中 %d 就是战力的实际数值。战力的计算请根据: 当前等级、穿戴的装备中所有的属性(每个属性都换算成一个战力值,这个换算的参数请写在 const.py 文件中)来综合计算。战力字体采用 SysFont("隶书", 36, bold=True),颜色采用 (255, 215, 0),并且有黑色描边,装备的替换会影响战力大小,战力变化的时候请和经验变化一样,进行缓动效果,而不是直接设置值。

第 17 步 装备比较

😀 点击装备,也展示一个tips,但是不显示下面的按钮。当装备位已经有装备,我们称为【源装备】,新生成的装备,我们称为【新装备】,对于【新装备】中的每条属性,如果它的值比【源装备】中的属性高(这里注意,如果源装备没有这条属性,则视为0),则在属性右边显示一个向上箭头,资源为 pic/ui/up_arow.png;如果相当,则什么都不显示;如果更低,则显示一个向下箭头,资源为 pic/ui/down_arow.png,箭头图片资源缩放比例为 0.14。然后每件装备都通过属性计算出一个战力;如果【新装备】的战力大于【源装备】的战力,则在装备名字右边,和箭头相同的x坐标位置,显示 (124, 177, 136) 颜色 "%d",其中 +%d 是战力差值;如果【新装备】的战力小于【源装备】的战力,则在装备名字右边,和箭头相同的x坐标位置,显示 (224, 105, 85) 颜色 "-%d",其中 %d 是战力差值;

第 18 步 属性系统

😀 属性系统:在装备tips的相同位置(装备tips的左上角坐标提炼到const.py中,这样无论是属性系统,还是装备tips还是后续的物品背包都显示在这个位置),展示当前玩家的属性,第一排显示血上限(例如 血上限 200,红色字);第二排显示 外功攻击和外功防御(金色);第三排显示 内功攻击和内功防御(橙黄色)第四排显示 命中和闪避(绿色);第五排显示暴击和暴防(蓝色),并且在装备穿脱的时候会动态刷新属性。所有的人物属性,都应用 SKILL: tween_ani

第 19 步 野怪系统

😀 野怪系统:生成13只野怪,放在一个表里(monster_table.py),类似 equip_table 这样的dict的格式,每只野怪对应一个修仙大等级 cultivation_levels,比如 0 号野怪的修仙等级对应炼气,1号野怪修仙等级对应筑基,以此类推,野怪具有 血上限、外功攻击、内功攻击、外功防御、内功防御、命中、闪避、暴击、暴防,并且可以根据这些属性计算战力。野怪资源在 pic/ui/battlemonster/%d.png,其中 %d 代表 0 到 12,总共 13 张图片。也在表中给出路径的引用。

第 20 步 战斗系统

😀 战斗系统:level的frames,在鼠标移动上去会缓缓放大 1.1倍,并且支持点击,点击以后开启一场战斗,战斗逻辑是现在 battle.py 文件中,战斗开启时屏幕最上层加载一张图片,图片路径是 'pic/ui/battlescn/%d.png',其中 %d 是一个 0 到 8 的数字,修仙等级越低,数字越小。然后在左侧位置显示玩家图片 pic/ui/battlerole.png,进行适当缩放,右侧位置显示野怪图片,从 monster_table.py 中根据当前修仙等级加载对应野怪图片。玩家和野怪上方都有一个血条(我方绿色,敌方红色),战斗节奏就是先由玩家攻击野怪,玩家图片移动到野怪位置,0.4秒完成先快后慢的移动(两个矩形快碰撞的位置但不要真正碰到),根据 攻、防、命中、暴击 计算伤害,扣血,打完以后回到原位;再由野怪图片移动到玩家位置(两个矩形快碰撞的位置但不要真正碰到),0.4秒完成先快后慢的移动,根据 攻、防、命中、暴击 计算伤害,扣血,打完以后回到原位;野怪的血归零则战斗胜利 pic/ui/win.png;玩家的血归零则战斗失败 pic/ui/lose.png,分别显示对应图片,图片下方显示 点击鼠标退出界面。鼠标点击任意位置,退出战斗界面。

第 21 步 物品系统

😀 物品系统:设计一个物品表(item_table.py),目前只涉及四种物品,60000 代表陨铁,60100 代表秘银,60200代表灵槐,60300代表灵魄,资源在 pic/ui/item 目录下,分别是 yuntie.png、miyin.png、linghuai.png、lingpo.png,这些物品就是直接进入背包的东西。

第 22 步 背包系统

😀 背包系统:帮我在 (x, y) 位置展示一个 背包按钮,按钮的地址是 pic/ui/bagbtn.png,缩放为 0.28 倍,其中 (x, y) 的位置,正好在 mainbtn 的左边,两个按钮中间间隔 10px,点击背包按钮,展示一个背包,背包里面装着这个游戏的物品,背包的位置 和 装备Tips 左上角位置一致,存储的时候,只存储物品ID和数量即可,其它的数据直接读 item_table.py 表即可,背包物品的图标右下角展示物品数量。默认 item_table.py 表里的物品各 1 个。背包按钮点击一次,显示背包;再次点击以后,隐藏背包;且背包宽度和装备tips的宽度一致;显示层级: 人物属性 < 装备tips < 背包。

第 23 步 装备分解

😀 装备分解:装备在点击分解按钮以后,根据其品质(表里的 quality 参数),获得对应的 "陨铁" 物品(item_table.py 中的),获得数量是 ( quality + 1 ) * 5,并且为了让玩家感受到这个分解的效果,请参考装备动画的逻辑,流程如下:点击分解按钮以后,隐藏掉装备tips,然后生成一个对应的128x128的装备图标,动画回到背包按钮的中心,且图标大小最终缩小到10x10,回到以后 alpha 从 100% 到 0%,然后再隐藏图标。

第 24 步 掉落系统

😀 掉落系统:首先将战斗胜利字样再往上移动 150 个像素,并且在战斗胜利图片下方,显示本次战斗掉落的物品,drop_table.py 的格式如下(这是其中一条数据,请帮我补充所有怪的数据): {

20005:{ 'drop_p' : [10,10,80], 'drop_items' : [60100, 60200, 0] },

}

其中 20005 是怪物ID,10%概率掉60100,10%概率掉60200,80%不掉落;

当然这是一次掉落,每次战斗根据 【怪物表 的 cultivation_level】//2 + 1 计算得出执行掉落的次数。

帮我把 drop_table.py 补充完整,并且实现掉落逻辑,并且在战斗结束后把掉落的物品ICON显示出来,右下角显示掉落物品的个数,和背包显示类似。

第 25 步 强化系统

😀 强化系统:点击装备槽中的装备,展示装备tips,并且这种情况下,装备tips下方的按钮是没有的。但是在 tips 右边有竖着排的四个按钮,分别为 强化(pic/ui/qianghua.png)、强印(pic/ui/qiangyin.png)、灵化(pic/ui/linghua.png)、灵印(pic/ui/lingyin.png)。注意装备提升的是部位,所以替换装备,装备的四项提升的等级是不会变的。

强化:对基础属性做百分比提升, 1% 到 99%,每一级 +1%,消耗1个陨铁,每次提升有概率失败,强化等级越高,失败概率越大;

强印:对基础属性做数值提升,10 到 100,每一级 +1,消耗1个秘银,每次提升有概率失败,强化等级越高,失败概率越大;

灵化:对扩展属性做百分比提升, 1% 到 99%,每一级 +1%,消耗1个灵槐,每次提升有概率失败,强化等级越高,失败概率越大;

灵印:对扩展属性做数值提升,10 到 100,每一级 + 1,消耗1个灵魄,每次提升有概率失败,强化等级越高,失败概率越大;

点击按钮以后执行相应的概率逻辑,如果成功,屏幕中上方显示tips(强化成功、灵化成功);如果失败,屏幕中上方显示tips(强化失败、灵化失败);

对于每件装备,点击装备以后,"基础属性"、"扩展属性" 后方显示一个 +%d% 代表强化和灵化等级,后面那个是 百分比。在实际数值后面显示 +%d,代表 强印 和 灵印 增加的数值。

评论(0)

登录后就能留言,和大家一起聊聊这张卡。

去登录
还没有人评论,来抢第一条沙发吧。