s21_tetris/code-samples/frogger/src/frontend.c
2024-04-17 17:02:16 +00:00

147 lines
3.7 KiB
C

#include "frog_frontend.h"
void print_overlay(void)
{
print_rectangle(0, BOARD_N + 1, 0, BOARD_M + 1);
print_rectangle(0, BOARD_N + 1, BOARD_M + 2, BOARD_M + HUD_WIDTH + 3);
print_rectangle(1, 3, BOARD_M + 3, BOARD_M + HUD_WIDTH + 2);
print_rectangle(4, 6, BOARD_M + 3, BOARD_M + HUD_WIDTH + 2);
print_rectangle(7, 9, BOARD_M + 3, BOARD_M + HUD_WIDTH + 2);
print_rectangle(10, 12, BOARD_M + 3, BOARD_M + HUD_WIDTH + 2);
MVPRINTW(2, BOARD_M + 5, "LEVEL");
MVPRINTW(5, BOARD_M + 5, "SCORE");
MVPRINTW(8, BOARD_M + 5, "SPEED");
MVPRINTW(11, BOARD_M + 5, "LIVES");
MVPRINTW(BOARD_N / 2, (BOARD_M - INTRO_MESSAGE_LEN) / 2 + 1, INTRO_MESSAGE);
}
void print_levelerror(void)
{
clear();
MVPRINTW(0, 0, "An error occured openning level file!");
MVPRINTW(2, 0, "Please check ./tests/ directory.");
MVPRINTW(3, 0, "There should be 5 level files named level_(1-5).txt.");
MVPRINTW(4, 0, "Also try to open the game nearby ./tests/ directory.");
MVPRINTW(6, 0, "Press any key to exit.");
}
void print_rectangle(int top_y, int bottom_y, int left_x, int right_x)
{
MVADDCH(top_y, left_x, ACS_ULCORNER);
int i = left_x + 1;
for (;i < right_x; i++)
MVADDCH(top_y, i, ACS_HLINE);
MVADDCH(top_y, i, ACS_URCORNER);
for (int i = top_y + 1; i < bottom_y; i++)
{
MVADDCH(i, left_x, ACS_VLINE);
MVADDCH(i, right_x, ACS_VLINE);
}
MVADDCH(bottom_y, left_x, ACS_LLCORNER);
i = left_x + 1;
for (;i < right_x; i++)
MVADDCH(bottom_y, i, ACS_HLINE);
MVADDCH(bottom_y, i, ACS_LRCORNER);
}
void print_stats(game_stats_t *stats)
{
MVPRINTW(2, BOARD_M + 12, "%d", stats->level);
MVPRINTW(5, BOARD_M + 12, "%d", stats->score);
MVPRINTW(8, BOARD_M + 12, "%d", stats->speed);
MVPRINTW(11, BOARD_M + 12, "%d", stats->lives);
}
void print_board(board_t *game, player_pos *frog)
{
print_cars(game);
PRINT_FROG(frog->x, frog->y);
}
void print_cars(board_t *game)
{
for(int i = MAP_PADDING + 1; i < BOARD_N - MAP_PADDING + 1; i++)
{
if (i % 2 == (MAP_PADDING + 1) % 2)
{
for (int j = 1; j < BOARD_M + 1; j++)
MVADDCH(i, j, ACS_BLOCK);
}
else
{
for (int j = 1; j < BOARD_M + 1; j++)
{
if (game->ways[i - MAP_PADDING - 1][j - 1] == '0')
MVADDCH(i, j, ' ');
else
MVADDCH(i, j, ']');
}
}
}
}
void print_finished(board_t *game)
{
for (int i = 0; i < BOARD_M; i++)
{
if (game->finish[i] == '0')
MVADDCH(1, i + 1, ACS_BLOCK);
else
MVADDCH(1, i + 1, ' ');
}
}
void print_banner(game_stats_t *stats)
{
banner_t banner;
memset(banner.matrix, 0, (BANNER_N + 1) * (BANNER_M + 1));
clear();
if (!(read_banner(stats, &banner)))
{
for (int i = 0; i < BANNER_N; i++)
for (int j = 0; j < BANNER_M; j++)
if (banner.matrix[i][j] == '#')
MVADDCH(i, j, ACS_BLOCK);
else
MVADDCH(i, j, ' ');
refresh();
napms(2000);
}
}
int read_banner(game_stats_t *stats, banner_t *banner)
{
int rc = SUCCESS;
FILE *file = NULL;
if (stats->lives)
file = fopen(YOU_WON, "r");
else
file = fopen(YOU_LOSE, "r");
if (file)
{
for (int i = 0; i < BANNER_N - 1 && !rc; i++)
{
if (fgets(banner->matrix[i], BANNER_M + 2, file) == NULL)
rc = ERROR;
else
banner->matrix[i][strcspn(banner->matrix[i], "\n")] = '\0';
}
fclose(file);
}
else
rc = ERROR;
return rc;
}