Skip to content

Commit

Permalink
changed display: centering minefield
Browse files Browse the repository at this point in the history
  • Loading branch information
Judro committed Nov 27, 2022
1 parent a1abf72 commit 122172c
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 18 deletions.
36 changes: 30 additions & 6 deletions src/display.c
Original file line number Diff line number Diff line change
@@ -1,19 +1,39 @@
#include "display.h"
#include <ncurses.h>
#include <stdlib.h>
#include <time.h>

void print_header(unsigned int mines_left, time_t start, time_t current) {
printw(" [%ld:%ld] Mines left: %d\n", (current - start) / 60,
(current - start) % 60, mines_left);
char *get_top_margin(unsigned int l) {
char *ret = calloc(l + 1, sizeof(char));
for (int i = 0; i < l; i++) {
ret[i] = '\n';
}
return ret;
}
char *get_left_margin(unsigned int l) {
char *ret = calloc(l + 1, sizeof(char));
for (int i = 0; i < l; i++) {
ret[i] = ' ';
}
return ret;
}

void print(GPrintable *gp) {
void print_header(GPrintableH *gph, char *lm) {
char *wm = get_left_margin(gph->width - 10);
printw(lm);
printw(" %s[%02d %02ld:%02ld]\n", wm, gph->mines, gph->time / 60,
gph->time % 60);
free(wm);
}

void print(GPrintable *gp, char *lm) {
init_pair(1, COLOR_BLUE, COLOR_BLACK);
init_pair(2, COLOR_GREEN, COLOR_BLACK);
init_pair(3, COLOR_RED, COLOR_BLACK);
init_pair(4, COLOR_MAGENTA, COLOR_BLACK);
init_pair(5, COLOR_YELLOW, COLOR_BLACK);
init_pair(6, COLOR_CYAN, COLOR_BLACK);
printw(lm);
printw(" ");
for (int i = 0; i < gp->width; i++) {
printw("_");
Expand All @@ -22,8 +42,10 @@ void print(GPrintable *gp) {
for (int i = 0; i < gp->width * gp->height; i++) {
if (i % gp->width == 0 && i > 0)
printw("|\n");
if (i % gp->width == 0)
if (i % gp->width == 0) {
printw(lm);
printw("|");
}
if (i == (gp->player.y * gp->width + gp->player.x))
attron(A_REVERSE);

Expand Down Expand Up @@ -87,7 +109,9 @@ void print(GPrintable *gp) {
if (i == (gp->player.y * gp->width + gp->player.x))
attroff(A_REVERSE);
}
printw("|\n'");
printw("|\n");
printw(lm);
printw("'");
for (int i = 0; i < gp->width; i++) {
printw("=");
}
Expand Down
6 changes: 4 additions & 2 deletions src/display.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#include <time.h>
#ifndef DISPLAY_H
#define DISPLAY_H
void print(GPrintable *);
void print_header(unsigned int, time_t start, time_t current);
char *get_top_margin(unsigned int);
char *get_left_margin(unsigned int);
void print(GPrintable *, char *);
void print_header(GPrintableH *, char *);
#endif
10 changes: 10 additions & 0 deletions src/game.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,16 @@ GPrintable *g_printable_gameover(Game *g) {
return gp;
}

GPrintableH *g_printableH(Game *g) {
GPrintableH *gp = calloc(1, sizeof(GPrintable));
time_t current;
time(&current);
gp->mines = g->flagstotal - g->flagsfound;
gp->time = current - g->started;
gp->width = g->width;
return gp;
}

void g_gprintable_kill(GPrintable *gp) {
free(gp->fields);
free(gp);
Expand Down
7 changes: 7 additions & 0 deletions src/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,15 @@ typedef struct GPrintable {
unsigned int height;
} GPrintable;

typedef struct GPrintableH {
unsigned int mines;
time_t time;
unsigned int width;
} GPrintableH;

GPrintable *g_printable(Game *);
GPrintable *g_printable_gameover(Game *);
GPrintableH *g_printableH(Game *);
void g_gprintable_kill(GPrintable *);
Game *g_new(int width, int height, int minesamount);
Cord g_player_position(Game *g);
Expand Down
2 changes: 1 addition & 1 deletion src/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ Game *select_mode() {
case 3:
return g_new(33, 15, 99);
default:
break;
break;
}
return g_new(2, 2, 2);
}
Expand Down
34 changes: 25 additions & 9 deletions src/mines.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,20 @@ int main(int argc, char *argv[]) {
if (game == NULL) {
goto end;
}

start:
while (1) {
erase();
time_t current;
time(&current);
print_header(g_flags_total(game) - g_flags_found(game), g_start(game),
current);
char *tm = get_top_margin(getmaxy(window) / 2 - ((g_height(game) + 5) / 2));
char *lm = get_left_margin(getmaxx(window) / 2 - ((g_width(game) + 2) / 2));
printw(tm);
GPrintable *gp = g_printable(game);
print(gp);
GPrintableH *gph = g_printableH(game);
print(gp, lm);
print_header(gph, lm);
free(gph);
g_gprintable_kill(gp);
int ret = cmove(game, window);
if (ret == -1) {
Expand All @@ -34,10 +39,14 @@ int main(int argc, char *argv[]) {
} else if (ret == -3) {
if (g_unveil(game) == -1) {
erase();
printw(tm);
printw(lm);
printw(" Game over \n");
GPrintable *gp = g_printable_gameover(game);
print(gp);
printw("\n Press <q> to get back to the menu\n");
print(gp, lm);
printw("\n");
printw(lm);
printw(" Press <q>\n");
g_gprintable_kill(gp);
while (1) {
ret = cmove(game, window);
Expand All @@ -49,11 +58,16 @@ int main(int argc, char *argv[]) {
}
if (checkflags(game)) {
erase();
printw(" You found all %d mines in [%ld:%ld]:\n", g_flags_total(game),
(current - g_start(game)) / 60, (current - g_start(game)) % 60);
printw(tm);
printw(lm);
printw(" Congratulations!\n");
GPrintable *gp = g_printable_gameover(game);
print(gp);
printw("\n Press <q> to get back to the menu\n");
print(gp, lm);
printw(lm);
char *hm = get_left_margin(g_width(game) - 16);
printw(" Press <q>%s[%02ld:%02ld]\n", hm, (current - g_start(game)) / 60,
(current - g_start(game)) % 60);
free(hm);
g_gprintable_kill(gp);
while (1) {
ret = cmove(game, window);
Expand All @@ -62,6 +76,8 @@ int main(int argc, char *argv[]) {
}
break;
}
free(lm);
free(tm);
// sleeps 0.01 seconds
usleep(10000);
}
Expand Down

0 comments on commit 122172c

Please sign in to comment.