如何通过将二维数组等同于带有 void 参数的函数来填充它?

问题描述 投票:0回答:2

我正在使用 2D 数组制作一个小游戏。我尝试创建一个函数,让您从一个干净的板开始,并希望它以这样的方式进行:如果有意义的话,干净板函数是一个右值。

#include <stdio.h>
#include <stdlib.h>
#define MAX 8
#define EMPTY 0
#define BLACK 1
#define WHITE -1


//Fills the 2D array with 0s and places the 4 starting pieces in the middle
int **cleanboard(void){
    int newboard[MAX][MAX];
    (*newboard)[MAX] = malloc(sizeof*newboard*MAX);

    for(int row=0; row<MAX; row++){
        for(int col=0; col<MAX; col++){
            newboard[row][col] = EMPTY;
        }
    }

    newboard[3][3] = WHITE, newboard[4][4] = WHITE;
    newboard[4][3] = BLACK, newboard[3][4] = BLACK;

    return newboard;
}


//Displays the board
void printboard(int arr[][MAX]){
    printf("   1 2 3 4 5 6 7 8\n");               //Top numbers

    for(int i=0; i<MAX; i++){
        for(int j=0; j<MAX; j++){
            if(j==0){printf("%d ", i+1);}        //Side numbers
            switch(arr[i][j]){                   //Print piece
            case 0: printf(" .");
                    break;
            case 1: printf(" b");
                    break;
            case -1: printf(" w");
                    break;
            }
        }
     printf("\n");
    }
}


int main(){
    int **board;
    board = cleanboard();
    printboard(board);
    return 0;
}

使用给定的代码,它输出:

   1 2 3 4 5 6 7 8
1

但是,这个示例是电路板应该看起来的样子:

//Example 2D array:

int grid[MAX][MAX] = {{-1, 1, -1, 1, 0, -1, 1, 0},
                      {1, -1, -1, 1, 0, -1, -1, 1},
                      {1, 1, -1, 1, -1, 1, 1, 1},
                      {-1, 0, -1, -1, -1, 1, 1, -1},
                      {1, -1, 0, 1, 0, 1, 0, 0},
                      {0, 1, -1, 1, -1, -1, 1, -1},
                      {1, 1, 1, -1, 0, -1, -1, -1},
                      {0, -1, -1, -1, -1, 1, -1, 0}};

printboard(grid);

输出:

   1 2 3 4 5 6 7 8
1  w b w b . w b .
2  b w w b . w w b
3  b b w b w b b b
4  w . w w w b b w
5  b w . b . b . .
6  . b w b w w b w
7  b b b w . w w w
8  . w w w w b w .

cleanboard 函数未存储值或导致 printboard 函数停止的内容。 如有任何帮助,我们将不胜感激。

arrays c pointers 2d
2个回答
0
投票

printboard
的参数类型就是你想要的。 但是,数组到指针的转换仅发生在多维数组的第一维上。 您正在尝试在
int (*)[MAX]
int **
之间进行转换,它们不是同一件事。

cleanboard
中,您需要将
newboard
定义为:

int (*newboard)[MAX] = malloc(sizeof*newboard*MAX);

那么函数本身应该定义为:

int (*cleanboard(void))[MAX] {

并且

board
中的
main
应定义为:

int (*board)[MAX];

此外,您还需要在内部循环运行后在

printboard
中打印换行符。


0
投票

以下建议代码:

  1. 创建面板
  2. 初始化板

现在,建议的代码:

#include <stdio.h>
#include <stdlib.h>
#define MAX 8
#define EMPTY 0
#define BLACK 1
#define WHITE -1


//Fills the 2D array with 0s and places the 4 starting pieces in the middle
int **cleanboard(void)
{
    int **newboard = malloc( MAX * sizeof( int ) );;

    for(int row=0; row<MAX; row++)
    { 
         newboard[row] = malloc( MAX * sizeof( int ) );
    }
    
    for(int row=0; row<MAX; row++)
    {
        for(int col=0; col<MAX; col++)
        {
            newboard[row][col] = EMPTY;
        }
    }

    newboard[3][3] = WHITE;
    newboard[4][4] = WHITE;
    newboard[4][3] = BLACK;
    newboard[3][4] = BLACK;

    return newboard;
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.