jag

tetoris_c

public

Small block game in C

Star0
Watch0

Commit 6642d1d9ca12

tarball

Jaglekon <58274093+Jaglekon@users.noreply.github.com>2026-07-20 11:54 UTC

5 files changed+417-424
sorted stuff out
Modified file: Makefile+2 additions−2 deletions
@@ -1,2 +1,2 @@
1-tetoris: main.c
2- gcc -Wall -Wextra -o tetoris main.c
1+tetoris: main.c draw.c logic.c
2+ gcc -Wall -Wextra -o tetoris main.c draw.c logic.c
Added file: draw.c+104 additions
@@ -0,0 +1,104 @@
1+#include "main.h"
2+
3+
4+#define RED "\033[38;2;255;0;0m"
5+#define GREEN "\033[38;2;0;255;0m"
6+#define BLUE "\033[38;2;0;0;255m"
7+#define YELLOW "\033[38;2;255;255;0m"
8+#define MAGENTA "\033[38;2;255;0;255m"
9+#define TEAL "\033[38;2;0;255;255m"
10+#define PURPLE "\033[38;2;127;0;255m"
11+#define WHITE "\033[38;2;255;255;255m"
12+
13+
14+void draw_color (tetromino current_square) {
15+ switch (current_square) {
16+ case I_PIECE:
17+ printf("%s", RED);
18+ break;
19+ case J_PIECE:
20+ printf("%s", GREEN);
21+ break;
22+ case L_PIECE:
23+ printf("%s", BLUE);
24+ break;
25+ case O_PIECE:
26+ printf("%s", YELLOW);
27+ break;
28+ case S_PIECE:
29+ printf("%s", MAGENTA);
30+ break;
31+ case T_PIECE:
32+ printf("%s", TEAL);
33+ break;
34+ case Z_PIECE:
35+ printf("%s", PURPLE);
36+ break;
37+ }
38+}
39+
40+
41+void draw_board(piece current_piece, bool *blink, bool is_piece) {
42+
43+ uint8_t i, j;
44+
45+
46+ printf("\033[H");
47+ printf("┏");
48+ for (i = 0; i < FIELD_WIDTH; i++)
49+ printf("━━");
50+ printf("┓\n");
51+
52+
53+ for (i = 0; i < FIELD_HEIGHT; i++) {
54+
55+ printf("┃");
56+
57+ for (j = 0; j < FIELD_WIDTH; j++) {
58+
59+ if ( blink != NULL && blink[i]) {
60+
61+ printf("%s", WHITE);
62+ } else {
63+
64+
65+ tetromino current_square = current_square = playfield[i][j + BORDER_WIDTH];
66+
67+ if (is_piece) {
68+
69+ uint8_t k, l;
70+
71+ for (k = 0; k < current_piece.size; k++) {
72+ for (l = 0; l < current_piece.size; l++) {
73+
74+ coord points = find_direction(current_piece, l, k);
75+
76+ if (
77+ i == current_piece.y + points.y &&
78+ j == current_piece.x + points.x - BORDER_WIDTH &&
79+ current_piece.piece[k][l])
80+ {
81+ current_square = current_piece.name;
82+ }
83+ }
84+ }
85+ }
86+
87+ if (current_square <= EMPTY || current_square > Z_PIECE) {
88+ printf("· ");
89+ continue;
90+ }
91+
92+ draw_color(current_square);
93+ }
94+
95+ printf("██\033[0m");
96+ }
97+ printf("┃\n");
98+ }
99+
100+ printf("┗");
101+ for (i = 0; i < FIELD_WIDTH; i++)
102+ printf("━━");
103+ printf("┛\n");
104+}
Added file: logic.c+224 additions
@@ -0,0 +1,224 @@
1+#include "main.h"
2+
3+void init_field() {
4+ uint8_t i, j;
5+ for(i = 0; i < FULL_HEIGHT; i++) {
6+ for (j = 0; j < FULL_WIDTH; j++) {
7+
8+ if (
9+ j < BORDER_WIDTH ||
10+ j >= FULL_WIDTH - BORDER_WIDTH ||
11+ i >= FULL_HEIGHT - BORDER_WIDTH
12+ ) {
13+ playfield[i][j] = TETRIS;
14+ } else {
15+ playfield[i][j] = EMPTY;
16+ }
17+ }
18+ }
19+}
20+
21+
22+piece init_piece(tetromino new_piece) {
23+
24+ piece current_piece = {};
25+
26+ current_piece.name = new_piece;
27+
28+ current_piece.y = TOP_GAP;
29+ current_piece.rotation = TOP;
30+
31+
32+ switch (current_piece.name) {
33+ case I_PIECE:
34+ current_piece.size = 4;
35+ current_piece.positions = 2;
36+
37+ current_piece.piece[0][0] = false;
38+ current_piece.piece[0][1] = false;
39+ current_piece.piece[0][2] = false;
40+ current_piece.piece[0][3] = false;
41+
42+ current_piece.piece[1][0] = true;
43+ current_piece.piece[1][1] = true;
44+ current_piece.piece[1][2] = true;
45+ current_piece.piece[1][3] = true;
46+
47+ current_piece.piece[2][0] = false;
48+ current_piece.piece[2][1] = false;
49+ current_piece.piece[2][2] = false;
50+ current_piece.piece[2][3] = false;
51+
52+ current_piece.piece[3][0] = false;
53+ current_piece.piece[3][1] = false;
54+ current_piece.piece[3][2] = false;
55+ current_piece.piece[3][3] = false;
56+
57+ current_piece.y = 0;
58+
59+ break;
60+
61+ case J_PIECE:
62+ current_piece.size = 3;
63+ current_piece.positions = 4;
64+
65+ current_piece.piece[0][0] = true;
66+ current_piece.piece[0][1] = false;
67+ current_piece.piece[0][2] = false;
68+
69+ current_piece.piece[1][0] = true;
70+ current_piece.piece[1][1] = true;
71+ current_piece.piece[1][2] = true;
72+
73+ current_piece.piece[2][0] = false;
74+ current_piece.piece[2][1] = false;
75+ current_piece.piece[2][2] = false;
76+
77+ break;
78+
79+ case L_PIECE:
80+ current_piece.size = 3;
81+ current_piece.positions = 4;
82+
83+ current_piece.piece[0][0] = false;
84+ current_piece.piece[0][1] = false;
85+ current_piece.piece[0][2] = true;
86+
87+ current_piece.piece[1][0] = true;
88+ current_piece.piece[1][1] = true;
89+ current_piece.piece[1][2] = true;
90+
91+ current_piece.piece[2][0] = false;
92+ current_piece.piece[2][1] = false;
93+ current_piece.piece[2][2] = false;
94+
95+ break;
96+
97+ case O_PIECE:
98+ current_piece.size = 2;
99+ current_piece.positions = 1;
100+
101+ current_piece.piece[0][0] = true;
102+ current_piece.piece[0][1] = true;
103+
104+ current_piece.piece[1][0] = true;
105+ current_piece.piece[1][1] = true;
106+
107+ break;
108+
109+ case S_PIECE:
110+ current_piece.size = 3;
111+ current_piece.positions = 2;
112+
113+ current_piece.piece[0][0] = false;
114+ current_piece.piece[0][1] = true;
115+ current_piece.piece[0][2] = true;
116+
117+ current_piece.piece[1][0] = true;
118+ current_piece.piece[1][1] = true;
119+ current_piece.piece[1][2] = false;
120+
121+ current_piece.piece[2][0] = false;
122+ current_piece.piece[2][1] = false;
123+ current_piece.piece[2][2] = false;
124+
125+ break;
126+
127+ case T_PIECE:
128+ current_piece.size = 3;
129+ current_piece.positions = 4;
130+
131+ current_piece.piece[0][0] = false;
132+ current_piece.piece[0][1] = true;
133+ current_piece.piece[0][2] = false;
134+
135+ current_piece.piece[1][0] = true;
136+ current_piece.piece[1][1] = true;
137+ current_piece.piece[1][2] = true;
138+
139+ current_piece.piece[2][0] = false;
140+ current_piece.piece[2][1] = false;
141+ current_piece.piece[2][2] = false;
142+
143+ break;
144+ case Z_PIECE:
145+ current_piece.size = 3;
146+ current_piece.positions = 2;
147+
148+ current_piece.piece[0][0] = true;
149+ current_piece.piece[0][1] = true;
150+ current_piece.piece[0][2] = false;
151+
152+ current_piece.piece[1][0] = false;
153+ current_piece.piece[1][1] = true;
154+ current_piece.piece[1][2] = true;
155+
156+ current_piece.piece[2][0] = false;
157+ current_piece.piece[2][1] = false;
158+ current_piece.piece[2][2] = false;
159+
160+ break;
161+ default:
162+ perror("Fuck you\n");
163+ break;
164+ }
165+
166+ current_piece.x = ((FULL_WIDTH >> 1) - (current_piece.size >> 1));
167+
168+ return current_piece;
169+}
170+
171+
172+
173+coord find_direction(piece current_piece, uint8_t x, uint8_t y) {
174+
175+ coord points = {
176+ x,
177+ y
178+ };
179+
180+ switch (current_piece.rotation) {
181+ case TOP:
182+ /*
183+ x = k;
184+ y = j;
185+ */
186+ break;
187+ case RIGHT:
188+ points.x = y;
189+ points.y = current_piece.size - (x + 1);
190+ break;
191+ case BOTTOM:
192+ points.x = current_piece.size - (x + 1);
193+ points.y = current_piece.size - (y + 1);
194+ break;
195+ case LEFT:
196+ points.x = current_piece.size - (y + 1);
197+ points.y = x;
198+ break;
199+ }
200+
201+ return points;
202+}
203+
204+
205+bool valid_position(piece current_piece) {
206+
207+ uint8_t i, j;
208+
209+ for(i = 0; i < current_piece.size; i++) {
210+ for (j = 0; j < current_piece.size; j++) {
211+
212+ coord points = find_direction(current_piece, j, i);
213+
214+ if (
215+ current_piece.piece[i][j] &&
216+ playfield[current_piece.y + points.y][current_piece.x + points.x] != EMPTY
217+ ) {
218+ return false;
219+ }
220+ }
221+ }
222+
223+ return true;
224+}
Modified file: main.c+18 additions−422 deletions
@@ -1,64 +1,9 @@
1-#include <stdio.h>
2-#include <stdint.h>
3-#include <stdbool.h>
4-#include <stdlib.h>
1+#include "main.h"
52
6-#include <termios.h>
7-#include <sys/ioctl.h>
8-#include <sys/stat.h>
9-
10-#include <time.h>
11-#include <unistd.h>
12-
13-#include <errno.h>
14-
15-
16-/* TETRIS */
17-
18-#define FIELD_WIDTH 10
19-#define FIELD_HEIGHT 21
20-
21-#define BORDER_WIDTH 2
22-#define TOP_GAP 1
23-
24-#define FULL_WIDTH (FIELD_WIDTH + BORDER_WIDTH * 2)
25-#define FULL_HEIGHT (FIELD_HEIGHT + BORDER_WIDTH)
26-
27-typedef enum {
28- EMPTY, I_PIECE, J_PIECE, L_PIECE, O_PIECE, S_PIECE, T_PIECE, Z_PIECE, TETRIS
29-} tetromino;
30-
31-typedef enum {
32- TOP, RIGHT, BOTTOM, LEFT
33-} direction;
34-
35-typedef struct {
36- tetromino name;
37- bool piece[4][4];
38- int8_t x;
39- int8_t y;
40- uint8_t size;
41- direction rotation;
42- uint8_t positions;
43-} piece;
44-
45-typedef struct {
46- int8_t x;
47- int8_t y;
48-} coord;
493
504 tetromino playfield[FULL_HEIGHT][FULL_WIDTH] = {};
515
526
53-void init_field();
54-
55-void draw_board(piece current_piece, bool *blink, bool is_piece);
56-
57-piece init_piece(tetromino new_piece);
58-
59-coord find_direction(piece current_piece, uint8_t x, uint8_t y);
60-
61-
627 int main () {
638
649
@@ -86,13 +31,11 @@ int main () {
8631
8732 printf("\033[?25l\033[?1049h");
8833
34+
8935 /* Init */
9036
9137 init_field();
9238
93-
94- /* Init the first piece */
95-
9639 bool is_piece = false;
9740
9841 piece current_piece = {};
@@ -159,21 +102,10 @@ int main () {
159102
160103 bool is_valid = true;
161104
162- for (j = 0; j < current_piece.size; j++) {
163- for (k = 0; k < current_piece.size; k++) {
164-
165- coord points = find_direction(current_piece, k, j);
166-
167- if (
168- current_piece.piece[j][k] &&
169- playfield[current_piece.y + points.y][current_piece.x + points.x + move] != EMPTY
170- ) {
171- is_valid = false;
172- }
173- }
174- }
105+ piece moved_piece = current_piece;
106+ moved_piece.x += move;
175107
176- if (is_valid) {
108+ if (valid_position(moved_piece)) {
177109 current_piece.x += move;
178110 draw = true;
179111 }
@@ -188,28 +120,11 @@ int main () {
188120 piece rotated = current_piece;
189121
190122 rotated.rotation = (current_piece.rotation + 1) % (current_piece.positions);
191-
192- bool is_valid = true;
193-
194- for(j = 0; j < rotated.size; j++) {
195- for (k = 0; k < rotated.size; k++) {
196-
197- coord points = find_direction(rotated, k, j);
198-
199- if (
200- rotated.piece[j][k] &&
201- playfield[rotated.y + points.y][rotated.x + points.x] != EMPTY
202- ) {
203- is_valid = false;
204- }
205- }
206- }
207123
208- if (is_valid) {
124+ if (valid_position(rotated)) {
209125 current_piece = rotated;
210126 draw = true;
211127 }
212-
213128 }
214129
215130
@@ -224,38 +139,24 @@ int main () {
224139
225140 /* When a piece is stuck */
226141
227- for(j = 0; j < current_piece.size; j++) {
228- for (k = 0; k < current_piece.size; k++) {
229-
230- coord points = find_direction(current_piece, k, j);
142+ if (!valid_position(current_piece)) {
231143
232- uint8_t x = current_piece.x + points.x;
233- uint8_t y = current_piece.y + points.y;
234-
235- if (
236- y >= FULL_HEIGHT ||
237- (playfield[y][x] != EMPTY && current_piece.piece[j][k])
238- ) {
239-
240- uint8_t l, m;
241-
242- for (l = 0; l < current_piece.size; l++) {
243- for (m = 0; m < current_piece.size; m++) {
244-
245- if (current_piece.piece[l][m]) {
246-
247- coord solid = find_direction(current_piece, m, l);
144+ for (j = 0; j < current_piece.size; j++) {
145+ for (k = 0; k < current_piece.size; k++) {
146+
147+ if (current_piece.piece[j][k]) {
148+
149+ coord solid = find_direction(current_piece, k, j);
248150
249- playfield[current_piece.y - 1 + solid.y][current_piece.x + solid.x] = current_piece.name;
250- }
251- }
151+ playfield[current_piece.y - 1 + solid.y][current_piece.x + solid.x] = current_piece.name;
252152 }
253- is_piece = false;
254- draw = true;
255153 }
256154 }
155+ is_piece = false;
156+ draw = true;
257157 }
258158
159+
259160 /* Looks if there is a tetris */
260161
261162 bool blink[FIELD_HEIGHT] = {};
@@ -279,7 +180,7 @@ int main () {
279180
280181 if (is_tetris) {
281182 for (j = 0; j < 4; j++) {
282- draw_board(current_piece, (j % 2) ? NULL : blink, is_piece);
183+ draw_board(current_piece, (j % 2 == 0) ? NULL : blink, is_piece);
283184 usleep(200000);
284185 }
285186
@@ -325,308 +226,3 @@ end:
325226
326227 return 0;
327228 }
328-
329-
330-
331-void init_field() {
332- uint8_t i, j;
333- for(i = 0; i < FULL_HEIGHT; i++) {
334- for (j = 0; j < FULL_WIDTH; j++) {
335-
336- if (
337- j < BORDER_WIDTH ||
338- j >= FULL_WIDTH - BORDER_WIDTH ||
339- i >= FULL_HEIGHT - BORDER_WIDTH
340- ) {
341- playfield[i][j] = TETRIS;
342- } else {
343- playfield[i][j] = EMPTY;
344- }
345- }
346- }
347-}
348-
349-
350-
351-#define RED "\033[38;2;255;0;0m"
352-#define GREEN "\033[38;2;0;255;0m"
353-#define BLUE "\033[38;2;0;0;255m"
354-#define YELLOW "\033[38;2;255;255;0m"
355-#define MAGENTA "\033[38;2;255;0;255m"
356-#define TEAL "\033[38;2;0;255;255m"
357-#define PURPLE "\033[38;2;127;0;255m"
358-#define WHITE "\033[38;2;255;255;255m"
359-
360-void draw_color (tetromino current_square) {
361- switch (current_square) {
362- case I_PIECE:
363- printf("%s", RED);
364- break;
365- case J_PIECE:
366- printf("%s", GREEN);
367- break;
368- case L_PIECE:
369- printf("%s", BLUE);
370- break;
371- case O_PIECE:
372- printf("%s", YELLOW);
373- break;
374- case S_PIECE:
375- printf("%s", MAGENTA);
376- break;
377- case T_PIECE:
378- printf("%s", TEAL);
379- break;
380- case Z_PIECE:
381- printf("%s", PURPLE);
382- break;
383- }
384-}
385-
386-
387-void draw_board(piece current_piece, bool *blink, bool is_piece) {
388-
389- uint8_t i, j;
390-
391-
392- printf("\033[H");
393- printf("┏");
394- for (i = 0; i < FIELD_WIDTH; i++)
395- printf("━━");
396- printf("┓\n");
397-
398-
399- for (i = 0; i < FIELD_HEIGHT; i++) {
400-
401- printf("┃");
402-
403- for (j = 0; j < FIELD_WIDTH; j++) {
404-
405- if ( blink != NULL && blink[i]) {
406-
407- printf("%s", WHITE);
408- } else {
409-
410-
411- tetromino current_square = current_square = playfield[i][j + BORDER_WIDTH];
412-
413- if (is_piece) {
414-
415- uint8_t k, l;
416-
417- for (k = 0; k < current_piece.size; k++) {
418- for (l = 0; l < current_piece.size; l++) {
419-
420- coord points = find_direction(current_piece, l, k);
421-
422- if (
423- i == current_piece.y + points.y &&
424- j == current_piece.x + points.x - BORDER_WIDTH &&
425- current_piece.piece[k][l])
426- {
427- current_square = current_piece.name;
428- }
429- }
430- }
431- }
432-
433- if (current_square <= EMPTY || current_square > Z_PIECE) {
434- printf("· ");
435- continue;
436- }
437-
438- draw_color(current_square);
439- }
440-
441- printf("██\033[0m");
442- }
443- printf("┃\n");
444- }
445-
446- printf("┗");
447- for (i = 0; i < FIELD_WIDTH; i++)
448- printf("━━");
449- printf("┛\n");
450-
451-}
452-
453-
454-piece init_piece(tetromino new_piece) {
455-
456- piece current_piece = {};
457-
458- current_piece.name = new_piece;
459-
460- current_piece.y = TOP_GAP;
461- current_piece.rotation = TOP;
462-
463-
464- switch (current_piece.name) {
465- case I_PIECE:
466- current_piece.size = 4;
467- current_piece.positions = 2;
468-
469- current_piece.piece[0][0] = false;
470- current_piece.piece[0][1] = false;
471- current_piece.piece[0][2] = false;
472- current_piece.piece[0][3] = false;
473-
474- current_piece.piece[1][0] = true;
475- current_piece.piece[1][1] = true;
476- current_piece.piece[1][2] = true;
477- current_piece.piece[1][3] = true;
478-
479- current_piece.piece[2][0] = false;
480- current_piece.piece[2][1] = false;
481- current_piece.piece[2][2] = false;
482- current_piece.piece[2][3] = false;
483-
484- current_piece.piece[3][0] = false;
485- current_piece.piece[3][1] = false;
486- current_piece.piece[3][2] = false;
487- current_piece.piece[3][3] = false;
488-
489- current_piece.y = 0;
490-
491- break;
492-
493- case J_PIECE:
494- current_piece.size = 3;
495- current_piece.positions = 4;
496-
497- current_piece.piece[0][0] = true;
498- current_piece.piece[0][1] = false;
499- current_piece.piece[0][2] = false;
500-
501- current_piece.piece[1][0] = true;
502- current_piece.piece[1][1] = true;
503- current_piece.piece[1][2] = true;
504-
505- current_piece.piece[2][0] = false;
506- current_piece.piece[2][1] = false;
507- current_piece.piece[2][2] = false;
508-
509- break;
510-
511- case L_PIECE:
512- current_piece.size = 3;
513- current_piece.positions = 4;
514-
515- current_piece.piece[0][0] = false;
516- current_piece.piece[0][1] = false;
517- current_piece.piece[0][2] = true;
518-
519- current_piece.piece[1][0] = true;
520- current_piece.piece[1][1] = true;
521- current_piece.piece[1][2] = true;
522-
523- current_piece.piece[2][0] = false;
524- current_piece.piece[2][1] = false;
525- current_piece.piece[2][2] = false;
526-
527- break;
528-
529- case O_PIECE:
530- current_piece.size = 2;
531- current_piece.positions = 1;
532-
533- current_piece.piece[0][0] = true;
534- current_piece.piece[0][1] = true;
535-
536- current_piece.piece[1][0] = true;
537- current_piece.piece[1][1] = true;
538-
539- break;
540-
541- case S_PIECE:
542- current_piece.size = 3;
543- current_piece.positions = 2;
544-
545- current_piece.piece[0][0] = false;
546- current_piece.piece[0][1] = true;
547- current_piece.piece[0][2] = true;
548-
549- current_piece.piece[1][0] = true;
550- current_piece.piece[1][1] = true;
551- current_piece.piece[1][2] = false;
552-
553- current_piece.piece[2][0] = false;
554- current_piece.piece[2][1] = false;
555- current_piece.piece[2][2] = false;
556-
557- break;
558-
559- case T_PIECE:
560- current_piece.size = 3;
561- current_piece.positions = 4;
562-
563- current_piece.piece[0][0] = false;
564- current_piece.piece[0][1] = true;
565- current_piece.piece[0][2] = false;
566-
567- current_piece.piece[1][0] = true;
568- current_piece.piece[1][1] = true;
569- current_piece.piece[1][2] = true;
570-
571- current_piece.piece[2][0] = false;
572- current_piece.piece[2][1] = false;
573- current_piece.piece[2][2] = false;
574-
575- break;
576- case Z_PIECE:
577- current_piece.size = 3;
578- current_piece.positions = 2;
579-
580- current_piece.piece[0][0] = true;
581- current_piece.piece[0][1] = true;
582- current_piece.piece[0][2] = false;
583-
584- current_piece.piece[1][0] = false;
585- current_piece.piece[1][1] = true;
586- current_piece.piece[1][2] = true;
587-
588- current_piece.piece[2][0] = false;
589- current_piece.piece[2][1] = false;
590- current_piece.piece[2][2] = false;
591-
592- break;
593- default:
594- perror("Fuck you\n");
595- break;
596- }
597-
598- current_piece.x = ((FULL_WIDTH >> 1) - (current_piece.size >> 1));
599-
600- return current_piece;
601-}
602-
603-coord find_direction(piece current_piece, uint8_t x, uint8_t y) {
604-
605- coord points = {
606- x,
607- y
608- };
609-
610- switch (current_piece.rotation) {
611- case TOP:
612- /*
613- x = k;
614- y = j;
615- */
616- break;
617- case RIGHT:
618- points.x = y;
619- points.y = current_piece.size - (x + 1);
620- break;
621- case BOTTOM:
622- points.x = current_piece.size - (x + 1);
623- points.y = current_piece.size - (y + 1);
624- break;
625- case LEFT:
626- points.x = current_piece.size - (y + 1);
627- points.y = x;
628- break;
629- }
630-
631- return points;
632-}
Added file: main.h+69 additions
@@ -0,0 +1,69 @@
1+#ifndef MAIN_C
2+
3+#define MAIN_C
4+
5+#include <stdio.h>
6+#include <stdint.h>
7+#include <stdbool.h>
8+#include <stdlib.h>
9+
10+#include <termios.h>
11+#include <sys/ioctl.h>
12+#include <sys/stat.h>
13+
14+#include <time.h>
15+#include <unistd.h>
16+
17+#include <errno.h>
18+
19+
20+#define FIELD_WIDTH 10
21+#define FIELD_HEIGHT 21
22+
23+#define BORDER_WIDTH 2
24+#define TOP_GAP 1
25+
26+#define FULL_WIDTH (FIELD_WIDTH + BORDER_WIDTH * 2)
27+#define FULL_HEIGHT (FIELD_HEIGHT + BORDER_WIDTH)
28+
29+typedef enum {
30+ EMPTY, I_PIECE, J_PIECE, L_PIECE, O_PIECE, S_PIECE, T_PIECE, Z_PIECE, TETRIS
31+} tetromino;
32+
33+typedef enum {
34+ TOP, RIGHT, BOTTOM, LEFT
35+} direction;
36+
37+typedef struct {
38+ tetromino name;
39+ bool piece[4][4];
40+ int8_t x;
41+ int8_t y;
42+ uint8_t size;
43+ direction rotation;
44+ uint8_t positions;
45+} piece;
46+
47+typedef struct {
48+ int8_t x;
49+ int8_t y;
50+} coord;
51+
52+
53+
54+void init_field();
55+
56+void draw_board(piece current_piece, bool *blink, bool is_piece);
57+
58+piece init_piece(tetromino new_piece);
59+
60+coord find_direction(piece current_piece, uint8_t x, uint8_t y);
61+
62+bool valid_position(piece current_piece);
63+
64+
65+
66+extern tetromino playfield[FULL_HEIGHT][FULL_WIDTH];
67+
68+
69+#endif