Guest User

Untitled

a guest
Jun 21st, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.34 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/epoll.h>
  5. #include <termios.h>
  6. #include <unistd.h>
  7.  
  8. #define ScrH 20 // screen hight
  9. #define ScrW 20 // screen width
  10. #define Walls "\xE2\x96\xAB " //"\xE2\x96\xA1 "
  11. //#define Wall "\xE2\x96\xA1 " //"\xE2\x96\xAB "
  12.  
  13. int epollfd;
  14.  
  15. int arr[ScrW + 10][ScrH + 10];
  16.  
  17. struct kord {
  18. int x, y;
  19. };
  20.  
  21. struct kord4 {
  22. struct kord k1, k2, k3, k4;
  23. };
  24.  
  25. void PrintField() {
  26. system("clear");
  27. for (int i = 0; i <= ScrH; i++) {
  28. write(1, Walls, 3);
  29. for (int j = 0; j <= ScrW; j++) {
  30. if (arr[j][i] > 0) {
  31. write(1, "*", 1);
  32. } else {
  33. write(1, " ", 1);
  34. }
  35. }
  36. write(1, Walls, 3);
  37. write(1, "\n", 1);
  38. }
  39. for (int j = 0; j <= ScrW + 2; j++) {
  40. write(1, Walls, 3);
  41. }
  42. }
  43.  
  44. int contact(struct kord4 k) {
  45. if (arr[k.k1.x][k.k1.y + 1] != 0) {
  46. return 1;
  47. } else if (arr[k.k2.x][k.k2.y + 1] != 0) {
  48. return 1;
  49. } else if (arr[k.k3.x][k.k3.y + 1] != 0) {
  50. return 1;
  51. } else if (arr[k.k4.x][k.k4.y + 1] != 0) {
  52. return 1;
  53. } else
  54. return 0;
  55. }
  56.  
  57. void ClearK(struct kord4 k) {
  58. arr[k.k1.x][k.k1.y] = 0;
  59. arr[k.k2.x][k.k2.y] = 0;
  60. arr[k.k3.x][k.k3.y] = 0;
  61. arr[k.k4.x][k.k4.y] = 0;
  62. }
  63.  
  64. void AddArr(struct kord4 k) { // later there should be colors added
  65. arr[k.k1.x][k.k1.y] = 1;
  66. arr[k.k2.x][k.k2.y] = 1;
  67. arr[k.k3.x][k.k3.y] = 1;
  68. arr[k.k4.x][k.k4.y] = 1;
  69. }
  70.  
  71. int KeyMovement(struct kord4 *k, char c) {
  72. if (c == 's') { // move down
  73. if (contact(*k) == 0) {
  74. k->k1.y++;
  75. k->k2.y++;
  76. k->k3.y++;
  77. k->k4.y++;
  78. } else
  79. return 1;
  80. // if cant move down
  81. } else if (c == 'a') { // move left
  82. if ((k->k1.x != 0) && (k->k2.x != 0) && (k->k3.x != 0) &&
  83. (k->k4.x != 0) && (arr[k->k1.x - 1][k->k1.y] == 0) &&
  84. (arr[k->k2.x - 1][k->k2.y] == 0) &&
  85. (arr[k->k3.x - 1][k->k3.y] == 0) &&
  86. (arr[k->k4.x - 1][k->k4.y] == 0)) {
  87. k->k1.x--;
  88. k->k2.x--;
  89. k->k3.x--;
  90. k->k4.x--;
  91. }
  92. } else if (c == 'd') { // move right
  93. if ((k->k1.x != ScrW) && (k->k2.x != ScrW) && (k->k3.x != ScrW) &&
  94. (k->k4.x != ScrW) && (arr[k->k1.x + 1][k->k1.y] == 0) &&
  95. (arr[k->k2.x + 1][k->k2.y] == 0) &&
  96. (arr[k->k3.x + 1][k->k3.y] == 0) &&
  97. (arr[k->k4.x + 1][k->k4.y] == 0)) {
  98. k->k1.x++;
  99. k->k2.x++;
  100. k->k3.x++;
  101. k->k4.x++;
  102. }
  103. } /*else if (c == 'q') { // rotate left
  104.  
  105. } else if (c == 'e') { // rotate right
  106. } */
  107. return 0;
  108. }
  109.  
  110. void Step(struct kord4 k) {
  111. struct epoll_event events[3];
  112. // printf("Step");
  113. for (;;) {
  114. int qofc = epoll_wait(epollfd, events, 3, 300);
  115. ClearK(k);
  116. for (int n = 0; n <= qofc; n++) {
  117. if (events[n].data.fd == 0) {
  118. char c[16];
  119. int n = read(0, c, sizeof c);
  120. // if (n > 0) { KeyMovement(&k, c[n - 1]); }
  121. for (int i = 0; i < n; i++) {
  122. KeyMovement(&k, c[i]);
  123. }
  124. }
  125. }
  126. // if (KeyMovement(k, c) == 0)
  127. // break;
  128. if (contact(k) == 0) {
  129. k.k1.y++;
  130. k.k2.y++;
  131. k.k3.y++;
  132. k.k4.y++;
  133. AddArr(k);
  134. } else {
  135. AddArr(k);
  136. break;
  137. }
  138.  
  139. PrintField();
  140. }
  141. }
  142.  
  143. void AddToField(int r) {
  144. // system("clear");
  145. // printf("%d",ScrH);
  146. // char c;
  147. // read(0,&c,1);
  148.  
  149. struct kord4 k;
  150. if (r == 0) { // sqr
  151. k.k1.y = 0;
  152. k.k2.y = 0;
  153. k.k3.y = 1;
  154. k.k4.y = 1;
  155.  
  156. k.k1.x = ScrW / 2;
  157. k.k2.x = (ScrW / 2) + 1;
  158. k.k3.x = ScrW / 2;
  159. k.k4.x = (ScrW / 2) + 1;
  160.  
  161. } else if (r == 1) { // t
  162.  
  163. k.k1.y = 1;
  164. k.k2.y = 1;
  165. k.k3.y = 0;
  166. k.k4.y = 1;
  167.  
  168. k.k1.x = ScrW / 2;
  169. k.k2.x = ScrW / 2 - 1;
  170. k.k3.x = ScrW / 2;
  171. k.k4.x = ScrW / 2 + 1;
  172.  
  173. } else if (r == 2) { // l
  174. k.k1.y = 0;
  175. k.k2.y = 1;
  176. k.k3.y = 2;
  177. k.k4.y = 3;
  178.  
  179. k.k1.x = ScrW / 2;
  180. k.k2.x = ScrW / 2;
  181. k.k3.x = ScrW / 2;
  182. k.k4.x = ScrW / 2;
  183.  
  184. } else if (r == 3) { // z
  185. k.k1.y = 0;
  186. k.k2.y = 0;
  187. k.k3.y = 1;
  188. k.k4.y = 1;
  189.  
  190. k.k1.x = (ScrW / 2) - 1;
  191. k.k2.x = ScrW / 2;
  192. k.k3.x = ScrW / 2;
  193. k.k4.x = (ScrW / 2) + 1;
  194. } else if (r == 4) { // s
  195. k.k1.y = 1;
  196. k.k2.y = 1;
  197. k.k3.y = 0;
  198. k.k4.y = 0;
  199.  
  200. k.k1.x = (ScrW / 2) - 1;
  201. k.k2.x = ScrW / 2;
  202. k.k3.x = ScrW / 2;
  203. k.k4.x = (ScrW / 2) + 1;
  204. } else if (r == 5) { // g
  205. k.k1.y = 0;
  206. k.k2.y = 0;
  207. k.k3.y = 1;
  208. k.k4.y = 2;
  209.  
  210. k.k1.x = (ScrW / 2) + 1;
  211. k.k2.x = ScrW / 2;
  212. k.k3.x = ScrW / 2;
  213. k.k4.x = ScrW / 2;
  214.  
  215. } else if (r == 6) { // l
  216. k.k1.y = 0;
  217. k.k2.y = 1;
  218. k.k3.y = 2;
  219. k.k4.y = 2;
  220.  
  221. k.k1.x = ScrW / 2;
  222. k.k2.x = ScrW / 2;
  223. k.k3.x = ScrW / 2;
  224. k.k4.x = (ScrW / 2) + 1;
  225. }
  226.  
  227. Step(k);
  228. }
  229.  
  230. int main(int argc, char const *argv[]) {
  231. struct epoll_event ev;
  232.  
  233. int fl = fcntl(0, F_GETFL);
  234. fl |= O_NONBLOCK;
  235. fcntl(0, F_SETFL, fl);
  236.  
  237. epollfd = epoll_create1(0);
  238. // int sockfd;
  239. if (epollfd == -1)
  240. return 1;
  241.  
  242. ev.events = EPOLLIN;
  243. ev.data.fd = STDIN_FILENO;
  244.  
  245. epoll_ctl(epollfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev);
  246.  
  247. // ev.events = EPOLLOU;
  248. // ev.data.fd = STDOUT_FILENO;
  249. // epoll_ctl(epollfd, EPOLL_CTL_ADD, STDOUT_FILENO, &ev);
  250.  
  251. struct termios old_tio, new_tio;
  252. tcgetattr(STDIN_FILENO, &old_tio);
  253. new_tio = old_tio;
  254. new_tio.c_lflag &= ~(ICANON | ECHO);
  255. tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);
  256.  
  257. for (int i = 0; i <= ScrW; i++) {
  258. arr[i][ScrH + 1] = 1;
  259. }
  260.  
  261. for (;;) {
  262. int r = random() % 7;
  263.  
  264. AddToField(r);
  265. /*
  266. 0 - Square
  267. 1 - T
  268. 2 - Line
  269. 3 - Z
  270. 4 - S
  271. 5 - G
  272. 6 - L
  273. */
  274. }
  275.  
  276. /*
  277. char c;
  278. for (int i = 0;; i++) {
  279. read(0, &c, 1);
  280. write(1, &c, 1);
  281. }
  282. */
  283. tcsetattr(STDIN_FILENO, TCSANOW, &old_tio);
  284. }
Add Comment
Please, Sign In to add comment