minecore.c
#include <stdlib.h>
#include "minecore.h"
int randIInt(int min, int max) {
static int sr = 0;
if ( ! sr )
srandomdev();
sr = 1;
return (int) ( (double) ( (double) random() / (double) RAND_MAX ) * max + min );
}
// mine constants:
// 1: mine, covered, unflagged
// 2: mine, covered, flagged
// 3: free, covered, unflagged
// 4: free, uncovered, n/a
// 5: free, covered, flagged
// 6:
mineField *makeMineField(int rows, int cols) {
mineField *ret = malloc(sizeof(mineField));
(*ret).field = (int *) malloc(sizeof(int) * rows * cols);
(*ret).height = rows;
(*ret).width = cols;
return ret;
}
void resizeMineField(mineField *mineData, int newRows, int newCols) {
realloc( (*mineData).field, sizeof(int) * newRows * newCols);
if ( (*mineData).field == NULL )
exit(0);
(*mineData).height = newRows;
(*mineData).width = newCols;
}
void destroyMineField(mineField *mineData) {
free( (*mineData).field );
}
int isOutOfBounds(mineField *mineData, gridLocation location) {
return ( location.row < 0
|| location.col < 0
|| location.row >= (*mineData).height
|| location.col >= (*mineData).width );
}
int codeAtLocation(mineField *mineData, gridLocation location) {
if ( isOutOfBounds(mineData, location) ) {
free( (*mineData).field );
exit(0);
}
return *( (*mineData).field + ( location.row * (*mineData).width ) + location.col );
}
int *referenceAtLocation(mineField *mineData, gridLocation location) {
return (*mineData).field + ( location.row * (*mineData).width ) + location.col;
}
... omitted
void initialize(mineField *mineData, int mines) {
int i, j;
for ( i = 0; i < (*mineData).width; i++ ) {
for ( j = 0; j < (*mineData).height; j++ ) {
gridLocation loc;
loc.row = i;
loc.col = j;
int * rol = referenceAtLocation( mineData, loc );
*rol = 3;
}
}
for ( i = 0; i < mines; i++ ) {
gridLocation tempLoc;
tempLoc.row = randIInt(0, (*mineData).width);
tempLoc.col = randIInt(0, (*mineData).height);
while ( isHazardous( mineData, tempLoc) ) {
tempLoc.row = randIInt(0, (*mineData).width);
tempLoc.col = randIInt(0, (*mineData).height);
}
int * rol = referenceAtLocation( mineData, tempLoc );
*rol = 1;
}
}
... omitted