价格机制
游戏经济系统完全指南 | 开发者数值参考 | 价格模拟器 | 文档版本:v1.0
玩家快速入门
一句话理解价格机制:游戏中的商品价格由系统根据多种因素自动计算,但真实价格对你隐藏。你需要通过观察市场公告、分析NPC议价来判断合理定价。
观察市场
关注公告板的供需信息,了解哪些商品热门
理解议价
NPC留言议价意味着定价偏高,可参考议价调整
快速成交
商品快速卖出说明定价合理或偏低,可适当提价
使用模拟器
切换到"价格模拟器"标签,测试不同定价的效果
如何正确定价
第一步:上架商品
选择要出售的商品,设置一个你认为合理的价格。如果是第一次出售该商品,可以参考以下策略:
- 试探法:先定一个中等偏高的价格,观察NPC反应
- 保守法:先定一个较低的价格确保成交,了解市场后再调整
第二步:观察反馈
| 反馈类型 | 含义 | 建议操作 |
|---|---|---|
| 快速成交(15分钟内) | 定价偏低或市场短缺 | 下次可适当提价10-20% |
| 正常成交(1-2小时) | 定价合理 | 保持当前定价策略 |
| 收到NPC议价 | 定价偏高 | 参考议价价格调整,或接受议价 |
| 长时间无人问津 | 定价严重过高 | 收摊后重新开摊定价(开摊后不可调价) |
第三步:调整策略
根据反馈调整定价,逐步找到最优价格区间。
价格影响因素速查
品质影响
| 品质 | 价格系数 | 说明 |
|---|---|---|
| 普通 | 1.0x | 基础价格 |
| 优秀 | 1.2x | 品质较好 |
| 精良 | 1.5x | 高品质 |
| 史诗 | 2.0x | 稀有品质 |
| 传说 | 3.0x | 顶级品质 |
时段影响
| 时段 | 价格系数 | 说明 |
|---|---|---|
| 凌晨 (0-6点) | 0.8x | 人流稀少 |
| 早晨 (6-9点) | 1.0x | 正常时段 |
| 中午 (12-14点) | 1.2x | 人流高峰 |
| 傍晚 (18-22点) | 1.3x | 黄金时段 |
定价小贴士
- 新手建议:初次出售某商品时,先观察其他摊位的定价(如果有)
- 时段策略:在傍晚黄金时段上架高价商品,凌晨时段适合上架低价快消品
- 议价处理:收到议价不要急着拒绝,看看价格是否合理
- 灵活调整:市场供需变化快,定期调整价格
常见问题
为什么看不到商品的真实市场价格?
▼
这是游戏的核心设计之一。真实市场价格是隐藏的,玩家需要通过观察市场公告、分析NPC议价、参考成交速度来推断合理价格区间。这种设计增加了游戏的真实性和策略性。
NPC议价是什么意思?
▼
当你的定价高于市场合理价格15%以上时,NPC会在留言板上发起议价,提出一个他们认为合理的价格。你可以:
- 接受议价,按NPC提出的价格成交
- 拒绝议价,继续等待其他买家
- 参考议价价格,调整自己的定价
议价有效期为30分钟,过期自动失效。
如何判断我的定价是否合理?
▼
可以通过以下几个信号判断:
- 成交速度:15分钟内成交说明定价偏低;1-2小时成交说明定价合理;超过5小时未成交说明定价过高
- NPC反馈:收到议价说明定价偏高;无人问津说明定价严重过高
- 市场公告:关注供需信息,供过于求时适当降价,供不应求时适当提价
摊位位置和装饰真的会影响成交吗?
▼
是的。摊位位置决定了人流量,中心区域人流量高,成交概率更高;装饰影响买家的购买意愿,多个装饰效果可叠加,毕业配置可提供高达96%的成交率加成。但这些只是辅助因素,价格仍然是最重要的决定因素。
装饰需要通过消耗凭证获得称号来解锁,共有36种装饰分为6个等级,玩家可以根据自身风格选择不同的搭配流派。
如何解锁更多装饰?
▼
装饰通过称号系统解锁:
- 消耗1000草创凭证获得"小商贩"称号,解锁草创期6个装饰
- 消耗1500立业凭证获得"行商"称号,解锁立业期6个装饰
- 消耗2000兴业凭证获得"富商"称号,解锁兴业期6个装饰
- 消耗2500旺业凭证获得"巨贾"称号,解锁旺业期6个装饰
- 消耗3000鸿业凭证获得"商业大亨"称号,解锁鸿业期6个装饰
- 消耗4000传世凭证获得"大富翁"称号,解锁传世期6个装饰
不同时期需要不同类型的凭证,凭证通过交易、任务、成就等途径获得。
系统架构
价格机制采用三层架构设计:
- 隐藏层(Hidden Layer):系统内部计算真实市场价格,对玩家完全隐藏
- 玩家层(Player Layer):玩家自主定价,系统不提供直接价格参考
- 反馈层(Feedback Layer):通过NPC议价、成交速度等间接反馈引导玩家定价
数据结构设计
商品基础数据表
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| item_id | int | 商品唯一ID | 1001 |
| item_name | string | 商品名称 | "火焰草" |
| base_value | int | 基础价值(文) | 100 |
| item_type | enum | 商品类型 | 草药/矿石/装备 |
| quality_tier | int | 品质等级 | 1-5 |
| price_sensitivity | float | 价格敏感度系数 | 1.0 |
| base_trade_volume | int | 基础交易量 | 100 |
摊位数据表
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| stall_id | int | 摊位唯一ID | 1 |
| owner_id | int | 摊主玩家ID | 10001 |
| position_level | int | 位置等级 | 1-3 |
| decoration_list | array | 已购买装饰ID列表 | [1,2,3,4,5,6] |
| title_id | int | 当前装备称号ID | 1-6 |
| reputation | float | 摊位声誉值 | 1.0 |
市场动态数据表
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| market_id | int | 记录ID | 1 |
| item_id | int | 商品ID | 1001 |
| current_supply | int | 当前供应量 | 50 |
| current_demand | int | 当前需求量 | 80 |
| time_phase | enum | 时段特性 | 早晨/中午/傍晚/深夜 |
| max_buy_prob | float | 最大成交概率 | 0.7 |
算法实现
真实市场价格计算
CalculateRealMarketPrice 实现代码
public float CalculateRealMarketPrice(int itemId, int quality)
{
// 1. 获取基础数据
ItemBaseData item = GetItemData(itemId);
// 2. 获取各系数
float Q = GetQualityCoefficient(quality); // 品质系数
float S = GetSupplyDemandIndex(itemId); // 供需指数
float T = GetTimeCoefficient(item.time_phase); // 时段系数
float E = GetEventCoefficient(itemId); // 事件系数
float xi = Random.Range(0.95f, 1.05f); // 随机波动
// 3. 计算真实市场价格
float realPrice = item.base_value * Q * S * T * E * xi;
return realPrice;
}
供需指数计算
CalculateSupplyDemandIndex 实现代码
public float CalculateSupplyDemandIndex(int itemId)
{
ItemBaseData item = GetItemData(itemId);
MarketData market = GetMarketData(itemId);
// 获取当前供需数据
int demand = market.current_demand;
int supply = market.current_supply;
int baseVolume = item.base_trade_volume;
float k = item.price_sensitivity;
// 计算供需差值比例
float diffRatio = (float)(demand - supply) / baseVolume * k;
// 使用双曲正切函数限制范围
float tanhValue = (float)Math.Tanh(diffRatio);
// 计算最终供需指数
float S = 1.0f + tanhValue;
// 限制范围 [0.5, 2.0]
return Mathf.Clamp(S, 0.5f, 2.0f);
}
成交概率计算
CalculateBuyProbability 实现代码
public float CalculateBuyProbability(int itemId, float playerPrice,
int stallId, int npcId)
{
ItemBaseData item = GetItemData(itemId);
StallData stall = GetStallData(stallId);
NPCData npc = GetNPCData(npcId);
// 1. 计算真实市场价格
float marketPrice = CalculateRealMarketPrice(itemId, item.quality_tier);
// 2. 计算价格偏离度
float deviation = (playerPrice - marketPrice) / marketPrice;
// 3. 计算基础成交概率(使用Sigmoid函数)
float lambda = 2.0f; // 价格敏感度参数
float sigmoid = 1.0f / (1.0f + Mathf.Exp(-(-deviation * lambda)));
// 4. 应用摊位系数
float L = GetPositionCoefficient(stall.position_level); // 位置系数
float D = CalculateDecorationBonus(stall.decoration_list, stall.title_id); // 装饰总加成
float T_slot = GetTimeSlotMatch(itemId); // 时段匹配
float R = Random.Range(0.9f, 1.1f); // 随机因子
// 5. 计算最终成交概率
float maxProb = item.max_buy_probability;
float probability = maxProb * sigmoid * L * D * T_slot * R;
// 6. 限制范围 [0, 1]
return Mathf.Clamp(probability, 0.0f, 1.0f);
}
装饰加成计算
CalculateDecorationBonus 实现代码
public float CalculateDecorationBonus(int[] decorationList, int titleId)
{
float totalBonus = 1.0f;
// 1. 计算所有已购买装饰的加成
foreach (int decoId in decorationList)
{
DecorationData deco = GetDecorationData(decoId);
totalBonus += deco.trade_rate_bonus; // 累加成交率加成
}
// 2. 加上当前称号的加成
TitleData title = GetTitleData(titleId);
totalBonus += title.trade_rate_bonus;
// 3. 限制最大加成(防止过度膨胀)
return Mathf.Min(totalBonus, 2.0f); // 最高2倍加成
}
// 装饰数据结构
public class DecorationData
{
public int id;
public string name;
public float trade_rate_bonus; // 成交率加成(如0.01表示+1%)
public float offline_income_bonus; // 离线收益加成
public float tax_reduction; // 税费减免
public int unlock_title_id; // 解锁所需称号ID
public int price; // 价格
}
NPC议价生成
GenerateBargainOffer 实现代码
public BargainOffer GenerateBargainOffer(int npcId, int saleItemId, float playerPrice)
{
SaleItemData saleItem = GetSaleItemData(saleItemId);
NPCData npc = GetNPCData(npcId);
// 1. 计算真实市场价格
float marketPrice = CalculateRealMarketPrice(
saleItem.item_id,
saleItem.quality
);
// 2. 检查是否触发议价条件
float deviation = (playerPrice - marketPrice) / marketPrice;
if (deviation <= 0.15f) // 偏离度小于15%不触发
return null;
// 3. 根据NPC性格计算议价价格
float personalityFactor = GetNPCPersonalityFactor(npc.personality_type);
float bargainPrice = marketPrice * personalityFactor;
// 4. 生成议价信息
BargainOffer offer = new BargainOffer
{
npc_id = npcId,
npc_name = npc.name,
sale_item_id = saleItemId,
offer_price = (int)bargainPrice,
message = GenerateBargainMessage(npc, saleItem, bargainPrice),
expire_time = DateTime.Now.AddMinutes(30),
status = OfferStatus.Pending
};
return offer;
}
接口定义
核心接口列表
| 接口名 | 功能 | 输入参数 | 返回值 |
|---|---|---|---|
| CalculateRealMarketPrice | 计算真实市场价格 | itemId, regionId, quality | float |
| CalculateBuyProbability | 计算成交概率 | itemId, playerPrice, stallId, npcId | float |
| GenerateBargainOffer | 生成NPC议价 | npcId, saleItemId, playerPrice | BargainOffer |
| ExecuteTransaction | 执行交易 | saleItemId, price, buyerId | TransactionResult |
测试方案
单元测试
- 价格计算准确性测试
- 供需指数边界测试
- 议价触发条件测试
集成测试
- 完整交易流程测试
- 多玩家并发测试
- 长时间稳定性测试
平衡性测试
- 价格合理性验证(80%成交价在市场价±20%范围内)
- 利润空间测试(普通商品10-30%,稀有商品30-100%)
- 市场稳定测试(价格波动不超过基准价±50%)
价格模拟器
输入参数,模拟计算商品的市场价格和成交情况。
参数设置
计算结果
真实市场价格
--
你的定价
--
定价偏离度
--
成交概率
--
预计成交时间
--
价格分布图
--
--
--
--
系统建议
点击"开始计算"获取建议
批量模拟 - 不同定价对比
快速测试不同定价的成交情况:
点击上方按钮查看不同定价的对比结果