Sha256: 6c6a14ccecef33f6c5f70f624967aba843bb858c61a21f4925836ee4c1c89ed8

Contents?: true

Size: 1.73 KB

Versions: 49

Compression:

Stored size: 1.73 KB

Contents

#include "minesweeper.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static void set_single_field(char **minefield, const size_t row,
                             const size_t col)
{
   if (minefield[row][col] == '*')
      return;

   const char c = minefield[row][col];
   minefield[row][col] = (c == ' ') ? '1' : c + 1;
}

static void increment_neighbors(char **minefield, const size_t row_count,
                                const size_t col_count, const size_t row,
                                const size_t col)
{
   const size_t from_row = row ? row - 1 : row;
   const size_t to_row = (row + 1 < row_count) ? row + 1 : row;
   const size_t from_col = col ? col - 1 : col;
   const size_t to_col = (col + 1 < col_count) ? col + 1 : col;

   for (size_t i = from_row; i <= to_row; i++) {
      for (size_t k = from_col; k <= to_col; k++)
         set_single_field(minefield, i, k);
   }
}

char **annotate(const char **minefield, const size_t rows)
{
   if (minefield == NULL || *minefield == NULL || rows == 0)
      return NULL;

   const size_t cols = strlen(minefield[0]);

   char **annotated = malloc(sizeof(char *) * rows);
   if (annotated == NULL) {
      fprintf(stderr, "Memory error!\n");
      return NULL;
   }

   char *all_rows = malloc(rows * (cols + 1));
   if (all_rows == NULL) {
      fprintf(stderr, "Memory error!\n");
      free(annotated);
      return NULL;
   }

   for (size_t i = 0; i < rows; i++) {
      annotated[i] = &all_rows[i * (cols + 1)];
      strcpy(annotated[i], minefield[i]);
   }

   for (size_t i = 0; i < rows; i++) {
      for (size_t k = 0; k < cols; k++) {
         if (minefield[i][k] == '*')
            increment_neighbors(annotated, rows, cols, i, k);
      }
   }

   return annotated;
}

Version data entries

49 entries across 49 versions & 1 rubygems

Version Path
trackler-2.2.1.161 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.160 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.159 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.158 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.157 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.156 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.155 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.154 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.153 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.152 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.151 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.150 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.149 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.148 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.147 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.146 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.145 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.144 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.143 tracks/c/exercises/minesweeper/src/example.c
trackler-2.2.1.142 tracks/c/exercises/minesweeper/src/example.c