如何将二维数组从一个函数返回到主函数,并将其保存在另一个数组中?

时间:2019-12-16 12:02:51

标签: c arrays

我正在编写游戏“井字游戏” 我请每个玩家在两个不同的功能中输入他们的下一步行动, 然后将它们的移动保存在2D数组中,然后将此数组保存在main函数中的另一个2d数组中。 但是,当我打印数组时,当第二个玩家进入其下一个动作时,它将更改char符号。 PS:这是一个char数组。 这是我的代码

char player1(char board[N][N], int n)
{
    int  k, l;
    print_player_turn(1);
    scanf("%d%d", &k, &l);
    board[k - 1][l - 1] = 'X';
    print_board(board, n);
    return board;
}
char player2(char board[N][N], int n)
{
    int  k, l;
    print_player_turn(2);
    scanf("%d%d", &k, &l);
    board[k - 1][l - 1] = 'O';
    print_board(board, n);
    return board;
}
int main()
{
    char board[N][N];
    int n;
    print_welcome();
    print_enter_board_size();
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            board[i][j] = '_';
    print_board(board, n);
    char* ptr = board;
    while (isFull(board,n)==0)
    {
        board[0][0] = player1(board, n);
        if (XloseGeneral(board, n) == 1)
        {
            print_winner(2);
            return 0;
        }
        board[0][0] = player2(board, n);
        if (OloseGeneral(board, n) == 1)
        {
            print_winner(1);
            return 0;
        }
    }
    print_tie();

} 

3 个答案:

答案 0 :(得分:0)

我建议您扩展2D阵列“板”的范围,以使包括播放器1和播放器2在内的所有方法都可以访问它,而不是将其作为参数传递。

这样,您可以确保对同一变量进行了修改,并且不进行任何重新初始化,这会导致丢失上一个条目。

答案 1 :(得分:0)

数组通过引用传递给函数。这意味着将指向该数组的指针传递给该函数。因此,对该函数 inside 中的数组所做的任何修改都将反映调用者(您情况下的主要方法)。因此,将函数void设置为不需要返回任何内容,然后从其中删除return语句。

答案 2 :(得分:0)

就像其他人所说的那样,您不需要返回板,您只需将指针传递到板即可。这是一个基于您的代码的简短示例:

#include <stdio.h>
#include <stdlib.h>

void player1(char **board);
void player2(char **board);
void print_board(char **board, int n);

void player1(char **board){
    int  k, l;
    fprintf(stderr, "Player 1, enter grid position:\n");
    scanf("%d%d", &k, &l);
    board[k - 1][l - 1] = 'X';
}

void player2(char **board){
    int  k, l;
    fprintf(stderr, "Player 2, enter grid position:\n");
    scanf("%d%d", &k, &l);
    board[k - 1][l - 1] = 'O';
}


void print_board(char **board, int n){
    for (int i = 0; i < n; i++){
        for( int j = 0; j < n; j++ ){
           fprintf(stdout, "%c ", board[i][j]);
        }
        fprintf(stdout, "\n");
    }
}

int main()
{
    int n;
    char **board; 
    fprintf(stdout, "Type in the board size:\n");
    scanf("%d", &n);

    // allocate memory for the board
    board = (char **) malloc(n * sizeof(char*));
    for (int i = 0; i < n; i++){
        board[i] = (char *)malloc(n * sizeof(char));
        for (int j = 0; j < n; j++){
            board[i][j] = '_';
        }
    }

    print_board(board, n);

    player1(board);
    player2(board);

    print_board(board, n);

    return 0;
}