Compare commits
No commits in common. "4ed5fb7b942a003af3fed1d9e3f758724fda7719" and "63328b0b419bc459ee7531325db6f5e2d746d298" have entirely different histories.
4ed5fb7b94
...
63328b0b41
|
@ -1,2 +1,3 @@
|
|||
.wakatime-project
|
||||
mineur
|
||||
minesweeper-screenshot.png
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
# MINEUR
|
||||
|
||||

|
||||
|
||||
Minesweeper game.
|
||||
|
||||
Oh no, my os doesn't comme with minesweeper preinstalled, let's make it myself.
|
||||
|
@ -26,12 +24,7 @@ Oh no, my os doesn't comme with minesweeper preinstalled, let's make it myself.
|
|||
|
||||
all of these action can be done with the menu bar
|
||||
|
||||
# Configuration
|
||||
|
||||
You can change the path to the ressource directory, record file and screenshot file name
|
||||
by changing the corresponding macro at the top of [main.c](main.c)
|
||||
|
||||
# Building
|
||||
# building
|
||||
|
||||
You need to install [raylib v5](https://github.com/raysan5/raylib/releases/tag/5.0), but any version should work.
|
||||
|
||||
|
|
135
main.c
135
main.c
|
@ -1,20 +1,11 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "raylib.h"
|
||||
|
||||
// don't forget the / at the end of dir
|
||||
#ifdef RELEASE
|
||||
#define RESSOURCES_DIR "/home/cptbb/opt/dev/built/data/mineur/"
|
||||
#else
|
||||
#define RESSOURCES_DIR "/home/cptbb/dev/mineur/ressources/"
|
||||
#endif
|
||||
#define RECORD_FILE "/home/cptbb/.local/share/mineur_record"
|
||||
#define SCREEN_SHOT_NAME "minesweeper-screenshot.png"
|
||||
|
||||
#define ARRAT(arr, type, x, y) ((arr) + (y)*(type) + (x))
|
||||
|
||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
@ -68,10 +59,6 @@ const Color text_color = BLACK;
|
|||
const Color hover_color = RED;
|
||||
|
||||
float timer = 0.0f;
|
||||
char timer_text[10] = {0};
|
||||
char timer_record[GAME_TYPE_NB][10] = {"9999", "9999", "9999"};
|
||||
FILE *record_file_read;
|
||||
FILE *record_file_write;
|
||||
int need_to_fill = 1;
|
||||
|
||||
#define INIT_TEXTURE(img, tex) \
|
||||
|
@ -191,11 +178,12 @@ void fill_game(int click_x, int click_y)
|
|||
int x = rand() % game_size.x;
|
||||
int y = rand() % game_size.y;
|
||||
|
||||
if ((click_x == x && click_y == y) || game[y][x] == 'X') {
|
||||
i--;
|
||||
if (click_x == x && click_y == y)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (game[y][x] == 'X')
|
||||
i--;
|
||||
else
|
||||
game[y][x] = 'X';
|
||||
}
|
||||
|
||||
|
@ -253,7 +241,6 @@ void reload_game(void)
|
|||
need_to_fill = 1;
|
||||
screen_resize_handle();
|
||||
timer = 0.0f;
|
||||
memset(timer_text, 0, sizeof(timer_text));
|
||||
}
|
||||
|
||||
void switch_mode(GameType gt)
|
||||
|
@ -277,42 +264,10 @@ void switch_mode(GameType gt)
|
|||
}
|
||||
}
|
||||
|
||||
int nb_len(char *string)
|
||||
{
|
||||
int i = 0;
|
||||
for (; string[i] >= 48 && string[i] <= 48+10; i++);
|
||||
return i+1;
|
||||
}
|
||||
|
||||
void load_record(void)
|
||||
{
|
||||
for (
|
||||
int i=0;
|
||||
i<GAME_TYPE_NB &&
|
||||
fgets(timer_record[i], sizeof(timer_record[i]), record_file_read);
|
||||
i++
|
||||
);
|
||||
}
|
||||
|
||||
void save_record(void)
|
||||
{
|
||||
record_file_write = fopen(RECORD_FILE, "w");
|
||||
|
||||
fprintf(record_file_write, "%.*s\n%.*s\n%.*s\n",
|
||||
nb_len(timer_record[BEGINNER]) - 1, timer_record[BEGINNER],
|
||||
nb_len(timer_record[INTERMEDIATE]) - 1, timer_record[INTERMEDIATE],
|
||||
nb_len(timer_record[EXPERT]) - 1, timer_record[EXPERT]);
|
||||
|
||||
fclose(record_file_write);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
srand(time(NULL));
|
||||
|
||||
record_file_read = fopen(RECORD_FILE, "r");
|
||||
load_record();
|
||||
|
||||
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
|
||||
#ifdef RELEASE
|
||||
SetTraceLogLevel(LOG_ERROR);
|
||||
|
@ -322,27 +277,27 @@ int main(void)
|
|||
SetTargetFPS(60);
|
||||
|
||||
menu = (Rectangle){0, 0, screen_width, screen_height - screen_width};
|
||||
tile_image_orig = LoadImage(RESSOURCES_DIR "tile.png");
|
||||
tile_hover_image_orig = LoadImage(RESSOURCES_DIR "tile_hover.png");
|
||||
mine_image_orig = LoadImage(RESSOURCES_DIR "mine.png");
|
||||
mine_image_orig = LoadImage(RESSOURCES_DIR "mine.png");
|
||||
t1_image_orig = LoadImage(RESSOURCES_DIR "1.png");
|
||||
t2_image_orig = LoadImage(RESSOURCES_DIR "2.png");
|
||||
t3_image_orig = LoadImage(RESSOURCES_DIR "3.png");
|
||||
t4_image_orig = LoadImage(RESSOURCES_DIR "4.png");
|
||||
t5_image_orig = LoadImage(RESSOURCES_DIR "5.png");
|
||||
t6_image_orig = LoadImage(RESSOURCES_DIR "6.png");
|
||||
t7_image_orig = LoadImage(RESSOURCES_DIR "7.png");
|
||||
t8_image_orig = LoadImage(RESSOURCES_DIR "8.png");
|
||||
tile_image_orig = LoadImage("ressources/tile.png");
|
||||
tile_hover_image_orig = LoadImage("ressources/tile_hover.png");
|
||||
mine_image_orig = LoadImage("ressources/mine.png");
|
||||
mine_image_orig = LoadImage("ressources/mine.png");
|
||||
t1_image_orig = LoadImage("ressources/1.png");
|
||||
t2_image_orig = LoadImage("ressources/2.png");
|
||||
t3_image_orig = LoadImage("ressources/3.png");
|
||||
t4_image_orig = LoadImage("ressources/4.png");
|
||||
t5_image_orig = LoadImage("ressources/5.png");
|
||||
t6_image_orig = LoadImage("ressources/6.png");
|
||||
t7_image_orig = LoadImage("ressources/7.png");
|
||||
t8_image_orig = LoadImage("ressources/8.png");
|
||||
|
||||
camera_texture = LoadTexture(RESSOURCES_DIR "camera.png");
|
||||
lose_texture = LoadTexture(RESSOURCES_DIR "lose.png");
|
||||
win_texture = LoadTexture(RESSOURCES_DIR "win.png");
|
||||
record_texture = LoadTexture(RESSOURCES_DIR "record.png");
|
||||
playing_texture = LoadTexture(RESSOURCES_DIR "playing.png");
|
||||
fixed_tile_texture = LoadTexture(RESSOURCES_DIR "fixed_tile.png");
|
||||
double_tile_texture = LoadTexture(RESSOURCES_DIR "tile_2.png");
|
||||
triple_tile_texture = LoadTexture(RESSOURCES_DIR "tile_3.png");
|
||||
camera_texture = LoadTexture("ressources/camera.png");
|
||||
lose_texture = LoadTexture("ressources/lose.png");
|
||||
win_texture = LoadTexture("ressources/win.png");
|
||||
record_texture = LoadTexture("ressources/record.png");
|
||||
playing_texture = LoadTexture("ressources/playing.png");
|
||||
fixed_tile_texture = LoadTexture("ressources/fixed_tile.png");
|
||||
double_tile_texture = LoadTexture("ressources/tile_2.png");
|
||||
triple_tile_texture = LoadTexture("ressources/tile_3.png");
|
||||
|
||||
setup_game();
|
||||
screen_resize_handle();
|
||||
|
@ -355,17 +310,11 @@ int main(void)
|
|||
screen_resize_handle();
|
||||
|
||||
if (take_screenshot) {
|
||||
TakeScreenshot(SCREEN_SHOT_NAME);
|
||||
TakeScreenshot("minesweeper-screenshot.png");
|
||||
take_screenshot = 0;
|
||||
}
|
||||
|
||||
if (game_state == PLAYING) {
|
||||
if (need_to_fill)
|
||||
timer = 0;
|
||||
else
|
||||
timer += GetFrameTime();
|
||||
snprintf(timer_text, sizeof(timer_text), "%d", (int) timer);
|
||||
}
|
||||
|
||||
ClearBackground((Color) {
|
||||
.r = 0x8E, .g = 0x8E, .b = 0x8E, .a = 255
|
||||
|
@ -461,21 +410,11 @@ int main(void)
|
|||
timer_mid - timer_pad - double_tile_texture.width, 0,
|
||||
WHITE
|
||||
);
|
||||
DrawText(
|
||||
timer_text,
|
||||
timer_mid - timer_pad - double_tile_texture.width + 13, 10,
|
||||
35.0f, text_color
|
||||
);
|
||||
DrawTexture(
|
||||
double_tile_texture,
|
||||
timer_mid + timer_pad, 0,
|
||||
WHITE
|
||||
);
|
||||
DrawText(
|
||||
timer_record[current_game_type],
|
||||
timer_mid + timer_pad + 13, 10,
|
||||
35.0f, text_color
|
||||
);
|
||||
|
||||
for (int y=0; y<game_size.y; y++) {
|
||||
for (int x=0; x<game_size.x; x++) {
|
||||
|
@ -525,18 +464,18 @@ int main(void)
|
|||
}
|
||||
}
|
||||
|
||||
int mouse_map_x = ((mouse_x - grid.x) / grid.width) * game_size.x;
|
||||
int mouse_map_y = ((mouse_y - grid.y) / grid.height) * game_size.y;
|
||||
mouse_x = ((mouse_x - grid.x) / grid.width) * game_size.x;
|
||||
mouse_y = ((mouse_y - grid.y) / grid.height) * game_size.y;
|
||||
|
||||
if (need_to_fill && mouse_pressed) {
|
||||
fill_game(mouse_map_x, mouse_map_y);
|
||||
fill_game(mouse_x, mouse_y);
|
||||
need_to_fill = 0;
|
||||
}
|
||||
|
||||
if (mouse_in_grid && game_state == PLAYING) {
|
||||
discover[mouse_map_y][mouse_map_x] = 1;
|
||||
discover[mouse_y][mouse_x] = 1;
|
||||
|
||||
zero_click(mouse_map_x, mouse_map_y);
|
||||
zero_click(mouse_x, mouse_y);
|
||||
|
||||
int count_undiscovered_cell = 0;
|
||||
for (int x=0; x<game_size.x; x++) {
|
||||
|
@ -546,18 +485,10 @@ int main(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (game_state != LOSE && count_undiscovered_cell <= nb_bomb) {
|
||||
if (timer < atoi(timer_record[current_game_type])) {
|
||||
game_state = RECORD;
|
||||
memset(timer_record[current_game_type], 1, sizeof(timer_record[0]));
|
||||
snprintf(timer_record[current_game_type], sizeof(timer_record[0]), "%d", (int) timer);
|
||||
save_record();
|
||||
} else {
|
||||
if (game_state != LOSE && count_undiscovered_cell <= nb_bomb)
|
||||
game_state = WIN;
|
||||
}
|
||||
}
|
||||
|
||||
if (game[mouse_map_y][mouse_map_x] == 'X') {
|
||||
if (game[mouse_y][mouse_x] == 'X') {
|
||||
memset(discover, 1, game_cap);
|
||||
game_state = LOSE;
|
||||
}
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 122 KiB |
Loading…
Reference in New Issue