【问题标题】:Conceptual Questions Regarding Multidimensional Array's and Pointers关于多维数组和指针的概念问题
【发布时间】:2015-04-01 23:50:43
【问题描述】:

以前也有人问过类似的问题,但我在具体情况下无法理解指针和多维数组。我不是最好的 C 程序员,但我正在努力变得更好。我想知道是否有人可以从概念上告诉我我缺少什么,并希望能帮助我理清一些概念。我正在用 c 语言构建一个太空侵略者类型的游戏,它将在嵌入式平台上运行(即低内存)。我的嵌入式设备通过串行将输出发送到计算机,计算机将游戏信息输出到我用 python 编写的一些 gui;游戏本身虽然是在微控制器上玩的。 gui 解释这些信息并在我想要的地方绘制图片,但它只是获取数据和绘图,仅此而已。

我遇到的问题是试图弄清楚如何构建游戏以及如何玩游戏。这是我的想法:

  1. 从计算平台获取窗口分辨率(这将是缩放的窗口大小,虽然我还不太确定是什么)。

  2. 使用缩放后的分辨率创建一个代表游戏网格的二维数组,其中数组中的每个元素代表玩家、敌人、子弹等可能的位置。

  3. 每个 2D 位置 (x, y) 坐标都可以包含有关该位置的大量信息,包括但不限于:某个对象的存在、该对象的当前状态(健康状况、有关它的其他数据)等...

  4. 在每个计算周期,更新游戏地图上每个对象的当前位置和状态。

为了帮助澄清我在说什么,我在下面添加了一个粗略的插图。我创建了一个代表“游戏地图”的 2D 网格。想象一下这是我的游戏将在其上进行的网格。每个有 x 的地方都是当前没有任何对象的地方。任何带有 o 的地方都存在一些独特的对象,每个对象都有不同的独特特征。

我的问题是如何创建这个东西?我对创建二维数组的概念很满意,但数组只是对我存储某些数据类型的某个位置的引用。我可以将指向我的唯一对象的指针存储在 myArray[2][4] 中吗?如果是这样,我该怎么做?另外,假设我在那里存储了一些指向我的对象的指针,我如何给它多个属性?我已经创建了一些 typdef 结构来定义我想要的属性(包括它的当前位置),但是我的地图中的每个 o 是否都引用了整个结构?

我只是有点困惑,正在寻找清理我的想法。谢谢大家的时间!

[x] [x] [x] [x] [x] [x] [x] [x] [x] [x]

[x] [x] [x] [o] [o] [o] [o] [o] [x] [x]

[x] [x] [x] [o] [o] [o] [o] [o] [x] [x]

[x] [x] [x] [x] [x] [o] [x] [x] [x] [x]

[x] [x] [x] [x] [x] [x] [x] [x] [x] [x]

[x] [x] [x] [x] [x] [x] [x] [x] [x] [x]

[x] [x] [x] [x] [x] [x] [x] [x] [x] [x]

[x] [x] [x] [x] [x] [x] [x] [x] [x] [x]

[x] [x] [o] [o] [o] [o] [o] [x] [x] [x]

[x] [x] [x] [x] [x] [o] [x] [x] [x] [x]

【问题讨论】:

  • 您可能想要的是void* 的数组。然后每个单元包含一个指向结构的指针,这些结构应该通过它们的第一个成员作为类型 ID 来标识自己。这就是你在 C 中进行“鸭式打字”的方式。如果你真的想对它进行 OOPy,类型 ID 本身可能是指向类结构的指针。

标签: c arrays pointers multidimensional-array


【解决方案1】:

使您的数组成为指向您在程序中声明的特定类型结构的指针的二维数组。该结构将包含所有属性和/或对相关结构的引用。矩阵的每个元素(例如二维数组)都将包含 NULL 或指向相关结构的指针。

如果您的游戏将多个单元格关联在一起,您可以将它们链接到多个结构体,这些结构体包含将它们关联起来的信息,或者只是指向结构体,然后通过您认为合适的任何算法确定周围的矩阵元素以确定关系的几何形状发布并采取相应的行动(根据您设计游戏的方式)。

任何时候你想创建一个新的'thingy',使用malloc()。使用 free() 释放它,并在释放它时将引用设置为 NULL,这样您就不会尝试访问空闲对象或双重释放(两者都不好)。释放 NULL 是无害的。

有人建议使用 void * 链接到不同的对象,按照惯例(如果您使用该方法,您的约定)第一个字段表示一个类型。但是,如果您创建一个像thingy_t 这样的泛型类型,它可以以您选择的任何方式将自己与其他事物区分开来。有多种方法可以解决它。

typedef struct thingy {
     struct thingy *nextThingy;
     struct thingy *prevThingy;
     char *name;
     uint32_t color;
     int goldCoinCount;
     int isElf;
     int annoyedALephrechaun;
     int StarFleetApproved; 
     int rank;
     int serialNumber;
     float netWorth;
     houseType_t *houseType;
     struct thingy *friends[];
     int prevCoords[2];
     .
     .
     .
} thingy_t;

#define MAX_ROWS 100
#define MAX_COLS 100

thingy_t *playingField[MAX_ROWS][MAX_COLS];

【讨论】:

  • 谢谢!你能澄清一下将细胞联系在一起吗?我想我需要这样做。例如,如果*myArray[2][4] 的类型属于特定类型,我可以说,给周围的 4 个“地方”吗?与*myArray[2][4] 中的信息相同吗?此外,b/c 我使用的是嵌入式平台(AVR),没有可用的内存分配命令(malloc),所以我需要想办法解决这个问题。你的帖子很有帮助!
  • 你有指针的 x,y (这是一个地址),你可以比较周围的单元格测试 (x-1, y), (x+1, y), (x, y + 1), (x, y - 1), (x -1, y -1) ... 和边界检查以确保坐标没有超出矩形并查看它们是否包含相同的地址,并且然后据此做出决定。保存指向不同“对象”(结构)的指针,其中结构具有某种确定它们关系的方式。由你决定。关于缺少 malloc()。做你自己的。分配某种结构的大型静态数组,并通过索引而不是ptr来引用它们。
  • 我的意思是,与 malloc() 不同,您可以跟踪大型静态对象数组中的哪些元素是空的,并在创建和删除它们时使用/重用它们。当它们归零时,它们是空闲的,并使用 memcmp() 或等效的或另一个数组来跟踪空闲槽。然后在您的比赛场地中将索引存储到该数组中以定位感兴趣的结构
  • 您也可以围绕一大块预先分配的(静态)内存设计自己的 malloc() ,但这将是相当大的工作量,除非您可能会找到一些编码实现示例并借用来自开源(谷歌),只是猜测。
  • 当我说你可以“也”设计你自己的 malloc() 时,我的意思是你可以或者使用 malloc,(而不是通过它们引用结构的其他方法索引到您的大型“池”结构(例如,它们的静态分配数组))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多