结构

时间:2018-03-04 18:59:47

标签: c arrays multidimensional-array struct

我在c编程和作业作业我正在创建一个战舰游戏。我已经为电路板(对手板和我的电路板)创建了一个结构,但我需要一个2D数组用于电路板。这就是我到目前为止所拥有的

struct Board
{
        char board[10][10];
        int carrierHits;
        int battleshipHits;
        int destroyerHits;
        int subHits;
        int patrolHits;
};
int initializedBoard() //changed from"myBoard" to "initializedBoard"
{
        struct Board myBoard;
}

我需要初始化电路板以获得所有*,这就是我将其声明为char类型的原因。我在想,也许我可以使用for循环来使电路板由*组成,但我不知道如何去做,因为电路板[i] [j]不起作用,因为没有分配内存。我真的很困惑如何完成这项任务。我稍后会将失误和命中改为O和X。请帮我理解这一点。

2 个答案:

答案 0 :(得分:1)

我不太了解C,但这似乎有效:

#include <stdio.h>
#include <string.h>

#define ROWS 10
#define COLUMNS 10

struct Board
{
    char board[ROWS][COLUMNS];
    int carrierHits;
    int battleshipHits;
    int destroyerHits;
    int subHits;
    int patrolHits;
};

struct Board myboard;

void initializeBoard(struct Board* board)
{
    memset(board->board, '*', ROWS * COLUMNS);
}

void fireAt(int row, int column)
{
    myboard.board[row][column] = '0';
}

int main()
{
    initializeBoard(&myboard);
    fireAt(4, 5);
    fireAt(4, 6);
    fireAt(4, 7);

// SHOW THE BOARD
        for (int i = 0; i < 10; ++i)
        {
            for (int j = 0; j < 10; ++j)
                printf(" %c", myboard.board[i][j]);
            printf("\n");
        }

    return 0;
}

我不知道你的意思

  

“board [i] [j]不起作用,因为没有分配内存。”

当您使用struct Board myboard创建Board实例时,myboard已为Board结构分配了内存,包括10 x 10个字符。你只需要分配内存,而不是你有一个指针的数组,但是为数组分配了内存。

您也可以使用循环而不是memset初始化电路板。

答案 1 :(得分:1)

  

我需要初始化电路板以获得所有*,这就是我拥有的原因   声明它是char类型。我可以使用for循环来制作电路板   由*组成。

让你的功能变得通用,这样它们就可以为你的和对手板工作。避免使用全局变量。

以下功能initializeBoard可以将board的{​​{1}}初始化为任意structure Board值。如果你改变了主意,你决定 将char替换为任何其他值,只需更改参数即可。

'*'
  

board [i] [j]不起作用,因为没有分配内存。

只要您创建void initializeBoard(struct Board* board, char c); 结构(无论是在堆栈上还是在堆上动态),struct Board将拥有内存来保存其数据。通过创建board[ROWS][COLUMNS]结构,结构的所有元素都将获得所需的内存。

  

我稍后会将失误和命中更改为O和X的

您将需要一个set函数来更改粒子板单元格的内容。

这可以通过以下方式完成:

struct Board

您只需提供void setCell(struct Board* board, int row, int column, char c); boardrow坐标和值column即可放置在主板上的适当位置。

您很可能需要一个函数来检查在给定坐标下您有什么。这可以通过以下方式完成:

c

看看提出的简单程序。

祝你的节目顺利。通往完美程序王国的道路是漫长的,但总是从最初的步骤开始。

char getCell(struct Board* board, int row, int column);

输出:

#include <stdio.h>
#include <string.h>

#define ROWS 10
#define COLUMNS 10

struct Board
{
    char board[ROWS][COLUMNS];
    int carrierHits;
    int battleshipHits;
    int destroyerHits;
    int subHits;
    int patrolHits;
};

void initializeBoard(struct Board* board, char c)
{
    for (int i = 0; i < ROWS; i++)
        for (int j = 0; j < COLUMNS; j++)
              board->board[i][j] = c;
}

void showBoard(struct Board* board)
{
    for (int i = 0; i < ROWS; i++)
    {
        for (int j = 0; j < COLUMNS; j++)
        {
            printf(" %c", board->board[i][j]);  
        }   
        printf("\n");
    }
    printf("\n");
}

void setCell(struct Board* board, int row, int column, char c)
{
    board->board[row][column] = c;
}

char getCell(struct Board* board, int row, int column)
{
    return (board->board[row][column]);
}

int main(void)
{
    struct Board my_board;
    struct Board opponent_board;

    initializeBoard(&my_board, '*');
    initializeBoard(&opponent_board, '*');

    if(getCell(&my_board,1,5) == '*')
        setCell(&my_board, 1, 5, ' ' );

    setCell(&my_board, 2, 6, 'X' );
    setCell(&my_board, 3, 7, 'O' );
    setCell(&my_board, 3, 8, 'O' );

    setCell(&opponent_board, 1, 2, 'O' );
    setCell(&opponent_board, 1, 3, 'O' );

    showBoard(&my_board);
    showBoard(&opponent_board);

    return 0;
}
相关问题