我正在创建一个简单的游戏,其中我有一个板,我传递给许多函数来改变它的值。现在我这样做:
void play(int board[2][HEIGHT][WIDTH]);
其中HEIGHT和WIDTH均使用define
定义。
我应该如何简化它?我在某个地方读到这样简化它并不是一个好方法:void play(int*** board)
,虽然我传递的内容总是具有完全相同的大小。
答案 0 :(得分:0)
你可以在一个结构中使用该板,然后使用像这样的结构数组
struct Board {
int width;
int height;
int **data;
};
然后你可以编写一个函数来像这样初始化它
Board *new_board(int width, int height)
{
struct Board *board;
int i;
board = malloc(sizeof(struct Board));
if (board == NULL)
return NULL;
board->data = malloc(width * sizeof(int *));
if (board->data == NULL)
{
free(board);
return NULL;
}
board->width = width;
for (i = 0 ; i < width ; i++)
{
board->data[i] = malloc(height * sizeof(int));
if (board->data[i] == NULL)
{
while (--i > 0)
free(board->data[i]);
free(board->data);
free(board);
return NULL;
}
}
board->height = height;
return board;
}
然后你可以将struct Board *pointer[2]
传递给你想要访问电路板的函数,并像这样初始化数组 1
struct Board *pointer[2];
int i;
for (i = 0 ; i < sizeof(poitner) / sizeof(pointer[0]) ; ++i)
pinter[i] = new_board(width, height);
不要忘记您还需要free_board()
功能。
1 假设您知道width
和height
。
答案 1 :(得分:0)
在函数参数中,您可以省略多维数组的第一个维度的长度。因此
void play(int board[2][HEIGHT][WIDTH]);
相当于
void play(int board[][HEIGHT][WIDTH]);
您还应该知道编译器更改
void foo(int arr[]);
到
void foo(int *arr);
即。 arr
实际上是指向传递的数组的第一个元素的指针。请注意,传递的数组元素的类型为int
现在考虑你的情况,传递的数组的元素是int [HEIGHT][WIDTH]
类型,即2D数组。因此,board
将成为指向int [HEIGHT][WIDTH]
类型的2D数组的指针。
void play(int (*board)[HEIGHT][WIDTH]);
函数调用就像这样
play(board);
我在某处读到,这样简化它并不是一个好方法:
void play(int*** board)
,虽然我传递的内容总是具有完全相同的大小。
是。这是真的。这是因为int ***
和int (*)[HEIGHT][WIDTH]
属于不同类型,这意味着它们不是类型兼容的。
答案 2 :(得分:0)
这样的事情会更简单吗?您还可以在struct
中添加其他数据,例如分数,如果您想撤消最后一步。
#include <stdio.h>
#define HEIGHT 8
#define WIDTH 8
typedef struct Btype {
int board [HEIGHT][WIDTH];
} btype;
void play(btype *current) {
}
int main(void) {
btype history[2] = {0};
while (1) {
history[0] = history[1]; // save last state
play(&history[1]);
}
return 0;
}