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 13:34:52 2020 +0000
Revision:
21:6d4dd906edde
Parent:
20:ad685b35a1a4
Child:
22:403759d2f093
some comments added

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 19:2ad31dbd5d11 22 _tetromino.init(_px, _py); // puts tetromino in middle
el18rs 15:68114eae4053 23
el18rs 21:6d4dd906edde 24 // printf("initiate(%i)\n",_speed);
el18rs 15:68114eae4053 25
el18rs 3:522c6f850e91 26 }
el18rs 3:522c6f850e91 27
el18rs 4:7ddd287a5d28 28
el18rs 21:6d4dd906edde 29 void TetrisGame::read_input(Gamepad &pad) // read inputs
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 21:6d4dd906edde 35 void TetrisGame::draw(N5110 &lcd) // draw elements in lcd buffer
el18rs 3:522c6f850e91 36 {
el18rs 15:68114eae4053 37
el18rs 19:2ad31dbd5d11 38
el18rs 19:2ad31dbd5d11 39 lcd.drawRect(19, 4, 42, HEIGHT - 4, FILL_TRANSPARENT);
el18rs 19:2ad31dbd5d11 40
el18rs 6:39cbec524483 41 _tetromino.draw(lcd);
el18rs 15:68114eae4053 42
el18rs 19:2ad31dbd5d11 43 // printf("draw (%i,%i)\n",_px,_py);
el18rs 15:68114eae4053 44
el18rs 3:522c6f850e91 45 }
el18rs 3:522c6f850e91 46
el18rs 21:6d4dd906edde 47 void TetrisGame::update(Gamepad &pad, N5110 &lcd) // update values
el18rs 3:522c6f850e91 48 {
el18rs 4:7ddd287a5d28 49 // check_score(pad);
el18rs 15:68114eae4053 50
el18rs 4:7ddd287a5d28 51 _tetromino.update(_d,_mag);
el18rs 15:68114eae4053 52
el18rs 21:6d4dd906edde 53 check_wall_collision(pad, lcd); // check if block has collided with the floor
el18rs 21:6d4dd906edde 54 check_tetromino_collisions(pad, lcd); // check if block has collided with an old block
el18rs 15:68114eae4053 55
el18rs 19:2ad31dbd5d11 56 // printf("update (%i,%i,%i)\n",_px,_py,_d);
el18rs 3:522c6f850e91 57 }
el18rs 4:7ddd287a5d28 58
el18rs 4:7ddd287a5d28 59
el18rs 21:6d4dd906edde 60 void TetrisGame::check_wall_collision(Gamepad &pad, N5110 &lcd) // check if block has hit floor
el18rs 3:522c6f850e91 61 {
el18rs 21:6d4dd906edde 62 Vector2D tetromino_pos = _tetromino.get_pos(); // get current positioning of block
el18rs 15:68114eae4053 63
el18rs 21:6d4dd906edde 64 if (tetromino_pos.y + 4 >= (HEIGHT-1) ) { // if bottom of block is on bottom boundary
el18rs 15:68114eae4053 65
el18rs 21:6d4dd906edde 66 tetromino_pos.y = (HEIGHT-1) - 4; // stop block
el18rs 15:68114eae4053 67
el18rs 21:6d4dd906edde 68 pad.tone(750.0,0.1); // play tone
el18rs 15:68114eae4053 69
el18rs 21:6d4dd906edde 70 cancel_line(lcd); // check if row is full
el18rs 15:68114eae4053 71
el18rs 15:68114eae4053 72 _tetromino.init(_px, _py); // drop new shame
el18rs 19:2ad31dbd5d11 73
el18rs 21:6d4dd906edde 74 a = tetromino_pos.x; // save positions to be drawn on next screen
el18rs 13:600a34a047ca 75 b = tetromino_pos.y;
el18rs 15:68114eae4053 76
el18rs 21:6d4dd906edde 77 floor_hit_flag = 1; // set flag so program knows to draw block on next screen
el18rs 20:ad685b35a1a4 78
el18rs 21:6d4dd906edde 79 if (b <= 4) { // if pattern reaches top of screen
el18rs 21:6d4dd906edde 80 exit_game(lcd); // game over
el18rs 20:ad685b35a1a4 81 }
el18rs 15:68114eae4053 82
el18rs 11:0183a52c1077 83 printf("floor hit!\n");
el18rs 15:68114eae4053 84
el18rs 4:7ddd287a5d28 85 }
el18rs 19:2ad31dbd5d11 86 // printf("wall collision\n");
el18rs 4:7ddd287a5d28 87 }
el18rs 4:7ddd287a5d28 88
el18rs 21:6d4dd906edde 89 void TetrisGame::check_tetromino_collisions(Gamepad &pad, N5110 &lcd) // check if block has old block beneath it
el18rs 5:53e021832adc 90 {
el18rs 21:6d4dd906edde 91 Vector2D tetromino_pos = _tetromino.get_pos(); // get current position of block
el18rs 5:53e021832adc 92
el18rs 5:53e021832adc 93 if (
el18rs 21:6d4dd906edde 94 (lcd.getPixel(tetromino_pos.x, tetromino_pos.y + 4) == 1) ||
el18rs 17:70d45e9e44a8 95 (lcd.getPixel(tetromino_pos.x + 1, tetromino_pos.y + 4) == 1) ||
el18rs 17:70d45e9e44a8 96 (lcd.getPixel(tetromino_pos.x + 2, tetromino_pos.y + 4) == 1) ||
el18rs 21:6d4dd906edde 97 (lcd.getPixel(tetromino_pos.x + 3, tetromino_pos.y + 4) == 1) // if any of the 4 pixels directly below the block are black
el18rs 5:53e021832adc 98 ) {
el18rs 15:68114eae4053 99
el18rs 21:6d4dd906edde 100 pad.tone(1000.0,0.1); // play tone
el18rs 21:6d4dd906edde 101 cancel_line(lcd); // check if row is full
el18rs 15:68114eae4053 102
el18rs 21:6d4dd906edde 103 _tetromino.init(_px, _py); // drop new block
el18rs 15:68114eae4053 104
el18rs 21:6d4dd906edde 105 a = tetromino_pos.x; // save positioning of old block
el18rs 16:fca1bbb06c44 106 b = tetromino_pos.y;
el18rs 16:fca1bbb06c44 107
el18rs 21:6d4dd906edde 108 floor_hit_flag = 1; // set flag so program knows to draw block on next screen
el18rs 20:ad685b35a1a4 109
el18rs 21:6d4dd906edde 110 if (b <= 4) { // if pattern reaches top of screen
el18rs 21:6d4dd906edde 111 exit_game(lcd); // game over
el18rs 20:ad685b35a1a4 112 }
el18rs 15:68114eae4053 113
el18rs 11:0183a52c1077 114 printf("blocks stacked!\n");
el18rs 19:2ad31dbd5d11 115 }
el18rs 19:2ad31dbd5d11 116 // printf("tetromino collision\n");
el18rs 5:53e021832adc 117 }
el18rs 6:39cbec524483 118
el18rs 21:6d4dd906edde 119 void TetrisGame::cancel_line(N5110 &lcd) // check if row is full, if it is then delete line and drop pattern down
el18rs 6:39cbec524483 120 {
el18rs 15:68114eae4053 121 int count;
el18rs 21:6d4dd906edde 122 for(int j=4; j<=46; j++) {
el18rs 20:ad685b35a1a4 123 for(int i=20; i<=60; i++) {
el18rs 21:6d4dd906edde 124 if (lcd.getPixel(i,j)==0) { // if the pixel is empty the counting stops and exits loop (row is not full)
el18rs 15:68114eae4053 125 count=0;
el18rs 15:68114eae4053 126 break;
el18rs 21:6d4dd906edde 127 } else if (lcd.getPixel(i,j)==1) { // if the pixel is full carries on counting
el18rs 15:68114eae4053 128 count ++;
el18rs 6:39cbec524483 129 }
el18rs 15:68114eae4053 130 }
el18rs 20:ad685b35a1a4 131 if(count==61) { // if gets to end of line
el18rs 6:39cbec524483 132 count = 0;
el18rs 20:ad685b35a1a4 133 lcd.drawLine(20,j,60,j,0); // clear line
el18rs 12:965b39a2e049 134 printf("line canceled!\n");
el18rs 15:68114eae4053 135 // score++;
el18rs 20:ad685b35a1a4 136 for(int x=20; x<=60; x++) {
el18rs 20:ad685b35a1a4 137 for(int y=j; y>=4; y--) {
el18rs 19:2ad31dbd5d11 138 lcd.setPixel(x,y,false);
el18rs 19:2ad31dbd5d11 139 lcd.setPixel(x,y+1); // sets pixel to the one above
el18rs 12:965b39a2e049 140 printf("line dropped!\n");
el18rs 6:39cbec524483 141 }
el18rs 6:39cbec524483 142 }
el18rs 6:39cbec524483 143 }
el18rs 15:68114eae4053 144 }
el18rs 19:2ad31dbd5d11 145 // printf("cancel line\n");
el18rs 6:39cbec524483 146
el18rs 15:68114eae4053 147 }
el18rs 6:39cbec524483 148
el18rs 15:68114eae4053 149 void TetrisGame::exit_game(N5110 &lcd)
el18rs 15:68114eae4053 150 {
el18rs 15:68114eae4053 151 lcd.clear();
el18rs 15:68114eae4053 152 lcd.printString(" GAME OVER ",0, 3);
el18rs 15:68114eae4053 153 lcd.refresh();
el18rs 15:68114eae4053 154 wait(10);
el18rs 15:68114eae4053 155 printf("game over!\n");
el18rs 15:68114eae4053 156 lcd.clear();
el18rs 15:68114eae4053 157 lcd.printString(" press RESET ",0,6);
el18rs 15:68114eae4053 158 lcd.refresh();
el18rs 15:68114eae4053 159 printf("press reset!\n");
el18rs 15:68114eae4053 160 exit(1.0);
el18rs 15:68114eae4053 161 }
el18rs 15:68114eae4053 162
el18rs 15:68114eae4053 163 void TetrisGame::fallenblocks(N5110 &lcd, int iH)
el18rs 15:68114eae4053 164 {
el18rs 15:68114eae4053 165 for (int i=0; i<=iH; i++) {
el18rs 15:68114eae4053 166 x0 = X[i];
el18rs 15:68114eae4053 167 y0 = Y[i];
el18rs 16:fca1bbb06c44 168 lcd.drawRect(x0, y0, 4, 4, FILL_BLACK);
el18rs 19:2ad31dbd5d11 169 // printf("block drawn\n");
el18rs 15:68114eae4053 170 }
el18rs 15:68114eae4053 171 }