jag

tetoris_c

public

Small block game in C

Star0
Watch0

Commit f9d6ce442c2e

tarball

Jaglekon <58274093+Jaglekon@users.noreply.github.com>2026-07-17 16:44 UTC

1 file changed+59-39
some fixes
Modified file: main.c+59 additions−39 deletions
@@ -16,13 +16,13 @@
1616 /* TETRIS */
1717
1818 #define FIELD_WIDTH 10
19-#define FIELD_HEIGHT 20
19+#define FIELD_HEIGHT 21
2020
2121 #define BORDER_WIDTH 2
2222 #define TOP_GAP 1
2323
2424 #define FULL_WIDTH (FIELD_WIDTH + BORDER_WIDTH * 2)
25-#define FULL_HEIGHT (FIELD_HEIGHT + BORDER_WIDTH + TOP_GAP)
25+#define FULL_HEIGHT (FIELD_HEIGHT + BORDER_WIDTH)
2626
2727 typedef enum {
2828 EMPTY, I_PIECE, J_PIECE, L_PIECE, O_PIECE, S_PIECE, T_PIECE, Z_PIECE, TETRIS
@@ -39,6 +39,7 @@ typedef struct {
3939 int8_t y;
4040 uint8_t size;
4141 direction rotation;
42+ uint8_t positions;
4243 } piece;
4344
4445 typedef struct {
@@ -51,7 +52,7 @@ tetromino playfield[FULL_HEIGHT][FULL_WIDTH] = {};
5152
5253 void init_field();
5354
54-void draw_board(piece current_piece, int8_t blink, bool is_piece);
55+void draw_board(piece current_piece, bool *blink, bool is_piece);
5556
5657 piece init_piece(tetromino new_piece);
5758
@@ -92,14 +93,14 @@ int main () {
9293
9394 /* Init the first piece */
9495
95- bool is_piece = true;
96+ bool is_piece = false;
9697
97- piece current_piece = init_piece((rand() % Z_PIECE) + 1);
98+ piece current_piece = {};
9899
99100
100101 uint16_t i;
101102
102- for (i = 0;; i = (i + 1) % 20) {
103+ for (i = 0;; i++) {
103104
104105 int8_t move = 0;
105106 bool down = false;
@@ -110,9 +111,9 @@ int main () {
110111
111112 if (!is_piece) {
112113 current_piece = init_piece((rand() % Z_PIECE) + 1);
113- current_piece.rotation = rand() % (LEFT + 1);
114114 is_piece = true;
115115 draw = true;
116+ i = 0;
116117 }
117118
118119
@@ -179,14 +180,14 @@ int main () {
179180 }
180181 }
181182
182- /* Piece rotates */
183183
184+ /* Piece rotates */
184185
185- if (rotate) {
186+ if (rotate && current_piece.positions > 1) {
186187
187188 piece rotated = current_piece;
188189
189- rotated.rotation = (current_piece.rotation + 1) % (LEFT + 1);
190+ rotated.rotation = (current_piece.rotation + 1) % (current_piece.positions);
190191
191192 bool is_valid = true;
192193
@@ -214,9 +215,9 @@ int main () {
214215
215216 /* Piece falls */
216217
217- if (i == 0 || down) {
218+ if (i >= 100 || down) {
218219 current_piece.y++;
219- i = 1;
220+ i = 0;
220221 draw = true;
221222 }
222223
@@ -257,35 +258,44 @@ int main () {
257258
258259 /* Looks if there is a tetris */
259260
260- for (j = FIELD_HEIGHT + TOP_GAP - 1; j >= 0; j--) {
261+ bool blink[FIELD_HEIGHT] = {};
262+ bool is_tetris = false;
261263
262- uint8_t is_tetris = 0;
264+ for (j = FIELD_HEIGHT - 1; j >= 0; j--) {
265+
266+ uint8_t blocked = 0;
263267
264268 for (k = 0; k < FIELD_WIDTH; k++) {
265269 if (playfield[j][k + BORDER_WIDTH] != EMPTY)
266- is_tetris++;
270+ blocked++;
267271 }
268272
269- if (is_tetris == 10) {
273+ if (blocked == 10) {
270274
271- for (k = 0; k < 4; k++) {
272-
273- draw_board(current_piece, (k % 2) ? -1 : j, is_piece);
275+ blink[j] = true;
276+ is_tetris = true;
277+ }
278+ }
274279
275- usleep(300000);
276- }
280+ if (is_tetris) {
281+ for (j = 0; j < 4; j++) {
282+ draw_board(current_piece, (j % 2) ? NULL : blink, is_piece);
283+ usleep(200000);
284+ }
277285
278- for (k = j; k > 0; k--) {
279-
280- int8_t l;
286+ for (j = 0; j < FIELD_HEIGHT; j++) {
287+ if (blink[j]) {
288+
289+ for (k = j; k >= 0; k--) {
290+ int8_t l;
281291
282- for (l = 0; l < FIELD_WIDTH; l++) {
283- playfield[k][l + BORDER_WIDTH] = playfield[k - 1][l + BORDER_WIDTH];
292+ for (l = 0; l < FIELD_WIDTH; l++) {
293+ playfield[k][l + BORDER_WIDTH] = playfield[k - 1][l + BORDER_WIDTH];
294+ }
284295 }
285296 }
286-
287- j++;
288297 }
298+
289299 }
290300
291301
@@ -293,7 +303,7 @@ int main () {
293303
294304 for (j = 0; j < FIELD_WIDTH; j++) {
295305 if (playfield[TOP_GAP][j + BORDER_WIDTH] > 0) {
296- draw_board(current_piece, -1, is_piece);
306+ draw_board(current_piece, NULL, is_piece);
297307 sleep(2);
298308 printf("\033[2J\033[H");
299309 printf("HAHA LOSER\n");
@@ -304,7 +314,7 @@ int main () {
304314
305315
306316 if (draw)
307- draw_board(current_piece, -1, is_piece);
317+ draw_board(current_piece, NULL, is_piece);
308318 usleep(10000);
309319 }
310320
@@ -375,7 +385,7 @@ void draw_color (tetromino current_square) {
375385 }
376386
377387
378-void draw_board(piece current_piece, int8_t blink, bool is_piece) {
388+void draw_board(piece current_piece, bool *blink, bool is_piece) {
379389
380390 uint8_t i, j;
381391
@@ -393,13 +403,13 @@ void draw_board(piece current_piece, int8_t blink, bool is_piece) {
393403
394404 for (j = 0; j < FIELD_WIDTH; j++) {
395405
396- if (i + TOP_GAP == blink) {
406+ if ( blink != NULL && blink[i]) {
397407
398408 printf("%s", WHITE);
399409 } else {
400410
401411
402- tetromino current_square = current_square = playfield[i + TOP_GAP][j + BORDER_WIDTH];
412+ tetromino current_square = current_square = playfield[i][j + BORDER_WIDTH];
403413
404414 if (is_piece) {
405415
@@ -411,7 +421,7 @@ void draw_board(piece current_piece, int8_t blink, bool is_piece) {
411421 coord points = find_direction(current_piece, l, k);
412422
413423 if (
414- i == current_piece.y + points.y - TOP_GAP &&
424+ i == current_piece.y + points.y &&
415425 j == current_piece.x + points.x - BORDER_WIDTH &&
416426 current_piece.piece[k][l])
417427 {
@@ -448,10 +458,16 @@ piece init_piece(tetromino new_piece) {
448458
449459 current_piece.name = new_piece;
450460
461+ current_piece.x = ((FIELD_WIDTH >> 1) - (current_piece.size >> 1));
462+ current_piece.y = TOP_GAP;
463+ current_piece.rotation = TOP;
464+
465+
451466 switch (current_piece.name) {
452467 case I_PIECE:
453468 current_piece.size = 4;
454-
469+ current_piece.positions = 2;
470+
455471 current_piece.piece[0][0] = false;
456472 current_piece.piece[0][1] = false;
457473 current_piece.piece[0][2] = false;
@@ -472,10 +488,13 @@ piece init_piece(tetromino new_piece) {
472488 current_piece.piece[3][2] = false;
473489 current_piece.piece[3][3] = false;
474490
491+ current_piece.y = 0;
492+
475493 break;
476494
477495 case J_PIECE:
478496 current_piece.size = 3;
497+ current_piece.positions = 4;
479498
480499 current_piece.piece[0][0] = true;
481500 current_piece.piece[0][1] = false;
@@ -493,6 +512,7 @@ piece init_piece(tetromino new_piece) {
493512
494513 case L_PIECE:
495514 current_piece.size = 3;
515+ current_piece.positions = 4;
496516
497517 current_piece.piece[0][0] = false;
498518 current_piece.piece[0][1] = false;
@@ -510,6 +530,7 @@ piece init_piece(tetromino new_piece) {
510530
511531 case O_PIECE:
512532 current_piece.size = 2;
533+ current_piece.positions = 1;
513534
514535 current_piece.piece[0][0] = true;
515536 current_piece.piece[0][1] = true;
@@ -521,6 +542,7 @@ piece init_piece(tetromino new_piece) {
521542
522543 case S_PIECE:
523544 current_piece.size = 3;
545+ current_piece.positions = 2;
524546
525547 current_piece.piece[0][0] = false;
526548 current_piece.piece[0][1] = true;
@@ -538,6 +560,7 @@ piece init_piece(tetromino new_piece) {
538560
539561 case T_PIECE:
540562 current_piece.size = 3;
563+ current_piece.positions = 4;
541564
542565 current_piece.piece[0][0] = false;
543566 current_piece.piece[0][1] = true;
@@ -554,6 +577,7 @@ piece init_piece(tetromino new_piece) {
554577 break;
555578 case Z_PIECE:
556579 current_piece.size = 3;
580+ current_piece.positions = 2;
557581
558582 current_piece.piece[0][0] = true;
559583 current_piece.piece[0][1] = true;
@@ -573,10 +597,6 @@ piece init_piece(tetromino new_piece) {
573597 break;
574598 }
575599
576- current_piece.x = (FIELD_WIDTH >> 1) - (current_piece.size >> 1) + BORDER_WIDTH;
577- current_piece.y = TOP_GAP;
578- current_piece.rotation = TOP;
579-
580600 return current_piece;
581601 }