jag

tetoris_c

public

Small block game in C

Star0
Watch0
1a3c5635ceb027cc71cca8e269953d6627672d11
1
ssh://git@git.jaglekon.de:30/jag/tetoris_c.git
source/logic.cC284 lines6.2 KB
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 = 4;
99
      current_piece.positions = 1;
100
  
101
      current_piece.piece[0][0] = false;
102
      current_piece.piece[0][1] = false;
103
      current_piece.piece[0][2] = false;
104
      current_piece.piece[0][3] = false;
105
    
106
      current_piece.piece[1][0] = false;
107
      current_piece.piece[1][1] = true;
108
      current_piece.piece[1][2] = true;
109
      current_piece.piece[1][3] = false; 
110
  
111
      current_piece.piece[2][0] = false;
112
      current_piece.piece[2][1] = true;
113
      current_piece.piece[2][2] = true;
114
      current_piece.piece[2][3] = false; 
115
      
116
      current_piece.piece[3][0] = false;
117
      current_piece.piece[3][1] = false;
118
      current_piece.piece[3][2] = false;
119
      current_piece.piece[3][3] = false;
120
      
121
      break;
122
123
    case S_PIECE:
124
      current_piece.size = 3;
125
      current_piece.positions = 2;
126
  
127
      current_piece.piece[0][0] = false;
128
      current_piece.piece[0][1] = true;
129
      current_piece.piece[0][2] = true;
130
131
      current_piece.piece[1][0] = true;
132
      current_piece.piece[1][1] = true;
133
      current_piece.piece[1][2] = false;
134
 
135
      current_piece.piece[2][0] = false;
136
      current_piece.piece[2][1] = false;
137
      current_piece.piece[2][2] = false;
138
139
      break;
140
141
    case T_PIECE:
142
      current_piece.size = 3;
143
      current_piece.positions = 4;
144
  
145
      current_piece.piece[0][0] = false;
146
      current_piece.piece[0][1] = true;
147
      current_piece.piece[0][2] = false;
148
      
149
      current_piece.piece[1][0] = true;
150
      current_piece.piece[1][1] = true;
151
      current_piece.piece[1][2] = true;
152
      
153
      current_piece.piece[2][0] = false;
154
      current_piece.piece[2][1] = false;
155
      current_piece.piece[2][2] = false;
156
157
      break;
158
    case Z_PIECE:
159
      current_piece.size = 3;
160
      current_piece.positions = 2;
161
  
162
      current_piece.piece[0][0] = true;
163
      current_piece.piece[0][1] = true;
164
      current_piece.piece[0][2] = false;
165
166
      current_piece.piece[1][0] = false;
167
      current_piece.piece[1][1] = true;
168
      current_piece.piece[1][2] = true;
169
170
      current_piece.piece[2][0] = false;
171
      current_piece.piece[2][1] = false;
172
      current_piece.piece[2][2] = false;
173
174
      break;
175
    default:
176
      perror("Fuck you\n");
177
      break;
178
  }
179
180
  current_piece.x = ((FULL_WIDTH >> 1) - (current_piece.size >> 1));
181
182
  return current_piece;
183
}
184
185
186
187
coord find_direction(piece current_piece, uint8_t x, uint8_t y) {
188
189
  coord points = {
190
    x,
191
    y
192
  };
193
194
  switch (current_piece.rotation) {
195
    case TOP:
196
      /*
197
      x = k;
198
      y = j;
199
      */
200
      break;
201
    case RIGHT:
202
      points.x = y;
203
      points.y = current_piece.size - (x + 1);
204
      break;
205
    case BOTTOM:
206
      points.x = current_piece.size - (x + 1);
207
      points.y = current_piece.size - (y + 1);
208
      break;
209
    case LEFT:
210
      points.x = current_piece.size - (y + 1);
211
      points.y = x;
212
      break;
213
  }
214
215
  return points;
216
}
217
218
219
bool valid_position(piece current_piece) {
220
221
  uint8_t i, j;
222
223
  for(i = 0; i < current_piece.size; i++) {
224
    for (j = 0; j < current_piece.size; j++) {
225
226
      coord points = find_direction(current_piece, j, i);
227
228
      int8_t y = current_piece.y + points.y;
229
      int8_t x = current_piece.x + points.x;
230
231
      if (
232
        y < 0 || y >= FULL_HEIGHT ||
233
        x < 0 || x >= FULL_WIDTH
234
      ) {
235
        return false;
236
      }
237
238
      if (
239
        (current_piece.piece[i][j] &&
240
        playfield[y][x] != EMPTY)
241
      ) {
242
        return false;
243
      }
244
    }
245
  }
246
247
  return true;
248
}
249
250
251
uint8_t delay[] = {
252
  53, 49, 45, 41, 37, 33, 28, 22, 17, 11, 10, 9, 8, 7, 6, 6, 5, 5, 4, 4, 3
253
};
254
255
uint8_t level_delay() {
256
  if (level < sizeof(delay))
257
    return delay[level];
258
259
  return delay[0];
260
}
261
262
uint16_t line_points_add(uint8_t lines_cleared, uint8_t level) {
263
  
264
  uint16_t score = 0;
265
266
  switch (lines_cleared) {
267
    case 1:
268
      score = 40;
269
      break;
270
    case 2:
271
      score = 100;
272
      break;
273
    case 3:
274
      score = 300;
275
      break;
276
    case 4:
277
      score = 1200;
278
      break;
279
    default:
280
      break;
281
  }
282
283
  return score * (level + 1);
284
}