Object 面向对象编程-临时分组对象并释放它们

Object 面向对象编程-临时分组对象并释放它们,object,instance,grouping,move,concept,Object,Instance,Grouping,Move,Concept,我真的只是在这里寻找一些方向,我一直在自学,在这一点上,我真的不知道该看什么概念。也许我在理解如何进行面向对象编程时有一个基本错误,如果是,请指出: 我有一些项目的想法,所有这些都涉及到相同的概念;也就是说,将一组对象分组,对它们做一些事情,然后释放它们。也许我并没有用最好的方式来思考这个问题,但让我给你们一些概念性的例子来展示我正在尝试做什么 假设游戏中有不同的玩家,每个人都是一个对象。游戏中还有宇宙飞船,还有想象中的千年隼。我可以分别移动玩家和宇宙飞船玩家。移动或宇宙飞船。移动。但我想做的是

我真的只是在这里寻找一些方向,我一直在自学,在这一点上,我真的不知道该看什么概念。也许我在理解如何进行面向对象编程时有一个基本错误,如果是,请指出:

我有一些项目的想法,所有这些都涉及到相同的概念;也就是说,将一组对象分组,对它们做一些事情,然后释放它们。也许我并没有用最好的方式来思考这个问题,但让我给你们一些概念性的例子来展示我正在尝试做什么

假设游戏中有不同的玩家,每个人都是一个对象。游戏中还有宇宙飞船,还有想象中的千年隼。我可以分别移动玩家和宇宙飞船玩家。移动或宇宙飞船。移动。但我想做的是在玩家登上宇宙飞船时移动飞船和玩家。我这样做的概念框架是创建一个新的对象,当它移动时,会同时移动船和与船相关的所有玩家。在船里,四处走动。玩家需要保持独立于这组对象移动的能力,尽管考虑在船内走动,同时也随船移动。玩家可以自由登船和离船,因此需要有一个功能/方法将他们添加到船上,而不是脚本化/硬编程的事件。请原谅我误用术语:P

另一个例子是在化学项目的分子中发现的。碳链中的每个原子都是它自己的物体,追踪着像键的数量、质子、电荷等等。但是分子本身是一个更大的物体,里面充满了碳物体。分子对象需要动态变化,就像对其进行反应时一样;新的原子将成为其结构的一部分,有些原子将离开其结构。基本上,我需要能够根据哪个反应以及反应发生的位置将原子加载/卸载到分子中

另一个例子是在魔方游戏中,玩家可以看到所有6条边。当移动一行时,整个侧旋转90度。我想象的编程方式是将每个正方形作为一个对象;当我需要旋转一个边时,我会将该边的6个对象分组,围绕一个公共点旋转,然后从组中释放对象,这样立方体就可以被进一步操纵和求解

我可能会对这些东西进行硬编程,但我无法想象如何动态编程。我想设置这些,这样我就有了一个方法,可以添加或删除我的对象分组。这种编程方式可行吗?有没有更好的方法来实现我的目标


谢谢

我处理这个问题的方法是让容器对象有某种方式知道在任何给定时间与它关联的内容,以便它能够影响更改。让我们以你的宇宙飞船为例。你可以定义你的飞船等级,这样每艘飞船上都有一组玩家。每次玩家登上宇宙飞船时,您都会调用spaceship.boardplayer,表示给定玩家现在已登上宇宙飞船。然后定义spaceship.move,也可以对当前在船上的每个玩家(即玩家阵列的任何元素)调用player.move。假设每个飞船和每个玩家都知道自己的坐标,spaceship.move函数将直接更新飞船的坐标,然后依靠player.move为每个玩家执行内部更新。这样,飞船移动的任何时候,你也会影响到飞船上的任何玩家。然后,您可以定义一个spaceship.disbank函数,让玩家离开飞船

例如:

创建具有初始位置的宇宙飞船 创建具有初始位置的播放器 将玩家添加到宇宙飞船,将玩家位置更新为等于宇宙飞船位置 例如,通过调用player.Move函数将玩家向上移动5个单位 通过调用spaceship.Move,将宇宙飞船向上移动100个单位。这也将通过调用player.move来移动玩家,因此玩家相对于宇宙飞船的位置仍然向上5个单位 让玩家离开宇宙飞船 把宇宙飞船向下移动100个单位。由于玩家已不在飞船上,因此spaceship.move不会更新玩家的位置,并将保持不变
您所说的是一个对象包含另一个对象的集合,这些对象可以不断地添加和删除。我将以你对宇宙飞船的概念为例,举例说明如何实现它:

class Ship {
  list<Person> crew;

  void board(Person player) {
    crew.add(player);
  }

  void unboard(Person player) {
    crew.remove(player);
  }

  void Move() {
    //do move things
    foreach(Person player in crew) {
      player.Move();
    }
  }
在类的概念中,另一种选择是只负责一件事,您可以引入一个负责移动对象的类:

Class Mover {
  list<Object> objects

  void Move(Location location) {
    foreach(Object object in objects) {
      object.location = location;
    }
  }
}
Class Mover {
  list<Object> objects

  void Move(Location location) {
    foreach(Object object in objects) {
      object.location = location;
    }
  }
}