Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/epoll.h>
- #include <termios.h>
- #include <unistd.h>
- #define ScrH 20 // screen hight
- #define ScrW 20 // screen width
- #define Walls "\xE2\x96\xAB " //"\xE2\x96\xA1 "
- //#define Wall "\xE2\x96\xA1 " //"\xE2\x96\xAB "
- int epollfd;
- int arr[ScrW + 10][ScrH + 10];
- struct kord {
- int x, y;
- };
- struct kord4 {
- struct kord k1, k2, k3, k4;
- };
- void PrintField() {
- system("clear");
- for (int i = 0; i <= ScrH; i++) {
- write(1, Walls, 3);
- for (int j = 0; j <= ScrW; j++) {
- if (arr[j][i] > 0) {
- write(1, "*", 1);
- } else {
- write(1, " ", 1);
- }
- }
- write(1, Walls, 3);
- write(1, "\n", 1);
- }
- for (int j = 0; j <= ScrW + 2; j++) {
- write(1, Walls, 3);
- }
- }
- int contact(struct kord4 k) {
- if (arr[k.k1.x][k.k1.y + 1] != 0) {
- return 1;
- } else if (arr[k.k2.x][k.k2.y + 1] != 0) {
- return 1;
- } else if (arr[k.k3.x][k.k3.y + 1] != 0) {
- return 1;
- } else if (arr[k.k4.x][k.k4.y + 1] != 0) {
- return 1;
- } else
- return 0;
- }
- void ClearK(struct kord4 k) {
- arr[k.k1.x][k.k1.y] = 0;
- arr[k.k2.x][k.k2.y] = 0;
- arr[k.k3.x][k.k3.y] = 0;
- arr[k.k4.x][k.k4.y] = 0;
- }
- void AddArr(struct kord4 k) { // later there should be colors added
- arr[k.k1.x][k.k1.y] = 1;
- arr[k.k2.x][k.k2.y] = 1;
- arr[k.k3.x][k.k3.y] = 1;
- arr[k.k4.x][k.k4.y] = 1;
- }
- int KeyMovement(struct kord4 *k, char c) {
- if (c == 's') { // move down
- if (contact(*k) == 0) {
- k->k1.y++;
- k->k2.y++;
- k->k3.y++;
- k->k4.y++;
- } else
- return 1;
- // if cant move down
- } else if (c == 'a') { // move left
- if ((k->k1.x != 0) && (k->k2.x != 0) && (k->k3.x != 0) &&
- (k->k4.x != 0) && (arr[k->k1.x - 1][k->k1.y] == 0) &&
- (arr[k->k2.x - 1][k->k2.y] == 0) &&
- (arr[k->k3.x - 1][k->k3.y] == 0) &&
- (arr[k->k4.x - 1][k->k4.y] == 0)) {
- k->k1.x--;
- k->k2.x--;
- k->k3.x--;
- k->k4.x--;
- }
- } else if (c == 'd') { // move right
- if ((k->k1.x != ScrW) && (k->k2.x != ScrW) && (k->k3.x != ScrW) &&
- (k->k4.x != ScrW) && (arr[k->k1.x + 1][k->k1.y] == 0) &&
- (arr[k->k2.x + 1][k->k2.y] == 0) &&
- (arr[k->k3.x + 1][k->k3.y] == 0) &&
- (arr[k->k4.x + 1][k->k4.y] == 0)) {
- k->k1.x++;
- k->k2.x++;
- k->k3.x++;
- k->k4.x++;
- }
- } /*else if (c == 'q') { // rotate left
- } else if (c == 'e') { // rotate right
- } */
- return 0;
- }
- void Step(struct kord4 k) {
- struct epoll_event events[3];
- // printf("Step");
- for (;;) {
- int qofc = epoll_wait(epollfd, events, 3, 300);
- ClearK(k);
- for (int n = 0; n <= qofc; n++) {
- if (events[n].data.fd == 0) {
- char c[16];
- int n = read(0, c, sizeof c);
- // if (n > 0) { KeyMovement(&k, c[n - 1]); }
- for (int i = 0; i < n; i++) {
- KeyMovement(&k, c[i]);
- }
- }
- }
- // if (KeyMovement(k, c) == 0)
- // break;
- if (contact(k) == 0) {
- k.k1.y++;
- k.k2.y++;
- k.k3.y++;
- k.k4.y++;
- AddArr(k);
- } else {
- AddArr(k);
- break;
- }
- PrintField();
- }
- }
- void AddToField(int r) {
- // system("clear");
- // printf("%d",ScrH);
- // char c;
- // read(0,&c,1);
- struct kord4 k;
- if (r == 0) { // sqr
- k.k1.y = 0;
- k.k2.y = 0;
- k.k3.y = 1;
- k.k4.y = 1;
- k.k1.x = ScrW / 2;
- k.k2.x = (ScrW / 2) + 1;
- k.k3.x = ScrW / 2;
- k.k4.x = (ScrW / 2) + 1;
- } else if (r == 1) { // t
- k.k1.y = 1;
- k.k2.y = 1;
- k.k3.y = 0;
- k.k4.y = 1;
- k.k1.x = ScrW / 2;
- k.k2.x = ScrW / 2 - 1;
- k.k3.x = ScrW / 2;
- k.k4.x = ScrW / 2 + 1;
- } else if (r == 2) { // l
- k.k1.y = 0;
- k.k2.y = 1;
- k.k3.y = 2;
- k.k4.y = 3;
- k.k1.x = ScrW / 2;
- k.k2.x = ScrW / 2;
- k.k3.x = ScrW / 2;
- k.k4.x = ScrW / 2;
- } else if (r == 3) { // z
- k.k1.y = 0;
- k.k2.y = 0;
- k.k3.y = 1;
- k.k4.y = 1;
- k.k1.x = (ScrW / 2) - 1;
- k.k2.x = ScrW / 2;
- k.k3.x = ScrW / 2;
- k.k4.x = (ScrW / 2) + 1;
- } else if (r == 4) { // s
- k.k1.y = 1;
- k.k2.y = 1;
- k.k3.y = 0;
- k.k4.y = 0;
- k.k1.x = (ScrW / 2) - 1;
- k.k2.x = ScrW / 2;
- k.k3.x = ScrW / 2;
- k.k4.x = (ScrW / 2) + 1;
- } else if (r == 5) { // g
- k.k1.y = 0;
- k.k2.y = 0;
- k.k3.y = 1;
- k.k4.y = 2;
- k.k1.x = (ScrW / 2) + 1;
- k.k2.x = ScrW / 2;
- k.k3.x = ScrW / 2;
- k.k4.x = ScrW / 2;
- } else if (r == 6) { // l
- k.k1.y = 0;
- k.k2.y = 1;
- k.k3.y = 2;
- k.k4.y = 2;
- k.k1.x = ScrW / 2;
- k.k2.x = ScrW / 2;
- k.k3.x = ScrW / 2;
- k.k4.x = (ScrW / 2) + 1;
- }
- Step(k);
- }
- int main(int argc, char const *argv[]) {
- struct epoll_event ev;
- int fl = fcntl(0, F_GETFL);
- fl |= O_NONBLOCK;
- fcntl(0, F_SETFL, fl);
- epollfd = epoll_create1(0);
- // int sockfd;
- if (epollfd == -1)
- return 1;
- ev.events = EPOLLIN;
- ev.data.fd = STDIN_FILENO;
- epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev);
- // ev.events = EPOLLOU;
- // ev.data.fd = STDOUT_FILENO;
- // epoll_ctl(epollfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev);
- struct termios old_tio, new_tio;
- tcgetattr(STDIN_FILENO, &old_tio);
- new_tio = old_tio;
- new_tio.c_lflag &= ~(ICANON | ECHO);
- tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);
- for (int i = 0; i <= ScrW; i++) {
- arr[i][ScrH + 1] = 1;
- }
- for (;;) {
- int r = random() % 7;
- AddToField(r);
- /*
- 0 - Square
- 1 - T
- 2 - Line
- 3 - Z
- 4 - S
- 5 - G
- 6 - L
- */
- }
- /*
- char c;
- for (int i = 0;; i++) {
- read(0, &c, 1);
- write(1, &c, 1);
- }
- */
- tcsetattr(STDIN_FILENO, TCSANOW, &old_tio);
- }
Add Comment
Please, Sign In to add comment