Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <thread>
- #include <cstdlib>
- #include <chrono>
- #include <ncurses.h>
- using namespace std::chrono_literals;
- const int fieldW = 8;
- const int fieldH = 12;
- const int pieceSize = 4;
- const int pieceCnt = 7;
- const char empty = ' ';
- const char pieces[pieceCnt][pieceSize * pieceSize + 1] = {
- " "
- "AAAA"
- " "
- " ",
- " "
- "B "
- "BBB "
- " ",
- " "
- " C "
- "CCC "
- " ",
- " "
- " DD "
- " DD "
- " ",
- " "
- " EE "
- "EE "
- " ",
- " "
- " F "
- "FFF "
- " ",
- " "
- "GG "
- " GG "
- " "
- };
- char field[fieldH + 3][fieldW + 4] = {};
- void initializeField()
- {
- for (int i = 0; i < fieldH + 2; ++i)
- for (int j = 0; j < fieldW + 3; ++j)
- field[i][j] = empty;
- }
- inline char &fieldReal(int y, int x)
- {
- return field[y + 3][x + 2];
- }
- void printField(WINDOW *w)
- {
- char t;
- for (int i = 0; i < fieldH; ++i) {
- wmove(w, 2 * i + 1, 1);
- for (int j = 0; j < fieldW; ++j) {
- t = fieldReal(i, j);
- wprintw(w, "%c%c", t, t);
- }
- }
- for (int i = 0; i < fieldH; ++i) {
- wmove(w, 2 * i + 2, 1);
- for (int j = 0; j < fieldW; ++j) {
- t = fieldReal(i, j);
- wprintw(w, "%c%c", t, t);
- }
- }
- }
- void printFieldLn(WINDOW *w, int y)
- {
- wmove(w, 2 * y + 1, 1);
- char t;
- for (int i = 0; i < fieldW; ++i) {
- t = fieldReal(y, i);
- wprintw(w, "%c%c", t, t);
- }
- wmove(w, 2 * y + 2, 1);
- for (int i = 0; i < fieldW; ++i) {
- t = fieldReal(y, i);
- wprintw(w, "%c%c", t, t);
- }
- }
- void fieldMv(int y1, int x1, int y2, int x2)
- {
- if (x1 == x2 && y1 == y2)
- return;
- fieldReal(y2, x2) = fieldReal(y1, x1);
- fieldReal(y1, x1) = empty;
- }
- int main()
- {
- initscr();
- cbreak();
- keypad(stdscr, true);
- noecho();
- refresh();
- timeout(0);
- curs_set(0);
- WINDOW *fieldwin = newwin(2 * fieldH + 2, 2 * fieldW + 2, 1, 1);
- box(fieldwin, 0, 0);
- wrefresh(fieldwin);
- initializeField();
- char c;
- int y = 3, x = 5, ly = y, lx = x;
- fieldReal(y, x) = 'X';
- while (1) {
- c = getch();
- if (c == 'q')
- break;
- switch (c) {
- case 'a':
- if (x > 0)
- --x;
- break;
- case 'd':
- if (x < fieldW - 1)
- ++x;
- break;
- case 'w':
- if (y > 0)
- --y;
- break;
- case 's':
- if (y < fieldH - 1)
- ++y;
- }
- fieldMv(ly, lx, y, x);
- printField(fieldwin);
- //printFieldLn(fieldwin, y);
- //if (y != ly)
- // printFieldLn(fieldwin, ly);
- wrefresh(fieldwin);
- lx = x, ly = y;
- std::this_thread::sleep_for(50ms);
- }
- endwin();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement