首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#:多个类实例都做同样的事情

C#:多个类实例都做同样的事情
EN

Stack Overflow用户
提问于 2020-01-19 23:49:49
回答 1查看 111关注 0票数 0

我有3个不同的类: Entity,Control和Environment

在Entity类中,我有一个Control变量:

readonly Control m_Control

在Entity类的构造函数中,我实例化了Control类。Entity类中有一个Update方法,用于检查Control类中枚举的状态:

代码语言:javascript
运行
复制
public class Entity
{

   public float Rotate {get; private set;}

   readonly Control m_Control

   public Entity(float rot)
   {
     Rotate = rot;
     m_control = new Control();
   }

    public void Update(float time)
    {

            switch (m_control.Rotating())
            {
                case Control.Rotator.Right:
                    Rotate += time * 1.5f;
                    break;
                case Control.Rotator.Left:
                    Rotate -= time * 1.5f;
                    break;
                case Control.Rotator.Still:
                    break;
                default:
                    break;          
            }
     }



}

控件类:

代码语言:javascript
运行
复制
public class Control
{
        private Random rnd = new Random();
        private int _randomTurn;

        public enum Rotator
        {
            Still,
            Right,
            Left
        }

        public Control()
        {
            TimerSetup(); // Initialize timer for Entity
        }

 public Rotator Rotating()
        {

                switch(_randomTurn)
                {
                    case 1:
                        return Rotator.Right;
                    case 2:
                        return Rotator.Left;
                    default:
                        return Rotator.Still;
                }

            }

 private void TimerSetup()
 {
            DispatcherTimer dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(GameTickTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
            dispatcherTimer.Start();
 }


 private void GameTickTimer_Tick(object sender, EventArgs e)
 {
     RandomTurn();
 }


 private void RandomTurn() 
 {
    _randomTurn = rnd.Next(1, 4);
 }


}

Environment类是我实例化每个实体的地方。所以我有两个Entity的实例。

代码语言:javascript
运行
复制
public class Environment
{

readonly Entity m_entity;
readonly Entity m_entity2;

public Environment()
{
   m_entity = new Entity(90.0f);
   m_entity2 = new Entity(180.0f);
}


 public void Update(float time)
        {
            m_entity.Update(time);

            m_entity2.Update(time);
        }
}

我的问题是,当我实例化多个实体时,每个实体都做完全相同的事情。

例如,Control类有一个旋转函数,但每个实例化的实体在完全相同的时间以完全相同的方式移动。

对于我来说,让每个实例化的实体独立运行的最佳方式是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-20 02:40:42

你面临的问题是很难看清的。

问题出在Random类的实例化方式上。随机生成器从一个种子值开始,该种子值确定该生成器返回的所有数字。因此,具有相同种子值的两个随机生成器实例将生成相同的数字序列。现在,如果您在创建随机生成器时没有提供种子值,它将根据系统时钟本身创建一个种子值。但是,如果您创建了2个随机生成器,那么系统时钟将不会改变,它们将接收相同的种子,并因此产生相同的序列。

因此,确保不会同时创建多个Random实例总是很重要的。

如果按如下方式更改Control类中的rnd属性:

代码语言:javascript
运行
复制
private static Random rnd = new Random();

应该能行得通。该静态属性确保Control类的所有实例都共享此属性(因此只创建了Random的一个实例)。

希望这对你的项目有所帮助,并祝你好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59811697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档