2015-08-13 71 views
1

我想要一个随机移动我的敌人的模式,因为当我有3或4个敌人时,他们看起来像是同一个敌人的移动。 这是我的随机码:随机敌人模式

  int seed = unchecked(System.DateTime.Now.Ticks.GetHashCode()); 
     rand = new Random(seed); 

这里过程的代码,此举:

public void move(GameTime time, WorldScreen screen) 
    { 
     timer += (float)time.ElapsedGameTime.TotalMilliseconds; 
     if (timer > 2000) 
     { 
      switch (rand.Next(0, 3)) 
      { 
       case 0: 
        base.direction = Enemy.Direction.down; 
        break; 
       case 1: 
        base.direction = Enemy.Direction.right; 
        break; 
       case 2: 
        base.direction = Enemy.Direction.left; 
        break; 
       case 3: 
        base.direction = Enemy.Direction.up; 
        break; 

      } 
      timer = 0; 
     } 
     timer1 += (float)time.ElapsedGameTime.TotalMilliseconds; 
     if (timer1 > 50) 
     { 
      timer1 = 0; 
      if (direction == Enemy.Direction.down) 
      { 
       if (!MoveCollision(new Vector2(position.X, position.Y + speed), screen)) 
       { 
        base.position.Y += speed; 
        ActualAnimation = getAnimation("rundown"); 
       } 
       else 
       { 
        base.direction = Enemy.Direction.right; 
       } 
      } 
      if (direction == Enemy.Direction.up) 
      { 
       if (!MoveCollision(new Vector2(position.X, position.Y - speed), screen)) 
       { 
        base.position.Y -= speed; 
        ActualAnimation = getAnimation("runup"); 
       } 
       else 
       { 
        base.direction = Enemy.Direction.down; 
       } 
      } 
      if (direction == Enemy.Direction.right) 
      { 
       if (!MoveCollision(new Vector2(position.X + speed, position.Y), screen)) 
       { 
        base.position.X += speed; 
        ActualAnimation = getAnimation("runright"); 
       } 
       else 
       { 
        base.direction = Enemy.Direction.left; 
       } 
      } 
      if (direction == Enemy.Direction.left) 
      { 
       if (!MoveCollision(new Vector2(position.X - speed, position.Y), screen)) 
       { 
        base.position.X -= speed; 
        ActualAnimation = getAnimation("runleft"); 
       } 
       else 
       { 
        base.direction = Enemy.Direction.up; 
       } 

      } 
     } 
     ActualAnimation.update(time, position); 
    } 

但是这个代码只是做了在房间内的所有敌人相同的模式。 thx帮助我。

+1

'rand = new Random(seed)'line? – Mephy

+0

因为第二个参数是**独占**上限,所以将'rand.Next(0,3)'更改为'rand.Next(0,4)'可能会很有用。换句话说,'rand.Next(0,3)'只返回来自'{0,1,2}'的值。 – Enigmativity

+0

你可以尝试实例化一个'新Random()'(没有不必要的种子代码)作为'static'字段吗? – Enigmativity

回答

0

我相信在这个

int seed = unchecked(System.DateTime.Now.Ticks.GetHashCode()); rand = new Random(seed);` 

检查问题的规定,如果你多次调用它太接近的时间。如果那这样你会得到

rand.Next(0, 3) 

每次调用时相同的随机数,你会得到相同的号码,因此,你会得到每一个敌人相同的模式。

Similar question

0

好吧,我解决了这一个把一个柜台上的阅读器做这样的种子(这是对在地图读者):

int id = map.Layers[1].Tiles[i].Gid; 
      if (id == 172) 
      { 
       enemys.Add(new Hero.World.Entitys.Enemys.Octorock(new Vector2((int)position.X + map.Layers[1].Tiles[i].X * 16, (int)position.Y + map.Layers[1].Tiles[i].Y * 16),i)); 

      } 

而在此之后的构造的敌人是这样的:

public Octorock(Vector2 position,int i) :base(position) 
    { 
     int seed = unchecked(System.DateTime.Now.Millisecond); 
     rand = new Random(seed*i);}