jag

tetoris_c

public

Small block game in C

Star0
Watch0
6642d1d9ca12fe4a7b7732a94430c68fb49956ce
1
ssh://git@git.jaglekon.de:30/jag/tetoris_c.git
logic.cC224 lines5.0 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 = 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
}