我正在用Java编写一个小游戏来练习编程,遇到了这个似乎无法自己解决的小问题。
在这个游戏中,我想建立一个虚拟商店来购买和出售物品。
大多数物品只能通过遵循我所谓的“配方”从其他物品中创建出来才能在游戏中获得。食谱基本上只是创建新项目所需的一组项目。一个项目可以有多个食谱。配方的结果可以是新金额的一个以上实例。我将以[项目,项目,...,项目](结果数量)之类的配方表示。
因此,有些基础项目无法创建,但必须通过其他方式获得,而某些基础项目只能通过其配方之一获得。
我想尝试模拟供应和需求,我想出了这个属性,我称之为“交易量”,每个商品的初始金额都初始化为0。交易金额表示要出售或购买多少物品。如果我售出X项商品,则其交易量增加X,而如果我购买Y项商品,其交易量减少Y。
现在我需要确定商品的价格。
所有基本项目都分配了固定值。然后,将价值和交易金额插入函数f(v,t),吐出一个价格。此价格始终> =0。此功能的一个属性是,如果交易量t为0,则结果价格等于输入值v。因此,如果一个玩家购买了一定数量的物品,则交易量变为下降x,价格接近0。如果另一个玩家卖出相同数量的相同商品,则交易金额回到0,价格跳回原始值。
现在所有基本项目都有一个值,我需要计算所有创建项目的值,以便能够使用f计算其价格。我希望它们的价值基于创建它们所需的最便宜的配方。因此,我必须解析所有食谱,将每个食谱中使用的所有商品的价格相加,然后确定食谱的最低价格。那就是所创建物品的价值。
我可以在图形中对此设置进行建模,其顶点表示可以在商店中交易的商品,并且有向边将商品连接到可以从源商品创建的另一商品。因此,我有一个有针对性的优势(“来源->目的地”),其中来源是目的地食谱之一的成分。因此,在此前提下,我创建了一个包含600个左右顶点的随机有向图。 每次游戏加载时,此图都是不同的,并且生成器应明确允许该图内的循环。
这里是一个例子:
项目A和B是基础项目,其值分别为10和2。他们的交易量最初为0,因此其价格等于其值10和2。
项目C是具有两个配方R1 = A,A,B和R2 = B,B,B的已创建项目。现在,我确定R1的价格为22,R2的价格为6(这是最低配方价格) 。因此,商品C的值为6(最初的交易量为0,因此价格也为6)。
在这种情况下,图形看起来像(A)->(C)<-(B)
到现在为止,这一切都工作得非常完美。
现在,当价格-价值依存关系是周期性的时,我出现了问题。
以下是我需要帮助的3种情况:
(1)- 0个顶点周期
简单地说,项目A具有固定价格,项目B可以根据配方[A,B]创建。如果B的价格发生变化,则B所创建的所有项目都必须重新计算。在这种情况下,B由A和B组成,因此我也必须重新计算B的价格。这再次触发了B的重新计算,依此类推…… 我知道前提很怪异,但认为它就像重新粉刷一扇门(B)。它是由同一扇门(B)加油漆(A)制成的。 我称其为0顶点循环,因为遍历该循环时,您传递了0个顶点以返回起点。
(2)- 1个顶点周期
如果从第一个示例中取出相同的项目A和B,并添加配方R1 = A,项目B和R2 = D,D,D的项目C和配方R3 = C的项目D。因此,C可以“分解”为3个D,然后3个D可以合并为一个C。如果我现在通过出售大量C来降低C的价格,那么我也应该降低D的价格,因为可以制造D但是由于C也可以由D制成,并且假设R2比R1便宜,那么我也必须降低C的价格,从而再次触发D的价格降低,依此类推。这将一直持续到该值收敛到某个位置为止,具体取决于所涉及食谱的成分。我称其为1个顶点循环,因为遍历该循环时,您只会传递一个顶点。
(3)- n个顶点循环
这是一般情况,我想如果我解决这个问题,上面的两个具体情况也将得到解决。 如果项目A由B,C的B,C的C到D的依次类推,直到项目Z由A组成,那么更改一个项目的价格将触发下一个项目的价格变化,从而触发一个项目的价格变化。下一个的价格,依此类推。该链实际上可以任意长。**
我正在寻找可以解决我的问题的算法。我希望能够计算初始交易金额为0的所有物品的所有价值和价格。当玩家购买和出售物品时,价格变化应在图表中传播。 我曾考虑过修改Dijkstra的算法,A *,Bellman-Ford算法和Floyd-Warshall算法,但对其中的任何一个都无法获得令人满意的结果。
有人可以指出我正确的方向吗?