首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我将如何‘产卵’或实例化多个生物的程序?

我将如何‘产卵’或实例化多个生物的程序?
EN

Stack Overflow用户
提问于 2013-01-09 21:19:16
回答 3查看 574关注 0票数 2

当我决定教自己编程时,我开始使用Java。虽然我熟悉编写简单的过程软件(主要是PHP),但最近我意识到,对于更复杂的操作,我依赖于对象。

我的第一款Java游戏通过实例化对象,在随机位置和随机速度生成对手。我对在C中按程序实现这个概念感到困惑(我对这个概念的工作知识很少),但我只能考虑为每个对手中的变量创建不同的数组,并使用数组索引作为伪对象引用“变量”。

代码语言:javascript
复制
int size[50]; // opponent size
for (i = 0; i < 100; i++) {
    size[i] = random_number();
}

有一个简单的解决方案,我的面向对象的思想忽略了吗?或者,某些问题真的适合于面向对象的概念,以至于你不得不编造虚假的对象(或者至少使用类似的模型)?我一直在C代码中看到结构体,我知道它们在概念上类似于类,但我只知道这些。所以,我想知道,在完全非面向对象的心态下,这样的事情是否可能发生。实例化没有真正的替代,是吗?这只是内存的分配,所以在我看来,某些C程序别无选择,只能使用某种形式的对象来编写。

请告诉我,我忽略了一些东西,因为否则我不能尊重谴责面向对象范式的C纯粹主义者。(我绝不是一个OO疯子,我的头脑已经非常习惯于这个想法,很难通过不同的视角来看待事物,而这并不能提供你所习惯的东西。)

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-09 21:27:30

如果我们忽略了所有高级的面向对象编程概念,比如按类型参数进行继承或多态,那么一切都归结为同一件事。

在C++中,您有对象,并调用附加到它们的方法;在C中,您有结构,通过参数传递这些函数来调用全局函数。

我的意思是,基本的oop范式在概念上是拥有能够通过它们的方法来执行事情的对象。现在,在C中,您可以获得相同的行为,但是您有不附加到任何对象的函数。

因此,基本上在C++或Java中,您需要:

代码语言:javascript
复制
class Point {
  private:
    int x, y;
  public:
    Point(int x, int y) : x(x), y(y) { }
    void draw() { ... }
};

在纯C中,您将拥有:

代码语言:javascript
复制
struct Point {
  int x, y;
}

struct Point makePoint(int x int y) {
  struct Point p = {.x = x, .y = y};
  return p;
}

void drawPoint(struct Point p) {
  ..
}

但是这两种表示的语义能力本质上是相同的,语法是不同的(甚至是它背后的概念)。当然,如果我们开始考虑更强大的oop功能,一切都会发生变化。

在许多情况下,您不需要所有这些功能来表示对象,并不是所有的东西都是面向对象的,也不是所有的问题都是通过oop方法来解决的。如果用C语言编写一个复杂的游戏引擎的话,同时在Java中编写低级函数,同时也会导致系统的过度使用。

票数 1
EN

Stack Overflow用户

发布于 2013-01-09 21:36:14

作为一个以OO程序员起家的人,我也花了一些时间去适应过程编程。对我来说,最大的事情是习惯于使用指针,记住函数不是由对象管理的,而是对您提供给它们的“对象”进行操作。不管怎么说,我认为像这样的东西可能就是你想要的,帮助你获得一个你想要做的事情的程序图像。

代码语言:javascript
复制
struct creature {
    int speed;
    int size;
};

void init_creature(struct creature *c) {
    c->speed = random_number();
    c->size = random_number();
}

int main() {
    struct creature creatures[10];

    for (int i = 0; i < (sizeof(creatures)/sizeof(struct creature)); i++) {
        struct creature c = creatures[i];
        init_creature(&c);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-01-09 21:32:31

struct可能就是你在这里要找的东西。

struct可以包含任意数量的命名变量(如类中的属性),但不能包含方法(理论上可以通过函数指针将方法放入其中,但这并不能真正按照您希望的方式工作)。

所以用C来表示你的生物,你可能会有这样的结构:

代码语言:javascript
复制
struct creature {
  int x_pos;
  int y_pos;
  int speed;
};

要声明一个生物"object“并设置一些属性,您可以这样做:

代码语言:javascript
复制
   void main() {
      struct creature mycreature;
      mycreature.x_pos = 1;
      mycreature.y_pos = 2;      
   }

struct creature mycreature语法有点笨拙,所以人们经常使用typedef结构,这样他们就不必说struct creature mycreature,而只需说creature mycreature

代码语言:javascript
复制
typedef struct _creature {
  int x_pos;
  int y_pos;
  int speed;
} creature;

结构可以包含其他结构,因此您也可以创建一个point结构,并将其用于位置变量:

代码语言:javascript
复制
typedef struct _point {
  int x;
  int y;
} point;

typedef struct _creature {
  point location;
  int speed;
} creature;

void main() {
    creature mycreature;
    mycreature.location.x = 1;
    mycreature.location.y = 2;      
}

现在一切都开始变得更加熟悉.

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

https://stackoverflow.com/questions/14246693

复制
相关文章

相似问题

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