Small block game in C
Commit f9d6ce442c2e
tarball1 file changed+59-39
@@ -16,13 +16,13 @@
1616
/* TETRIS */1717
1818
#define FIELD_WIDTH 1019
-#define FIELD_HEIGHT 2019
+#define FIELD_HEIGHT 212020
2121
#define BORDER_WIDTH 22222
#define TOP_GAP 12323
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
}