Small block game in C
Commit 6642d1d9ca12
tarball5 files changed+417-424
@@ -1,2 +1,2 @@
1
-tetoris: main.c2
- gcc -Wall -Wextra -o tetoris main.c1
+tetoris: main.c draw.c logic.c2
+ gcc -Wall -Wextra -o tetoris main.c draw.c logic.c@@ -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
+}@@ -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_WIDTH12
+ ) {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
+ y178
+ };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] != EMPTY217
+ ) {218
+ return false;219
+ }220
+ }221
+ }222
+223
+ return true;224
+}@@ -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 1019
-#define FIELD_HEIGHT 2120
-21
-#define BORDER_WIDTH 222
-#define TOP_GAP 123
-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, TETRIS29
-} tetromino;30
-31
-typedef enum {32
- TOP, RIGHT, BOTTOM, LEFT33
-} 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] != EMPTY170
- ) {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] != EMPTY202
- ) {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_WIDTH340
- ) {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
- y608
- };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
-}@@ -0,0 +1,69 @@
1
+#ifndef MAIN_C2
+3
+#define MAIN_C4
+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 1021
+#define FIELD_HEIGHT 2122
+23
+#define BORDER_WIDTH 224
+#define TOP_GAP 125
+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, TETRIS31
+} tetromino;32
+33
+typedef enum {34
+ TOP, RIGHT, BOTTOM, LEFT35
+} 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