关于多维数组和指针的概念问题

时间:2015-04-01 23:50:43

标签: c arrays pointers multidimensional-array

之前已经提出了类似的问题,但是我遇到了针对特定情况的指针和多维数组的问题。我不是最好的C程序员,但我想要变得更好。我想知道是否有人可以在概念上告诉我我缺少什么,希望能帮助我清理一些概念。我正在c中构建一个空间入侵者类型的游戏,它将在嵌入式平台(即低内存)上运行。我的嵌入式设备通过串口将输出发送到计算机,计算机将游戏信息输出到某些用python写的gui;游戏本身虽然正在微控制器上播放。 gui解释这些信息并在我想要的地方绘制图片,但它只是采集数据和绘图,仅此而已。

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

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

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

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

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

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

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

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

    [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]
    

1 个答案:

答案 0 :(得分:1)

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

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

任何时候你想创建一个新的东西',使用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];