简体   繁体   中英

2D array in a struct

I am programming in c and for a homework assignment I am creating a battleship game. I have created a struct for the board (opponent board and my board), but I need a 2D array for the board. This is what I have so far

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;
}

I need to initialize the board to have all *'s which is why I have declared it a char type. I was thinking that maybe I could use a for loop to make the board consist of *'s but I do not know how to go about that because board[i][j] does not work since the memory is not allocated. I am really confused as to how to accomplish this task. I will later change the misses and hits to O's and X's. Please help me understand this.

I'm don't know C that well, but this seems to work:

#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;
}

I don't know what you mean by

"board[i][j] does not work since the memory is not allocated."

When you create the instance of Board with struct Board myboard, myboard has allocated memory for the Board struct, including the 10 by 10 chars. You would only need allocate memory if instead of an array you had a pointer, but memory is allocated for arrays.

You can also initialise the board with a loop instead of memset.

I need to initialize the board to have all *'s which is why I have declared it a char type. I could use a for loop to make the board consist of *'s.

Make your functions generic so they can work for yours as well as the opponent board. Avoid globals.

The presented below function initializeBoard can initialize the board of the structure Board to any char value. If you change your mind and you decide to replace '*' with any other value all what is need it is a change of the argument.

void initializeBoard(struct Board* board, char c);

board[i][j] does not work since the memory is not allocated.

As long as you create struct Board structure (be it on the stack or dynamically on the heap) the board[ROWS][COLUMNS] will have memory to hold its data. By creating struct Board structure all elements of the structure would get the needed memory.

I will later change the misses and hits to O's and X's

You will need a set function to change the content of the particular board cell.

This can be done via:

void setCell(struct Board* board, int row, int column, char c);

All you need is to supply the board , row , column coordinates and value c to be placed at proper place on the the board.

You will very likely need a function to check what do you have under given coordinates. This can be done via:

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

Take a look at the presented simple program.

Good luck with your programming. The road to the Kingdom of the Programming Perfection is a long one but always start from the first steps.

#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;
}

Output:

 * * * * * * * * * *                                                                                                                           
 * * * * *   * * * *                                                                                                                           
 * * * * * * X * * *                                                                                                                           
 * * * * * * * O O *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           

 * * * * * * * * * *                                                                                                                           
 * * O O * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *                                                                                                                           
 * * * * * * * * * *

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM