All there but errors need fixing

Dependencies:   mbed

Overview:

Rookie Tetris is a jigsaw style game based on the classic Tetris.

A block will appear at the top of the screen, you must move it (your options for movement are left, right and down - you cannot move up the board). The block will stop when it if placed either on the floor of the board or on-top of another block.

Your goal is to fill a complete row of the board with the blocks; when you do so the row will delete and the pattern above it will drop down. The game is over when your pattern is tall enough to reach to the top of the board!

Controls:

Use the joystick to move your block! Your block cannot move out of the parameters of the board.

Pot 2 controls the contrast of the screen.

Committer:
el18rs
Date:
Wed Jun 03 10:32:48 2020 +0000
Revision:
18:a089d9d184b1
Parent:
17:70d45e9e44a8
Child:
19:2ad31dbd5d11
blocks stack

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el18rs 3:522c6f850e91 1 #include "TetrisGame.h"
el18rs 3:522c6f850e91 2
el18rs 15:68114eae4053 3 volatile int iH;
el18rs 15:68114eae4053 4
el18rs 3:522c6f850e91 5 TetrisGame::TetrisGame()
el18rs 3:522c6f850e91 6 {
el18rs 15:68114eae4053 7
el18rs 3:522c6f850e91 8 }
el18rs 3:522c6f850e91 9
el18rs 3:522c6f850e91 10 TetrisGame::~TetrisGame()
el18rs 3:522c6f850e91 11 {
el18rs 15:68114eae4053 12
el18rs 3:522c6f850e91 13 }
el18rs 3:522c6f850e91 14
el18rs 11:0183a52c1077 15 void TetrisGame::init(int speed)
el18rs 3:522c6f850e91 16 {
el18rs 4:7ddd287a5d28 17 // initialise game parameters
el18rs 11:0183a52c1077 18 _px = 40;
el18rs 11:0183a52c1077 19 _py = 4;
el18rs 9:58103274b2ab 20 _speed = speed;
el18rs 15:68114eae4053 21
el18rs 11:0183a52c1077 22 _tetromino.init(_px, _py); // puts tetromino in middle SHOULD THIS INCLUDE ARRAY????
el18rs 15:68114eae4053 23
el18rs 11:0183a52c1077 24 printf("initiate(%i)\n",_speed);
el18rs 15:68114eae4053 25
el18rs 3:522c6f850e91 26 }
el18rs 3:522c6f850e91 27
el18rs 4:7ddd287a5d28 28
el18rs 3:522c6f850e91 29 void TetrisGame::read_input(Gamepad &pad)
el18rs 3:522c6f850e91 30 {
el18rs 3:522c6f850e91 31 _d = pad.get_direction();
el18rs 4:7ddd287a5d28 32 _mag = pad.get_mag();
el18rs 3:522c6f850e91 33 }
el18rs 3:522c6f850e91 34
el18rs 3:522c6f850e91 35 void TetrisGame::draw(N5110 &lcd)
el18rs 3:522c6f850e91 36 {
el18rs 15:68114eae4053 37 // draw elements in lcd buffer
el18rs 15:68114eae4053 38
el18rs 4:7ddd287a5d28 39 // board
el18rs 3:522c6f850e91 40 lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT);
el18rs 15:68114eae4053 41
el18rs 6:39cbec524483 42 _tetromino.draw(lcd);
el18rs 15:68114eae4053 43
el18rs 11:0183a52c1077 44 printf("draw (%i,%i)\n",_px,_py);
el18rs 15:68114eae4053 45
el18rs 3:522c6f850e91 46 }
el18rs 3:522c6f850e91 47
el18rs 6:39cbec524483 48 void TetrisGame::update(Gamepad &pad, N5110 &lcd)
el18rs 3:522c6f850e91 49 {
el18rs 4:7ddd287a5d28 50 // check_score(pad);
el18rs 15:68114eae4053 51
el18rs 4:7ddd287a5d28 52 _tetromino.update(_d,_mag);
el18rs 15:68114eae4053 53
el18rs 6:39cbec524483 54 check_wall_collision(pad, lcd);
el18rs 6:39cbec524483 55 check_tetromino_collisions(pad, lcd);
el18rs 15:68114eae4053 56
el18rs 11:0183a52c1077 57 printf("update (%i,%i,%i)\n",_px,_py,_d);
el18rs 3:522c6f850e91 58 }
el18rs 4:7ddd287a5d28 59
el18rs 4:7ddd287a5d28 60
el18rs 6:39cbec524483 61 void TetrisGame::check_wall_collision(Gamepad &pad, N5110 &lcd)
el18rs 3:522c6f850e91 62 {
el18rs 3:522c6f850e91 63 Vector2D tetromino_pos = _tetromino.get_pos();
el18rs 3:522c6f850e91 64 Vector2D tetromino_velocity = _tetromino.get_velocity();
el18rs 17:70d45e9e44a8 65 // floor_hit_flag = 0;
el18rs 15:68114eae4053 66
el18rs 4:7ddd287a5d28 67 // check if hit floor
el18rs 11:0183a52c1077 68 if (tetromino_pos.y + 4 >= (HEIGHT-1) ) {
el18rs 15:68114eae4053 69
el18rs 11:0183a52c1077 70 tetromino_pos.y = (HEIGHT-1) - 4;
el18rs 15:68114eae4053 71 // tetromino_velocity.y = 0;
el18rs 15:68114eae4053 72
el18rs 4:7ddd287a5d28 73 pad.tone(750.0,0.1);
el18rs 15:68114eae4053 74
el18rs 18:a089d9d184b1 75 cancel_line(lcd); // check if line full and cancel + drop down if it is
el18rs 15:68114eae4053 76
el18rs 6:39cbec524483 77 lcd.drawRect(tetromino_pos.x, tetromino_pos.y, 4, 4, FILL_BLACK);
el18rs 15:68114eae4053 78
el18rs 15:68114eae4053 79 _tetromino.init(_px, _py); // drop new shame
el18rs 11:0183a52c1077 80
el18rs 13:600a34a047ca 81 a = tetromino_pos.x;
el18rs 13:600a34a047ca 82 b = tetromino_pos.y;
el18rs 15:68114eae4053 83
el18rs 13:600a34a047ca 84 floor_hit_flag = 1;
el18rs 15:68114eae4053 85
el18rs 11:0183a52c1077 86 printf("floor hit!\n");
el18rs 15:68114eae4053 87
el18rs 4:7ddd287a5d28 88 }
el18rs 4:7ddd287a5d28 89 // check if hit roof
el18rs 4:7ddd287a5d28 90 else if (tetromino_pos.y <= 1) {
el18rs 18:a089d9d184b1 91
el18rs 18:a089d9d184b1 92 floor_hit_flag = 0;
el18rs 15:68114eae4053 93
el18rs 11:0183a52c1077 94 printf("roof hit!\n");
el18rs 15:68114eae4053 95
el18rs 6:39cbec524483 96 exit_game(lcd);
el18rs 15:68114eae4053 97
el18rs 3:522c6f850e91 98 }
el18rs 15:68114eae4053 99
el18rs 10:7310c9440547 100 printf("wall collision\n");
el18rs 15:68114eae4053 101
el18rs 4:7ddd287a5d28 102 // SAVE OLD SCREEN AND DROP NEW TETROMINO???? //
el18rs 15:68114eae4053 103 // update tetromino parameters??
el18rs 4:7ddd287a5d28 104 }
el18rs 4:7ddd287a5d28 105
el18rs 6:39cbec524483 106 void TetrisGame::check_tetromino_collisions(Gamepad &pad, N5110 &lcd)
el18rs 5:53e021832adc 107 {
el18rs 5:53e021832adc 108 Vector2D tetromino_pos = _tetromino.get_pos();
el18rs 5:53e021832adc 109 Vector2D tetromino_velocity = _tetromino.get_velocity();
el18rs 5:53e021832adc 110
el18rs 5:53e021832adc 111 if (
el18rs 17:70d45e9e44a8 112 (lcd.getPixel(tetromino_pos.x, tetromino_pos.y + 4) == 1) || // not sure if it should be 4 or 5 ???
el18rs 17:70d45e9e44a8 113 (lcd.getPixel(tetromino_pos.x + 1, tetromino_pos.y + 4) == 1) ||
el18rs 17:70d45e9e44a8 114 (lcd.getPixel(tetromino_pos.x + 2, tetromino_pos.y + 4) == 1) ||
el18rs 17:70d45e9e44a8 115 (lcd.getPixel(tetromino_pos.x + 3, tetromino_pos.y + 4) == 1)
el18rs 5:53e021832adc 116 ) {
el18rs 5:53e021832adc 117 tetromino_velocity.x = 0;
el18rs 15:68114eae4053 118
el18rs 5:53e021832adc 119 pad.tone(1000.0,0.1);
el18rs 6:39cbec524483 120 cancel_line(lcd);
el18rs 15:68114eae4053 121
el18rs 15:68114eae4053 122 // lcd.drawRect(tetromino_pos.x, tetromino_pos.y, 4, 4, FILL_BLACK);
el18rs 15:68114eae4053 123
el18rs 11:0183a52c1077 124 _tetromino.init(_px, _py); // break to loop back or keep this ??
el18rs 16:fca1bbb06c44 125
el18rs 16:fca1bbb06c44 126 a = tetromino_pos.x;
el18rs 16:fca1bbb06c44 127 b = tetromino_pos.y;
el18rs 16:fca1bbb06c44 128
el18rs 16:fca1bbb06c44 129 floor_hit_flag = 1;
el18rs 15:68114eae4053 130
el18rs 11:0183a52c1077 131 printf("blocks stacked!\n");
el18rs 18:a089d9d184b1 132 }
el18rs 15:68114eae4053 133 printf("tetromino collision\n");
el18rs 5:53e021832adc 134 }
el18rs 6:39cbec524483 135
el18rs 15:68114eae4053 136 void TetrisGame::cancel_line(N5110 &lcd)
el18rs 6:39cbec524483 137 {
el18rs 15:68114eae4053 138 int count;
el18rs 6:39cbec524483 139 for(int j=0; j<=46; j+=1) {
el18rs 15:68114eae4053 140 for(int i=0; i<=82; i++) {
el18rs 15:68114eae4053 141 if (lcd.getPixel(i,j)==0) { // if the pixel is empty the counting stops and exits loop
el18rs 15:68114eae4053 142 count=0;
el18rs 15:68114eae4053 143 break;
el18rs 15:68114eae4053 144 } else if (lcd.getPixel(i,j)==1) { // if the pixel is full carries on counting
el18rs 15:68114eae4053 145 count ++;
el18rs 6:39cbec524483 146 }
el18rs 15:68114eae4053 147 }
el18rs 15:68114eae4053 148 if(count==83) { // if gets to end of line
el18rs 6:39cbec524483 149 count = 0;
el18rs 6:39cbec524483 150 lcd.drawLine(0,j,82,j,0); // clear line
el18rs 12:965b39a2e049 151 printf("line canceled!\n");
el18rs 15:68114eae4053 152 // score++;
el18rs 6:39cbec524483 153 for(int x=0; x<=82; x++) {
el18rs 6:39cbec524483 154 for(int y=j; y>=0; y--) {
el18rs 15:68114eae4053 155 lcd.setPixel(x,y,false);
el18rs 15:68114eae4053 156 lcd.setPixel(x,y+1); // sets pixel to the one above
el18rs 12:965b39a2e049 157 printf("line dropped!\n");
el18rs 6:39cbec524483 158 }
el18rs 6:39cbec524483 159 }
el18rs 6:39cbec524483 160 }
el18rs 15:68114eae4053 161 }
el18rs 10:7310c9440547 162 printf("cancel line\n");
el18rs 6:39cbec524483 163
el18rs 15:68114eae4053 164 }
el18rs 6:39cbec524483 165
el18rs 15:68114eae4053 166 void TetrisGame::exit_game(N5110 &lcd)
el18rs 15:68114eae4053 167 {
el18rs 15:68114eae4053 168 lcd.clear();
el18rs 15:68114eae4053 169 lcd.printString(" GAME OVER ",0, 3);
el18rs 15:68114eae4053 170 lcd.refresh();
el18rs 15:68114eae4053 171 wait(10);
el18rs 15:68114eae4053 172 printf("game over!\n");
el18rs 15:68114eae4053 173 lcd.clear();
el18rs 15:68114eae4053 174 lcd.printString(" press RESET ",0,6);
el18rs 15:68114eae4053 175 lcd.refresh();
el18rs 15:68114eae4053 176 printf("press reset!\n");
el18rs 15:68114eae4053 177 exit(1.0);
el18rs 15:68114eae4053 178 }
el18rs 15:68114eae4053 179
el18rs 15:68114eae4053 180 void TetrisGame::fallenblocks(N5110 &lcd, int iH)
el18rs 15:68114eae4053 181 {
el18rs 15:68114eae4053 182 for (int i=0; i<=iH; i++) {
el18rs 15:68114eae4053 183 x0 = X[i];
el18rs 15:68114eae4053 184 y0 = Y[i];
el18rs 16:fca1bbb06c44 185 lcd.drawRect(x0, y0, 4, 4, FILL_BLACK);
el18rs 15:68114eae4053 186 printf("block drawn\n");
el18rs 15:68114eae4053 187 }
el18rs 15:68114eae4053 188 }