#include "raylib.h" #include #include typedef char cell; #define MINE 0b10000000 #define MARKED 0b01000000 #define NUMBERED 0b00000111 /* 0000 0000 ^^ ^^^ || number |1 if marked 1 if mine */ typedef struct minefield_t { int row; int col; cell* cells; } Minefield; Minefield make_minefield(int row, int col, int mine_count){ Minefield mf = {.row = row, .col = col}; int size = mf.row * mf.col; mf.cells = (cell *)calloc(size, sizeof(cell)); // 0 initialization for (int i = 0; i < size; i++) { mf.cells[i] = 0; } // Place mines /* float prob = (float) mine_count / f.row * f.col; */ for (int m = mine_count; m > 0;){ for (int i = 0; i < size; i++){ if (!(mf.cells[i] & MINE) && (rand() % size) < mine_count) { mf.cells[i] = MINE; if (--m <= 0) { break; } } } } // Place numbers for (int i = 0; i < mf.row; i++){ for (int j = 0; j < mf.col; j++){ if (!(mf.cells[i * mf.col + j] & MINE)){ cell c = 0; for (int ii = i - 1; ii <= i + 1; ii++){ for (int jj = j - 1; jj <= j + 1; jj++){ if (ii < 0 || ii >= mf.row || jj < 0 || jj >= mf.col){ continue; } if (mf.cells[ii * mf.col + jj] & MINE){ c++; } } } mf.cells[i * mf.col + j] = c; } } } return mf; } void free_minefield(Minefield* mf){ if (mf){ free(mf->cells); mf->cells = NULL; } } char cell_char(cell c){ if (c & MARKED) { return 'X'; } else if (c & MINE) { return '*'; } else { c &= NUMBERED; return c > 0 ? c + '0' : ' '; } } void print_minefield(Minefield *mf, FILE *stream) { for (int i = 0; i < mf->row; i++) { for (int j = 0; j < mf->col; j++) { fputc('|', stream); cell c = mf->cells[i * mf->col + j]; fputc(cell_char(c), stream); } fputs("|\n", stream); } } const int screenWidth = 800; const int screenHeight = 450; void draw_minefield(Minefield* mf){ float width = (float) screenWidth / mf->col; float height = (float) screenHeight / mf->row; float size = width > height ? height : width; char str[2] = "0"; for (int i = 0; i < mf->row; i++){ for (int j = 0; j < mf->col; j++){ int x = size * j; int y = size * i; DrawRectangleLines(x, y, size, size, BLACK); str[0] = cell_char(mf->cells[i * mf->col + j]); DrawText(str, x + size / 3, y + size / 3, 20, BLACK); } } } int main(){ Minefield mf = make_minefield(10, 20, 30); print_minefield(&mf, stdout); InitWindow(screenWidth, screenHeight, "Minesweeper"); SetTargetFPS(60); while(!WindowShouldClose()){ BeginDrawing(); ClearBackground(RAYWHITE); draw_minefield(&mf); EndDrawing(); } free_minefield(&mf); return 0; }