关于多维数组和指针的概念问题
Conceptual Questions Regarding Multidimensional Array's and Pointers
以前也有人问过类似的问题,但对于我的具体情况,我无法理解指针和多维数组。我不是最好的 C 程序员,但我正在努力变得更好。我想知道是否有人可以从概念上告诉我我遗漏了什么,并希望能帮助我理清一些概念。我正在用 c 构建一个 space 入侵者类型的游戏,它将在嵌入式平台(即低内存)上 运行。我的嵌入式设备通过串口将输出发送到计算机,计算机将游戏信息输出到我在 python 中编写的某些图形用户界面;游戏本身虽然是在微控制器上玩的。 gui解释这些信息并在我想要的地方画图,但它只是获取数据和绘图,仅此而已。
我遇到的问题是试图弄清楚如何构建游戏以及如何玩游戏。这是我的想法:
从计算平台获取 window 分辨率(这将是 window 缩放后的大小,虽然我还不太确定是什么)。
使用缩放后的分辨率创建一个代表游戏网格的二维数组,其中数组中的每个元素代表玩家、敌人、子弹等的可能位置...)。
每个 2D 位置 (x, y) 坐标都可以包含有关该位置的大量信息,包括但不限于:某个对象的存在、该对象的当前状态(健康状况、有关的其他数据它), 等等...
在每个计算周期,更新游戏地图上每个对象的当前位置和统计数据。
为了帮助阐明我的意思,我在下面添加了一个粗略的插图。我创建了一个代表 'game map' 的二维网格。想象这是我的游戏将在其上进行的网格。每个有 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]
使您的数组成为指向您在程序中声明的特定类型结构的二维指针数组。该结构将包含对相关结构的所有属性 and/or 引用。矩阵的每个元素(例如二维数组)都将包含 NULL
或指向相关结构的指针。
如果您的游戏将多个单元格关联在一起,您可以将它们 link 到包含信息的多个结构,以便将它们相互关联,或者只指向结构,然后通过您认为合适的任何算法确定周围的矩阵元素确定关系的几何形状并采取相应的行动(根据您设计游戏的方式)。
任何时候你想创建一个新的 'thingy',使用 malloc()。使用 free() 释放它,并在释放时将引用设置为 NULL,这样您就不会尝试访问自由对象或双重释放(两者都不好)。释放 NULL 是无害的。
有人建议对不同的对象使用 void * linking,按照惯例(如果您使用该方法,您的惯例)第一个字段表示一个类型。但是如果你创建一个像 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];
以前也有人问过类似的问题,但对于我的具体情况,我无法理解指针和多维数组。我不是最好的 C 程序员,但我正在努力变得更好。我想知道是否有人可以从概念上告诉我我遗漏了什么,并希望能帮助我理清一些概念。我正在用 c 构建一个 space 入侵者类型的游戏,它将在嵌入式平台(即低内存)上 运行。我的嵌入式设备通过串口将输出发送到计算机,计算机将游戏信息输出到我在 python 中编写的某些图形用户界面;游戏本身虽然是在微控制器上玩的。 gui解释这些信息并在我想要的地方画图,但它只是获取数据和绘图,仅此而已。
我遇到的问题是试图弄清楚如何构建游戏以及如何玩游戏。这是我的想法:
从计算平台获取 window 分辨率(这将是 window 缩放后的大小,虽然我还不太确定是什么)。
使用缩放后的分辨率创建一个代表游戏网格的二维数组,其中数组中的每个元素代表玩家、敌人、子弹等的可能位置...)。
每个 2D 位置 (x, y) 坐标都可以包含有关该位置的大量信息,包括但不限于:某个对象的存在、该对象的当前状态(健康状况、有关的其他数据它), 等等...
在每个计算周期,更新游戏地图上每个对象的当前位置和统计数据。
为了帮助阐明我的意思,我在下面添加了一个粗略的插图。我创建了一个代表 'game map' 的二维网格。想象这是我的游戏将在其上进行的网格。每个有 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]
使您的数组成为指向您在程序中声明的特定类型结构的二维指针数组。该结构将包含对相关结构的所有属性 and/or 引用。矩阵的每个元素(例如二维数组)都将包含 NULL
或指向相关结构的指针。
如果您的游戏将多个单元格关联在一起,您可以将它们 link 到包含信息的多个结构,以便将它们相互关联,或者只指向结构,然后通过您认为合适的任何算法确定周围的矩阵元素确定关系的几何形状并采取相应的行动(根据您设计游戏的方式)。
任何时候你想创建一个新的 'thingy',使用 malloc()。使用 free() 释放它,并在释放时将引用设置为 NULL,这样您就不会尝试访问自由对象或双重释放(两者都不好)。释放 NULL 是无害的。
有人建议对不同的对象使用 void * linking,按照惯例(如果您使用该方法,您的惯例)第一个字段表示一个类型。但是如果你创建一个像 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];