/
Xakka
/
CPP3
Обзор
Документация
Войти
/
Xakka
/
CPP3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/gui/cli/view.c
104 строки
3 KB
moshedur
master: release 1.0
05 янв 2025, 00:12
05 янв 2025, 00:12
35ee4f6
Код
Авторство
О чём код?
#include "view.h" int main() { int status = EXIT_SUCCESS; if (initscr()) { if (LINES >= F_ROWS * ROWS_SCALE + BORDER * 2 && COLS >= F_COLS * COLS_SCALE + BORDER * 2 + ADD_ROWS + BORDER * 2) { noecho(); raw(); curs_set(0); timeout(50); keypad(stdscr, TRUE); WINDOW *main = subwin(stdscr, F_ROWS * ROWS_SCALE + BORDER * 2, F_COLS * COLS_SCALE + BORDER * 2, 0, 0); box(main, 0, 0); WINDOW *additional = subwin(stdscr, F_ROWS * ROWS_SCALE + BORDER * 2, ADD_ROWS + BORDER * 2, 0, F_COLS * COLS_SCALE + BORDER * 2); box(additional, 0, 0); while (drawing(updateCurrentState()) == EXIT_SUCCESS) { UserAction_t tmp_act; if (get_action(getch(), &tmp_act) == EXIT_SUCCESS) { userInput(tmp_act, false); } } } else { fprintf(stderr, "Screen size is not enough\n"); status = EXIT_FAILURE; } endwin(); } else { status = EXIT_FAILURE; } return status; } bool drawing(GameInfo_t info) { bool status = EXIT_SUCCESS; if (info.field != NULL) { draw_field(info.field); draw_additional(info); } else { status = EXIT_FAILURE; } return status; } void draw_field(int **field) { for (int i = 0; i < F_ROWS; i++) { for (int j = 0; j < F_COLS; j++) { for (int k = 0; k < ROWS_SCALE; k++) { mvprintw(BORDER + i * ROWS_SCALE + k, BORDER + j * COLS_SCALE, "%.*s", COLS_SCALE, field[i][j] ? "#####" : " "); } } } } void draw_additional(GameInfo_t info) { int y = 1; mvprintw(y, F_COLS * COLS_SCALE + BORDER * 3, "%-10s %5d", "SCORE", info.score); mvprintw(y += 2, F_COLS * COLS_SCALE + BORDER * 3, "%-10s %5d", "HIGH SCORE", info.high_score); mvprintw(y += 2, F_COLS * COLS_SCALE + BORDER * 3, "%-10s %5d", "LEVEL", info.level); mvprintw(y += 2, F_COLS * COLS_SCALE + BORDER * 3, "%-10s %5d", "SPEED", info.speed); if (info.next != NULL) { mvprintw(y += 2, F_COLS * COLS_SCALE + BORDER * 3, "%-10s", "NEXT"); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { mvprintw(y + i, F_COLS * COLS_SCALE + BORDER * 3 + j + 12, "%.*s", 1, info.next[i][j] ? "#" : " "); } } } mvprintw(y += 2, F_COLS * COLS_SCALE + BORDER * 3, info.pause ? "PAUSE" : " "); } bool get_action(int signal, UserAction_t *action) { bool status = EXIT_SUCCESS; if (signal == 's' || signal == 'S') { *action = Start; } else if (signal == 'p' || signal == 'P') { *action = Pause; } else if (signal == 'q' || signal == 'Q') { *action = Terminate; } else if (signal == KEY_LEFT) { *action = Left; } else if (signal == KEY_RIGHT) { *action = Right; } else if (signal == KEY_UP) { *action = Up; } else if (signal == KEY_DOWN) { *action = Down; } else if (signal == ' ') { *action = Action; } else { status = EXIT_FAILURE; } return status; }