我有一个测试项目,其中一些实体可以发射子弹,并且根据命中方向和一些随机值,它可以影响或被偏转。
当离线运行时,它很容易在移动中生成随机数,以便判断镜头是否应该弹跳,与random.randint()
或random.random()
一样。
但我希望通过UDP广播发射事件,以便其他客户可以在屏幕上显示相同的实体/射弹。
弹丸是非常高的速度,所以我不能等待服务器告诉我过去的位置并且只是使用它(我可以纠正轨迹)。主要想法是从远程实体接收fire
调用,获取一些值,例如position, velocity, randseed
。
我的问题是如何为每个实体使用种子?
假设我的屏幕上一次有10个子弹,每个子弹都有自己的伪随机种子,我想让子弹生成自己的伪序列,就像它们在网络的一侧或另一侧那样。
示例:
class Bullet(object): def __init__(self, pos, v, seed): self.randgen = InstanciableGenerator(seed) # ... def hit(self, pos, ...): currentRandom = self.randgen.get() # ...
这样每个实例都有自己的随机序列,而不是
random.seed()
在每个random.random()
调用中共享的序列。
如果这是一个坏主意,广播一个发射事件的最佳方法是什么,以便它与所有客户端+服务器有点同步?
PS:服务器具有完全权限,同步用于显示目的。
答案 0 :(得分:3)
使用random.Random
类,例如:
self.randgen = random.Random(seed)
然后,对self.randgen.random()
(或.randint(<int>)
)的调用将是您实例的本地调用。
或者,您可以在每次调用self.state = random.getstate()
之前创建一个使用random.setstate(self.state)
然后random.random()
的包装器